diff --git a/pkg/dart2wasm/lib/compile.dart b/pkg/dart2wasm/lib/compile.dart index 209ca0c20f9..2cbb7bdf8de 100644 --- a/pkg/dart2wasm/lib/compile.dart +++ b/pkg/dart2wasm/lib/compile.dart @@ -223,6 +223,7 @@ Future compileToModule( moduleStrategy = DynamicMainModuleStrategy( component, coreTypes, + target, File.fromUri(dynamicInterfaceUri).readAsStringSync(), options.dynamicInterfaceUri!); } else if (isDynamicModule) { diff --git a/pkg/dart2wasm/lib/dynamic_modules.dart b/pkg/dart2wasm/lib/dynamic_modules.dart index 5c1d8a1fd5f..616e7ea39ce 100644 --- a/pkg/dart2wasm/lib/dynamic_modules.dart +++ b/pkg/dart2wasm/lib/dynamic_modules.dart @@ -5,6 +5,7 @@ import 'package:kernel/ast.dart'; import 'package:kernel/core_types.dart'; import 'package:kernel/library_index.dart'; +import 'package:kernel/target/targets.dart' show Target; import 'package:vm/metadata/procedure_attributes.dart' show ProcedureAttributesMetadata; import 'package:vm/transformations/dynamic_interface_annotator.dart' @@ -101,6 +102,7 @@ class DynamicModuleOutputData extends ModuleOutputData { class DynamicMainModuleStrategy extends DefaultModuleStrategy with KernelNodes { @override final CoreTypes coreTypes; + final Target target; @override final LibraryIndex index; final Uri dynamicInterfaceSpecificationBaseUri; @@ -109,6 +111,7 @@ class DynamicMainModuleStrategy extends DefaultModuleStrategy with KernelNodes { DynamicMainModuleStrategy( super.component, this.coreTypes, + this.target, this.dynamicInterfaceSpecification, this.dynamicInterfaceSpecificationBaseUri) : index = coreTypes.index; @@ -117,7 +120,7 @@ class DynamicMainModuleStrategy extends DefaultModuleStrategy with KernelNodes { void prepareComponent() { // Annotate the kernel with info from dynamic interface. dynamic_interface_annotator.annotateComponent(dynamicInterfaceSpecification, - dynamicInterfaceSpecificationBaseUri, component, coreTypes); + dynamicInterfaceSpecificationBaseUri, component, coreTypes, target); _addImplicitPragmas(); _addMetadataPragmas(); } diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart index aa85f1e40e7..0b425eeecda 100644 --- a/pkg/vm/lib/kernel_front_end.dart +++ b/pkg/vm/lib/kernel_front_end.dart @@ -750,6 +750,7 @@ Future runGlobalTransformations( dynamicInterface, component, coreTypes, + target, ); } diff --git a/pkg/vm/lib/transformations/dynamic_interface_annotator.dart b/pkg/vm/lib/transformations/dynamic_interface_annotator.dart index c8582e94b34..f92935cdfaa 100644 --- a/pkg/vm/lib/transformations/dynamic_interface_annotator.dart +++ b/pkg/vm/lib/transformations/dynamic_interface_annotator.dart @@ -7,15 +7,20 @@ import 'package:front_end/src/api_prototype/dynamic_module_validator.dart' import 'package:kernel/ast.dart'; import 'package:kernel/class_hierarchy.dart' show ClassHierarchy; import 'package:kernel/core_types.dart' show CoreTypes; +import 'package:kernel/target/targets.dart' show Target; import 'pragma.dart' show + ConstantPragmaAnnotationParser, kDynModuleCanBeOverriddenPragmaName, kDynModuleCallablePragmaName, kDynModuleExtendablePragmaName, kDynModuleImplicitlyCallablePragmaName, kDynModuleImplicitlyExtendablePragmaName, - kDynModuleCanBeOverriddenImplicitlyPragmaName; + kDynModuleCanBeOverriddenImplicitlyPragmaName, + ParsedDynModuleLanguageImplCanBeOverriddenPragma, + ParsedDynModuleLanguageImplCallablePragma, + ParsedDynModuleLanguageImplExtendablePragma; const bool _debug = false; @@ -29,6 +34,7 @@ void annotateComponent( Uri baseUri, Component component, CoreTypes coreTypes, + Target target, ) { final spec = DynamicInterfaceSpecification( dynamicInterfaceSpecification, @@ -36,6 +42,13 @@ void annotateComponent( component, ); + discoverLanguageImplPragmasInCoreLibraries( + spec, + component, + coreTypes, + target, + ); + final extendableAnnotator = annotateNodes( spec.extendable, kDynModuleExtendablePragmaName, @@ -64,7 +77,6 @@ void annotateComponent( ); final hierarchy = ClassHierarchy(component, coreTypes); - pragmaConstant(coreTypes, kDynModuleCanBeOverriddenImplicitlyPragmaName); _ImplicitOverridesAnnotator( pragmaConstant(coreTypes, kDynModuleCanBeOverriddenImplicitlyPragmaName), hierarchy, @@ -581,3 +593,55 @@ class _ClassInfo { static bool _isSetter(Member m) => m is Procedure && m.isSetter; } + +void discoverLanguageImplPragmasInCoreLibraries( + DynamicInterfaceSpecification spec, + Component component, + CoreTypes coreTypes, + Target target, +) { + final pragmaParser = ConstantPragmaAnnotationParser(coreTypes, target); + final visitor = _DiscoverLanguageImplPragmasVisitor(spec, pragmaParser); + for (final lib in component.libraries) { + if (lib.importUri.isScheme('dart')) { + visitor.visitLibrary(lib); + } + } +} + +class _DiscoverLanguageImplPragmasVisitor extends RecursiveVisitor { + final DynamicInterfaceSpecification spec; + final ConstantPragmaAnnotationParser parser; + + _DiscoverLanguageImplPragmasVisitor(this.spec, this.parser); + + @override + void visitClass(Class node) { + for (final annotation in node.annotations) { + final pragma = parser.parsePragma(annotation); + switch (pragma) { + case ParsedDynModuleLanguageImplExtendablePragma(): + spec.extendable.add(node); + case ParsedDynModuleLanguageImplCallablePragma(): + spec.callable.add(node); + } + } + node.visitChildren(this); + } + + @override + void defaultMember(Member node) { + for (final annotation in node.annotations) { + final pragma = parser.parsePragma(annotation); + switch (pragma) { + case ParsedDynModuleLanguageImplCallablePragma(): + spec.callable.add(node); + case ParsedDynModuleLanguageImplCanBeOverriddenPragma(): + if (!node.isInstanceMember) { + throw 'Expected instance member $node'; + } + spec.canBeOverridden.add(node); + } + } + } +} diff --git a/pkg/vm/lib/transformations/pragma.dart b/pkg/vm/lib/transformations/pragma.dart index bb5b2c4905a..900213755c3 100644 --- a/pkg/vm/lib/transformations/pragma.dart +++ b/pkg/vm/lib/transformations/pragma.dart @@ -31,6 +31,12 @@ const kDynModuleCanBeOverriddenImplicitlyPragmaName = const kDynModuleCallablePragmaName = "dyn-module:callable"; const kDynModuleImplicitlyCallablePragmaName = "dyn-module:implicitly-callable"; const kDynModuleEntryPointPragmaName = "dyn-module:entry-point"; +const kDynModuleLanguageImplExtendablePragmaName = + "dyn-module:language-impl:extendable"; +const kDynModuleLanguageImplCanBeOverriddenPragmaName = + "dyn-module:language-impl:can-be-overridden"; +const kDynModuleLanguageImplCallablePragmaName = + "dyn-module:language-impl:callable"; abstract class ParsedPragma {} @@ -85,6 +91,18 @@ class ParsedDynModuleEntryPointPragma implements ParsedPragma { const ParsedDynModuleEntryPointPragma(); } +class ParsedDynModuleLanguageImplExtendablePragma implements ParsedPragma { + const ParsedDynModuleLanguageImplExtendablePragma(); +} + +class ParsedDynModuleLanguageImplCanBeOverriddenPragma implements ParsedPragma { + const ParsedDynModuleLanguageImplCanBeOverriddenPragma(); +} + +class ParsedDynModuleLanguageImplCallablePragma implements ParsedPragma { + const ParsedDynModuleLanguageImplCallablePragma(); +} + abstract class PragmaAnnotationParser { /// May return 'null' if the annotation does not represent a recognized /// @pragma. @@ -222,6 +240,12 @@ class ConstantPragmaAnnotationParser implements PragmaAnnotationParser { return getEntryPointTypeFromOptions(options, pragmaName); case kDynModuleEntryPointPragmaName: return const ParsedDynModuleEntryPointPragma(); + case kDynModuleLanguageImplExtendablePragmaName: + return const ParsedDynModuleLanguageImplExtendablePragma(); + case kDynModuleLanguageImplCanBeOverriddenPragmaName: + return const ParsedDynModuleLanguageImplCanBeOverriddenPragma(); + case kDynModuleLanguageImplCallablePragmaName: + return const ParsedDynModuleLanguageImplCallablePragma(); default: return null; } diff --git a/pkg/vm/test/transformations/dynamic_interface_annotator_test.dart b/pkg/vm/test/transformations/dynamic_interface_annotator_test.dart index ed1073729c5..ed610b7522b 100644 --- a/pkg/vm/test/transformations/dynamic_interface_annotator_test.dart +++ b/pkg/vm/test/transformations/dynamic_interface_annotator_test.dart @@ -34,6 +34,7 @@ runTestCase(Uri testCaseDir) async { dynamicInterface, component, coreTypes, + target, ); for (final lib in component.libraries) { diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect index 393f8876faf..ab2f124444e 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect @@ -91,7 +91,7 @@ class A extends core::Object { [@vm.closure-id=7] synthetic constructor •() → self::A - : self::A::literal1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0), self::A::literal2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal3(1, 2, 3), self::A::filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0), self::A::filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::filled(2, 0), self::A::filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0), self::A::filledFactory4 = let final core::bool #t1 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, 0, #t1), self::A::filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2), self::A::filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(2), self::A::filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2), self::A::filledFactory8 = let final core::bool #t2 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, null, #t2), self::A::filledFactory9 = let final core::int #t3 = 2 in let final core::bool #t4 = true in [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(#t3), self::A::filledFactory10 = let final core::int #t5 = 2 in let final core::bool #t6 = false in [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(#t5), self::A::generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, [@vm.closure-id=1](core::int i) → core::int => i), self::A::generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, [@vm.closure-id=2](core::int i) → core::int => i), self::A::generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::generate(2, [@vm.closure-id=3](core::int i) → core::int => i), self::A::generateFactory4 = let final (core::int) → core::int #t7 = [@vm.closure-id=4](core::int i) → core::int => i in let final core::bool #t8 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate(#t7, #t8), self::A::generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList>] core::_GrowableList::generate>(2, [@vm.closure-id=5](wildcard core::int _#wc0#formal) → core::List => [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0)), self::A::generateFactory6 = let final core::int #t9 = 2 in let final core::bool #t10 = true in [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(#t9, [@vm.closure-id=6](core::int i) → core::int => i), self::A::generateFactory7 = let final core::int #t11 = 2 in let final core::bool #t12 = false in [@vm.inferred-type.metadata=dart.core::_List] core::_List::generate(#t11, [@vm.closure-id=7](core::int i) → core::int => i), super core::Object::•() + : self::A::literal1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0), self::A::literal2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal3(1, 2, 3), self::A::filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0), self::A::filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::filled(2, 0), self::A::filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0), self::A::filledFactory4 = let final core::bool #t1 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, 0, #t1), self::A::filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2), self::A::filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(2), self::A::filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2), self::A::filledFactory8 = let final core::bool #t2 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, null, #t2), self::A::filledFactory9 = let final core::int #t3 = 2 in let final core::bool #t4 = true in [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(#t3), self::A::filledFactory10 = let final core::int #t5 = 2 in let final core::bool #t6 = false in [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(#t5), self::A::generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, [@vm.closure-id=1](core::int i) → core::int => i), self::A::generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, [@vm.closure-id=2](core::int i) → core::int => i), self::A::generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::generate([@vm.closure-id=3](core::int i) → core::int => i), self::A::generateFactory4 = let final (core::int) → core::int #t7 = [@vm.closure-id=4](core::int i) → core::int => i in let final core::bool #t8 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate(#t7, #t8), self::A::generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList>] core::_GrowableList::generate>(2, [@vm.closure-id=5](wildcard core::int _#wc0#formal) → core::List => [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0)), self::A::generateFactory6 = let final core::int #t9 = 2 in let final core::bool #t10 = true in [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(#t9, [@vm.closure-id=6](core::int i) → core::int => i), self::A::generateFactory7 = let final core::int #t11 = 2 in let final core::bool #t12 = false in [@vm.inferred-type.metadata=dart.core::_List] core::_List::generate([@vm.closure-id=7](core::int i) → core::int => i), super core::Object::•() ; } diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect index 06db3e16cdf..17e48318bf7 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect @@ -76,7 +76,7 @@ class B extends self::A { [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=(i,i,i,i)->b] no-such-method-forwarder method bazz([@vm.inferred-arg-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-arg-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-arg-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [@vm.inferred-arg-type.metadata=dart.core::_Smi (value: 4)] dynamic a4) → dynamic - return _in::unsafeCast([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C2, [@vm.inferred-type.metadata=dart.core::_ImmutableList] core::List::unmodifiable([@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal5(a1, a2, a3, a4, #C7)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable(#C4))){(core::Invocation) → dynamic}); + return _in::unsafeCast([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C2, [@vm.inferred-type.metadata=dart.core::_ImmutableList] core::List::unmodifiable([@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal5()), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable(#C4))){(core::Invocation) → dynamic}); } abstract class C extends core::Object { synthetic constructor •() → self::C @@ -109,7 +109,7 @@ class D extends self::C implements self::A { [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=(i,i,i,i)->b] no-such-method-forwarder method bazz([@vm.inferred-arg-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-arg-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-arg-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [@vm.inferred-arg-type.metadata=dart.core::_Smi (value: 4)] dynamic a4) → dynamic - return _in::unsafeCast([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C2, [@vm.inferred-type.metadata=dart.core::_ImmutableList] core::List::unmodifiable([@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal5(a1, a2, a3, a4, #C7)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable(#C4))){(core::Invocation) → dynamic}); + return _in::unsafeCast([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C2, [@vm.inferred-type.metadata=dart.core::_ImmutableList] core::List::unmodifiable([@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal5()), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable(#C4))){(core::Invocation) → dynamic}); } class E extends core::Object implements self::A { synthetic constructor •() → self::E diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h index e5c9e3c6344..9a8a205347c 100644 --- a/runtime/vm/compiler/recognized_methods_list.h +++ b/runtime/vm/compiler/recognized_methods_list.h @@ -15,7 +15,7 @@ namespace dart { V(AsyncLibrary, _FutureListener, handleValue, FutureListenerHandleValue, \ 0xaa83f1d2) \ V(AsyncLibrary, _SuspendState, get:_functionData, \ - SuspendState_getFunctionData, 0x79c36a6d) \ + SuspendState_getFunctionData, 0x79c36e2e) \ V(AsyncLibrary, _SuspendState, set:_functionData, \ SuspendState_setFunctionData, 0x3299d0aa) \ V(AsyncLibrary, _SuspendState, get:_thenCallback, \ diff --git a/sdk/lib/_internal/vm/lib/array.dart b/sdk/lib/_internal/vm/lib/array.dart index 257ed04d768..3cf9551caf3 100644 --- a/sdk/lib/_internal/vm/lib/array.dart +++ b/sdk/lib/_internal/vm/lib/array.dart @@ -87,18 +87,18 @@ class _List extends _Array { ]) @pragma("vm:prefer-inline") @pragma("vm:external-name", "List_allocate") - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') external factory _List(length); // Specialization of List.empty constructor for growable == false. // Used by pkg/vm/lib/transformations/list_factory_specializer.dart. @pragma("vm:prefer-inline") - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _List.empty() => _List(0); // Specialization of List.filled constructor for growable == false. // Used by pkg/vm/lib/transformations/list_factory_specializer.dart. - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _List.filled(int length, E fill) { final result = _List(length); if (fill != null) { @@ -112,7 +112,7 @@ class _List extends _Array { // Specialization of List.generate constructor for growable == false. // Used by pkg/vm/lib/transformations/list_factory_specializer.dart. @pragma("vm:prefer-inline") - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _List.generate(int length, E generator(int index)) { final result = _List(length); for (int i = 0; i < result.length; ++i) { diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart index 229bd489b32..062899c8e23 100644 --- a/sdk/lib/_internal/vm/lib/async_patch.dart +++ b/sdk/lib/_internal/vm/lib/async_patch.dart @@ -22,6 +22,7 @@ external _fatal(msg); external void _trySetStackTrace(Object error, StackTrace stackTrace); // This function is used when lowering `await for` statements. +@pragma('dyn-module:language-impl:callable') void _asyncStarMoveNextHelper(var stream) { if (stream is! _StreamImpl) { return; @@ -480,6 +481,7 @@ class _SuspendState { @pragma("vm:recognized", "other") @pragma("vm:prefer-inline") + @pragma('dyn-module:language-impl:callable') external Object get _functionData; @pragma("vm:recognized", "other") diff --git a/sdk/lib/_internal/vm/lib/growable_array.dart b/sdk/lib/_internal/vm/lib/growable_array.dart index 9669dd5bea4..c512cc32a29 100644 --- a/sdk/lib/_internal/vm/lib/growable_array.dart +++ b/sdk/lib/_internal/vm/lib/growable_array.dart @@ -93,7 +93,7 @@ class _GrowableList extends ListBase { return result; } - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList(int length) { var data = _allocateData(length); var result = new _GrowableList._withData(data); @@ -111,7 +111,7 @@ class _GrowableList extends ListBase { // Specialization of List.empty constructor for growable == true. // Used by pkg/vm/lib/transformations/list_factory_specializer.dart. @pragma("vm:prefer-inline") - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList.empty() { // Specialization of `return _GrowableList(0);`. return _GrowableList._withData(_emptyList); @@ -119,7 +119,7 @@ class _GrowableList extends ListBase { // Specialization of List.filled constructor for growable == true. // Used by pkg/vm/lib/transformations/list_factory_specializer.dart. - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList.filled(int length, T fill) { final result = _GrowableList(length); if (fill != null) { @@ -133,7 +133,7 @@ class _GrowableList extends ListBase { // Specialization of List.generate constructor for growable == true. // Used by pkg/vm/lib/transformations/list_factory_specializer.dart. @pragma("vm:prefer-inline") - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList.generate(int length, T generator(int index)) { final result = _GrowableList(length); for (int i = 0; i < result.length; ++i) { @@ -563,7 +563,7 @@ class _GrowableList extends ListBase { // Specialized list literal constructors. // Used by pkg/vm/lib/transformations/list_literals_lowering.dart. - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList._literal1(T e0) { _List elements = _List(1); elements[0] = e0; @@ -572,7 +572,7 @@ class _GrowableList extends ListBase { return result; } - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList._literal2(T e0, T e1) { _List elements = _List(2); elements[0] = e0; @@ -582,7 +582,7 @@ class _GrowableList extends ListBase { return result; } - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList._literal3(T e0, T e1, T e2) { _List elements = _List(3); elements[0] = e0; @@ -593,7 +593,7 @@ class _GrowableList extends ListBase { return result; } - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList._literal4(T e0, T e1, T e2, T e3) { _List elements = _List(4); elements[0] = e0; @@ -605,7 +605,7 @@ class _GrowableList extends ListBase { return result; } - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList._literal5(T e0, T e1, T e2, T e3, T e4) { _List elements = _List(5); elements[0] = e0; @@ -618,7 +618,7 @@ class _GrowableList extends ListBase { return result; } - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList._literal6(T e0, T e1, T e2, T e3, T e4, T e5) { _List elements = _List(6); elements[0] = e0; @@ -632,7 +632,7 @@ class _GrowableList extends ListBase { return result; } - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList._literal7(T e0, T e1, T e2, T e3, T e4, T e5, T e6) { _List elements = _List(7); elements[0] = e0; @@ -647,7 +647,7 @@ class _GrowableList extends ListBase { return result; } - @pragma('dyn-module:callable') + @pragma('dyn-module:language-impl:callable') factory _GrowableList._literal8( T e0, T e1, diff --git a/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart b/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart index 19785a7bcd6..ee820e6f028 100644 --- a/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart +++ b/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart @@ -7,6 +7,7 @@ part of "core_patch.dart"; // NOTE: When making changes to this class, please also update // `VmTarget.instantiateInvocation` and `VmTarget._invocationType` in // `pkg/kernel/lib/target/vm.dart`. +@pragma('dyn-module:language-impl:callable') class _InvocationMirror implements Invocation { // Constants describing the invocation kind. // _FIELD cannot be generated by regular invocation mirrors. @@ -52,6 +53,7 @@ class _InvocationMirror implements Invocation { List? _positionalArguments; Map? _namedArguments; + @pragma('dyn-module:language-impl:callable') _InvocationMirror._withType( this._memberName, int? type, diff --git a/sdk/lib/_internal/vm_shared/lib/compact_hash.dart b/sdk/lib/_internal/vm_shared/lib/compact_hash.dart index 89546c44412..3a0e066d0b5 100644 --- a/sdk/lib/_internal/vm_shared/lib/compact_hash.dart +++ b/sdk/lib/_internal/vm_shared/lib/compact_hash.dart @@ -376,6 +376,7 @@ external List get _uninitializedData; // VM-internalized implementation of a default-constructed LinkedHashMap. Map // literals also create instances of this class. @pragma("vm:entry-point") +@pragma('dyn-module:language-impl:callable') base class _Map extends _HashVMBase with MapMixin, @@ -383,6 +384,7 @@ base class _Map extends _HashVMBase _OperatorEqualsAndHashCode, _LinkedHashMapMixin implements LinkedHashMap { + @pragma('dyn-module:language-impl:callable') _Map() { _index = _uninitializedIndex; _hashMask = _HashBase._UNINITIALIZED_HASH_MASK; @@ -854,7 +856,7 @@ class _CompactIterator implements Iterator { E? _current; _CompactIterator(this._table, this._data, this._len, this._offset, this._step) - : _checkSum = _table._checkSum; + : _checkSum = _table._checkSum; bool moveNext() { if (_table._isModifiedSince(_data, _checkSum)) { @@ -903,7 +905,7 @@ class _CompactEntriesIterator implements Iterator> { MapEntry? _current; _CompactEntriesIterator(this._table, this._data, this._len) - : _checkSum = _table._checkSum; + : _checkSum = _table._checkSum; bool moveNext() { if (_table._isModifiedSince(_data, _checkSum)) { @@ -1162,6 +1164,7 @@ mixin _LinkedHashSetMixin on _HashBase, _EqualsAndHashCode { // Set implementation, analogous to _Map. Set literals create instances of this // class. @pragma("vm:entry-point") +@pragma('dyn-module:language-impl:callable') base class _Set extends _HashVMBase with SetMixin, @@ -1169,6 +1172,7 @@ base class _Set extends _HashVMBase _OperatorEqualsAndHashCode, _LinkedHashSetMixin implements LinkedHashSet { + @pragma('dyn-module:language-impl:callable') _Set() { _index = _uninitializedIndex; _hashMask = _HashBase._UNINITIALIZED_HASH_MASK; @@ -1322,8 +1326,9 @@ base class CompactLinkedCustomHashSet extends _HashFieldBase ) : _validKey = validKey ?? TypeTest().test; Set cast() => Set.castFrom(this); - Set toSet() => CompactLinkedCustomHashSet(_equality, _hasher, _validKey) - ..addAll(this); + Set toSet() => + CompactLinkedCustomHashSet(_equality, _hasher, _validKey) + ..addAll(this); } /// Expose [_Map] as [DefaultMap] and [_Set] as [DefaultSet] so that diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart index acc04c12264..2f43d389c2c 100644 --- a/sdk/lib/async/stream_impl.dart +++ b/sdk/lib/async/stream_impl.dart @@ -969,6 +969,7 @@ class _BroadcastSubscriptionWrapper implements StreamSubscription { /// Simple implementation of [StreamIterator]. /// /// Pauses the stream between calls to [moveNext]. +@pragma('dyn-module:language-impl:callable') class _StreamIterator implements StreamIterator { // The stream iterator is always in one of five states. // The value of the [_stateData] field depends on the state. @@ -1005,6 +1006,7 @@ class _StreamIterator implements StreamIterator { /// Subscription being listened to. /// /// Set to `null` when the stream subscription is done or canceled. + @pragma('dyn-module:language-impl:callable') StreamSubscription? _subscription; /// Data value depending on the current state. @@ -1029,6 +1031,7 @@ class _StreamIterator implements StreamIterator { @pragma("vm:entry-point") bool _hasValue = false; + @pragma('dyn-module:language-impl:callable') _StreamIterator(final Stream stream) : _stateData = checkNotNullable(stream, "stream"); diff --git a/sdk/lib/core/enum.dart b/sdk/lib/core/enum.dart index c09c897bb1c..e80966d4ca0 100644 --- a/sdk/lib/core/enum.dart +++ b/sdk/lib/core/enum.dart @@ -100,9 +100,14 @@ abstract interface class Enum { } /// Superclass of all enum class implementations. +@pragma('dyn-module:language-impl:extendable') abstract class _Enum implements Enum { final int index; + + @pragma('dyn-module:language-impl:callable') final String _name; + + @pragma('dyn-module:language-impl:callable') const _Enum(this.index, this._name); /// The result of [toString]. @@ -110,6 +115,7 @@ abstract class _Enum implements Enum { /// Each enum class can override this method to provide the /// string returned by toString, rather than overriding toString itself. @Since("2.19") + @pragma('dyn-module:language-impl:can-be-overridden') String _enumToString(); @override diff --git a/utils/dynamic_module_runner/dynamic_interface.yaml b/utils/dynamic_module_runner/dynamic_interface.yaml index 649c0b64c7c..edbbf296a35 100644 --- a/utils/dynamic_module_runner/dynamic_interface.yaml +++ b/utils/dynamic_module_runner/dynamic_interface.yaml @@ -4,46 +4,9 @@ extendable: - library: 'dart:*' - - library: 'dart:core' - class: '_Enum' can-be-overridden: - library: 'dart:*' - - library: 'dart:core' - class: '_Enum' - member: '_enumToString' callable: - library: 'dart:*' - # These private classes and members are used directly by the compiler. - - library: 'dart:core' - class: '_Enum' - member: '' - - library: 'dart:core' - class: '_InvocationMirror' - - library: 'dart:core' - class: '_InvocationMirror' - member: '_withType' - - library: 'dart:_compact_hash' - class: '_Map' - - library: 'dart:_compact_hash' - class: '_Map' - member: '' - - library: 'dart:_compact_hash' - class: '_Set' - - library: 'dart:_compact_hash' - class: '_Set' - member: '' - - library: 'dart:async' - class: '_StreamIterator' - - library: 'dart:async' - class: '_StreamIterator' - member: '' - - library: 'dart:async' - class: '_StreamIterator' - member: '_subscription' - - library: 'dart:async' - class: '_SuspendState' - member: 'get:_functionData' - - library: 'dart:async' - member: '_asyncStarMoveNextHelper'