diff --git a/pkg/dart2bytecode/docs/bytecode.md b/pkg/dart2bytecode/docs/bytecode.md index 97634cf6189..5bb89d4e215 100644 --- a/pkg/dart2bytecode/docs/bytecode.md +++ b/pkg/dart2bytecode/docs/bytecode.md @@ -524,7 +524,7 @@ type FieldDeclaration { hasGetter, hasSetter, hasInitializer, hasNontrivialInitializer, hasInitializerCode, hasSourcePositions, hasAnnotations, hasPragma, - hasCustomScript); + hasCustomScript, isExtensionTypeMember); PackedObject name; PackedObject type; @@ -557,7 +557,7 @@ type FunctionDeclaration { isAsync, isAsyncStar, isSyncStar, isNoSuchMethodForwarder, isExternal, isNative, hasSourcePositions, hasAnnotations, hasPragma, - hasCustomScript); + hasCustomScript, isExtensionTypeMember); PackedObject name; diff --git a/pkg/dart2bytecode/lib/bytecode_generator.dart b/pkg/dart2bytecode/lib/bytecode_generator.dart index 1199dcc96c3..ec88f4ae917 100644 --- a/pkg/dart2bytecode/lib/bytecode_generator.dart +++ b/pkg/dart2bytecode/lib/bytecode_generator.dart @@ -502,6 +502,9 @@ class BytecodeGenerator extends RecursiveVisitor { if (field.isExtensionMember) { flags |= FieldDeclaration.isExtensionMemberFlag; } + if (field.isExtensionTypeMember) { + flags |= FieldDeclaration.isExtensionTypeMemberFlag; + } // In NNBD libraries, static fields with initializers are implicitly late. if (field.isLate || (field.isStatic && field.initializer != null)) { flags |= FieldDeclaration.isLateFlag; @@ -569,6 +572,9 @@ class BytecodeGenerator extends RecursiveVisitor { if (member.isExtensionMember) { flags |= FunctionDeclaration.isExtensionMemberFlag; } + if (member.isExtensionTypeMember) { + flags |= FunctionDeclaration.isExtensionTypeMemberFlag; + } FunctionNode function = member.function!; if (function.requiredParameterCount != diff --git a/pkg/dart2bytecode/lib/declarations.dart b/pkg/dart2bytecode/lib/declarations.dart index 07b5b57605d..1f72bcf91a0 100644 --- a/pkg/dart2bytecode/lib/declarations.dart +++ b/pkg/dart2bytecode/lib/declarations.dart @@ -360,6 +360,7 @@ class FieldDeclaration { static const hasAnnotationsFlag = 1 << 14; static const hasPragmaFlag = 1 << 15; static const hasCustomScriptFlag = 1 << 16; + static const isExtensionTypeMemberFlag = 1 << 17; final int flags; final ObjectHandle name; @@ -475,6 +476,9 @@ class FieldDeclaration { if ((flags & isExtensionMemberFlag) != 0) { sb.write(', extension-member'); } + if ((flags & isExtensionTypeMemberFlag) != 0) { + sb.write(', extension-type-member'); + } if ((flags & hasPragmaFlag) != 0) { sb.write(', has-pragma'); } @@ -526,6 +530,7 @@ class FunctionDeclaration { static const hasAnnotationsFlag = 1 << 21; static const hasPragmaFlag = 1 << 22; static const hasCustomScriptFlag = 1 << 23; + static const isExtensionTypeMemberFlag = 1 << 24; final int flags; final ObjectHandle name; @@ -678,6 +683,9 @@ class FunctionDeclaration { if ((flags & isExtensionMemberFlag) != 0) { sb.write(', extension-member'); } + if ((flags & isExtensionTypeMemberFlag) != 0) { + sb.write(', extension-type-member'); + } if ((flags & hasOptionalPositionalParamsFlag) != 0) { sb.write(', has-optional-positional-params'); } diff --git a/runtime/vm/bytecode_reader.cc b/runtime/vm/bytecode_reader.cc index ba70b736c65..14fce3c5a78 100644 --- a/runtime/vm/bytecode_reader.cc +++ b/runtime/vm/bytecode_reader.cc @@ -1782,6 +1782,7 @@ void BytecodeReaderHelper::ReadFieldDeclarations(const Class& cls, const int kHasAnnotationsFlag = 1 << 14; const int kHasPragmaFlag = 1 << 15; const int kHasCustomScriptFlag = 1 << 16; + const int kIsExtensionTypeMemberFlag = 1 << 17; const int num_fields = reader_.ReadListLength(); if ((num_fields == 0) && !cls.is_enum_class()) { @@ -1807,6 +1808,8 @@ void BytecodeReaderHelper::ReadFieldDeclarations(const Class& cls, (flags & kHasNontrivialInitializerFlag) != 0; const bool has_pragma = (flags & kHasPragmaFlag) != 0; const bool is_extension_member = (flags & kIsExtensionMemberFlag) != 0; + const bool is_extension_type_member = + (flags & kIsExtensionTypeMemberFlag) != 0; const bool has_initializer = (flags & kHasInitializerFlag) != 0; name ^= ReadObject(); @@ -1836,6 +1839,7 @@ void BytecodeReaderHelper::ReadFieldDeclarations(const Class& cls, field.set_is_generic_covariant_impl((flags & kIsCovariantByClassFlag) != 0); field.set_has_nontrivial_initializer(has_nontrivial_initializer); field.set_is_extension_member(is_extension_member); + field.set_is_extension_type_member(is_extension_type_member); field.set_has_initializer(has_initializer); if (!has_nontrivial_initializer) { @@ -1881,6 +1885,7 @@ void BytecodeReaderHelper::ReadFieldDeclarations(const Class& cls, function.set_is_debuggable(false); function.set_accessor_field(field); function.set_is_extension_member(is_extension_member); + function.set_is_extension_type_member(is_extension_type_member); SetupFieldAccessorFunction(cls, function, type); if (is_static) { function.AttachBytecode(Object::implicit_static_getter_bytecode()); @@ -1907,6 +1912,7 @@ void BytecodeReaderHelper::ReadFieldDeclarations(const Class& cls, function.set_is_debuggable(false); function.set_accessor_field(field); function.set_is_extension_member(is_extension_member); + function.set_is_extension_type_member(is_extension_type_member); SetupFieldAccessorFunction(cls, function, type); if (is_static) { function.AttachBytecode(Object::implicit_static_setter_bytecode()); @@ -2032,6 +2038,7 @@ void BytecodeReaderHelper::ReadFunctionDeclarations(const Class& cls) { const int kHasAnnotationsFlag = 1 << 21; const int kHasPragmaFlag = 1 << 22; const int kHasCustomScriptFlag = 1 << 23; + const int kIsExtensionTypeMemberFlag = 1 << 24; const intptr_t num_functions = reader_.ReadListLength(); ASSERT(function_index_ + num_functions == functions_->Length()); @@ -2057,6 +2064,8 @@ void BytecodeReaderHelper::ReadFunctionDeclarations(const Class& cls) { const bool is_native = (flags & kIsNativeFlag) != 0; const bool has_pragma = (flags & kHasPragmaFlag) != 0; const bool is_extension_member = (flags & kIsExtensionMemberFlag) != 0; + const bool is_extension_type_member = + (flags & kIsExtensionTypeMemberFlag) != 0; name ^= ReadObject(); @@ -2106,6 +2115,7 @@ void BytecodeReaderHelper::ReadFunctionDeclarations(const Class& cls) { function.set_is_reflectable((flags & kIsReflectableFlag) != 0); function.set_is_debuggable((flags & kIsDebuggableFlag) != 0); function.set_is_extension_member(is_extension_member); + function.set_is_extension_type_member(is_extension_type_member); if ((flags & kIsSyncStarFlag) != 0) { function.set_modifier(UntaggedFunction::kSyncGen);