From 7af4d1426775e78f882ed00dc119c212aec79d86 Mon Sep 17 00:00:00 2001 From: Tess Strickland Date: Tue, 2 Dec 2025 06:31:15 -0800 Subject: [PATCH] [vm,dyn_modules] Mark extension type members appropriately. TEST=pkg/vm_service/test/step_through_extension_type_method_call_test Cq-Include-Trybots: luci.dart.try:vm-dyn-linux-debug-x64-try,vm-dyn-mac-debug-arm64-try Change-Id: I3bf331e175847280964fd42eb027e9f812598bf2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/464705 Auto-Submit: Tess Strickland Commit-Queue: Alexander Markov Reviewed-by: Alexander Markov --- pkg/dart2bytecode/docs/bytecode.md | 4 ++-- pkg/dart2bytecode/lib/bytecode_generator.dart | 6 ++++++ pkg/dart2bytecode/lib/declarations.dart | 8 ++++++++ runtime/vm/bytecode_reader.cc | 10 ++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) 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);