[dynamic modules] Add pragmas to core library classes and members used to implement language features
This change adds pragmas which can be used in dart:* libraries to
specify classes and members which are used by the compiler
to implement certain language features. Compiler can insert
references to those classes and members when desugaring language
constructs, so dynamic module code can use these classes and members
implicitly even if they are private.
Previously, we required to specify these members in the
dynamic_interface.yaml before dynamic modules could use them.
However, this is cumbersome and error-prone.
Now, the following pragmas are recognized:
@pragma('dyn-module:language-impl:extendable')
@pragma('dyn-module:language-impl:can-be-overridden')
@pragma('dyn-module:language-impl:callable')
If dynamic interface yaml file is specified during compilation,
then classes/members annotated with these pragmas are treated as if
they are used in corresponding sections of dynamic_interface.yaml.
If dynamic interface yaml file is not specified, these pragmas
are ignored.
Bug: b/395992622
TEST=existing
CoreLibraryReviewExempt: no API changes, only adding pragmas.
Change-Id: I6606467fc5e5264a2565d7eb8e8baccc2eebea84
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/418663
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
This commit is contained in:
committed by
Commit Queue
parent
0c422d6d61
commit
733ca506c1
@@ -223,6 +223,7 @@ Future<CompilationResult> compileToModule(
|
||||
moduleStrategy = DynamicMainModuleStrategy(
|
||||
component,
|
||||
coreTypes,
|
||||
target,
|
||||
File.fromUri(dynamicInterfaceUri).readAsStringSync(),
|
||||
options.dynamicInterfaceUri!);
|
||||
} else if (isDynamicModule) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -750,6 +750,7 @@ Future runGlobalTransformations(
|
||||
dynamicInterface,
|
||||
component,
|
||||
coreTypes,
|
||||
target,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ runTestCase(Uri testCaseDir) async {
|
||||
dynamicInterface,
|
||||
component,
|
||||
coreTypes,
|
||||
target,
|
||||
);
|
||||
|
||||
for (final lib in component.libraries) {
|
||||
|
||||
@@ -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<dart.core::int>] core::_GrowableList::•<core::int>(0), self::A::literal2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::_literal3<core::int>(1, 2, 3), self::A::filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] core::_List::filled<core::int>(2, 0), self::A::filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::filled<core::int>(2, 0), self::A::filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] core::_List::filled<core::int>(2, 0), self::A::filledFactory4 = let final core::bool #t1 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int>(2, 0, #t1), self::A::filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int?>] core::_List::•<core::int?>(2), self::A::filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int?>] core::_GrowableList::•<core::int?>(2), self::A::filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int?>] core::_List::•<core::int?>(2), self::A::filledFactory8 = let final core::bool #t2 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int?>(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<dart.core::int?>] core::_GrowableList::•<core::int?>(#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<dart.core::int?>] core::_List::•<core::int?>(#t5), self::A::generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::generate<core::int>(2, [@vm.closure-id=1](core::int i) → core::int => i), self::A::generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::generate<core::int>(2, [@vm.closure-id=2](core::int i) → core::int => i), self::A::generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] core::_List::generate<core::int>(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<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate<core::int>(#t7, #t8), self::A::generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::List<dart.core::int>>] core::_GrowableList::generate<core::List<core::int>>(2, [@vm.closure-id=5](wildcard core::int _#wc0#formal) → core::List<core::int> => [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::•<core::int>(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<dart.core::int>] core::_GrowableList::generate<core::int>(#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<dart.core::int>] core::_List::generate<core::int>(#t11, [@vm.closure-id=7](core::int i) → core::int => i), super core::Object::•()
|
||||
: self::A::literal1 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::•<core::int>(0), self::A::literal2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::_literal3<core::int>(1, 2, 3), self::A::filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] core::_List::filled<core::int>(2, 0), self::A::filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::filled<core::int>(2, 0), self::A::filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] core::_List::filled<core::int>(2, 0), self::A::filledFactory4 = let final core::bool #t1 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int>(2, 0, #t1), self::A::filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int?>] core::_List::•<core::int?>(2), self::A::filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int?>] core::_GrowableList::•<core::int?>(2), self::A::filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int?>] core::_List::•<core::int?>(2), self::A::filledFactory8 = let final core::bool #t2 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int?>(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<dart.core::int?>] core::_GrowableList::•<core::int?>(#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<dart.core::int?>] core::_List::•<core::int?>(#t5), self::A::generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::generate<core::int>(2, [@vm.closure-id=1](core::int i) → core::int => i), self::A::generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::generate<core::int>(2, [@vm.closure-id=2](core::int i) → core::int => i), self::A::generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] core::_List::generate<core::int>([@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<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate<core::int>(#t7, #t8), self::A::generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::List<dart.core::int>>] core::_GrowableList::generate<core::List<core::int>>(2, [@vm.closure-id=5](wildcard core::int _#wc0#formal) → core::List<core::int> => [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::•<core::int>(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<dart.core::int>] core::_GrowableList::generate<core::int>(#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<dart.core::int>] core::_List::generate<core::int>([@vm.closure-id=7](core::int i) → core::int => i), super core::Object::•()
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@@ -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<dynamic>([@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<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal5<dynamic>(a1, a2, a3, a4, #C7)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C4))){(core::Invocation) → dynamic});
|
||||
return _in::unsafeCast<dynamic>([@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<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal5<dynamic>()), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#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<dynamic>([@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<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal5<dynamic>(a1, a2, a3, a4, #C7)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C4))){(core::Invocation) → dynamic});
|
||||
return _in::unsafeCast<dynamic>([@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<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal5<dynamic>()), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C4))){(core::Invocation) → dynamic});
|
||||
}
|
||||
class E extends core::Object implements self::A {
|
||||
synthetic constructor •() → self::E
|
||||
|
||||
@@ -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, \
|
||||
|
||||
@@ -87,18 +87,18 @@ class _List<E> extends _Array<E> {
|
||||
])
|
||||
@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<E>(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<E>(length);
|
||||
if (fill != null) {
|
||||
@@ -112,7 +112,7 @@ class _List<E> extends _Array<E> {
|
||||
// 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<E>(length);
|
||||
for (int i = 0; i < result.length; ++i) {
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -93,7 +93,7 @@ class _GrowableList<T> extends ListBase<T> {
|
||||
return result;
|
||||
}
|
||||
|
||||
@pragma('dyn-module:callable')
|
||||
@pragma('dyn-module:language-impl:callable')
|
||||
factory _GrowableList(int length) {
|
||||
var data = _allocateData(length);
|
||||
var result = new _GrowableList<T>._withData(data);
|
||||
@@ -111,7 +111,7 @@ class _GrowableList<T> extends ListBase<T> {
|
||||
// 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<T>._withData(_emptyList);
|
||||
@@ -119,7 +119,7 @@ class _GrowableList<T> extends ListBase<T> {
|
||||
|
||||
// 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<T>(length);
|
||||
if (fill != null) {
|
||||
@@ -133,7 +133,7 @@ class _GrowableList<T> extends ListBase<T> {
|
||||
// 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<T>(length);
|
||||
for (int i = 0; i < result.length; ++i) {
|
||||
@@ -563,7 +563,7 @@ class _GrowableList<T> extends ListBase<T> {
|
||||
|
||||
// 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<T> extends ListBase<T> {
|
||||
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<T> extends ListBase<T> {
|
||||
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<T> extends ListBase<T> {
|
||||
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<T> extends ListBase<T> {
|
||||
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<T> extends ListBase<T> {
|
||||
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<T> extends ListBase<T> {
|
||||
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<T> extends ListBase<T> {
|
||||
return result;
|
||||
}
|
||||
|
||||
@pragma('dyn-module:callable')
|
||||
@pragma('dyn-module:language-impl:callable')
|
||||
factory _GrowableList._literal8(
|
||||
T e0,
|
||||
T e1,
|
||||
|
||||
@@ -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<Object?>? _positionalArguments;
|
||||
Map<Symbol, Object?>? _namedArguments;
|
||||
|
||||
@pragma('dyn-module:language-impl:callable')
|
||||
_InvocationMirror._withType(
|
||||
this._memberName,
|
||||
int? type,
|
||||
|
||||
@@ -376,6 +376,7 @@ external List<Object?> 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<K, V> extends _HashVMBase
|
||||
with
|
||||
MapMixin<K, V>,
|
||||
@@ -383,6 +384,7 @@ base class _Map<K, V> extends _HashVMBase
|
||||
_OperatorEqualsAndHashCode,
|
||||
_LinkedHashMapMixin<K, V>
|
||||
implements LinkedHashMap<K, V> {
|
||||
@pragma('dyn-module:language-impl:callable')
|
||||
_Map() {
|
||||
_index = _uninitializedIndex;
|
||||
_hashMask = _HashBase._UNINITIALIZED_HASH_MASK;
|
||||
@@ -854,7 +856,7 @@ class _CompactIterator<E> implements Iterator<E> {
|
||||
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<K, V> implements Iterator<MapEntry<K, V>> {
|
||||
MapEntry<K, V>? _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<E> 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<E> extends _HashVMBase
|
||||
with
|
||||
SetMixin<E>,
|
||||
@@ -1169,6 +1172,7 @@ base class _Set<E> extends _HashVMBase
|
||||
_OperatorEqualsAndHashCode,
|
||||
_LinkedHashSetMixin<E>
|
||||
implements LinkedHashSet<E> {
|
||||
@pragma('dyn-module:language-impl:callable')
|
||||
_Set() {
|
||||
_index = _uninitializedIndex;
|
||||
_hashMask = _HashBase._UNINITIALIZED_HASH_MASK;
|
||||
@@ -1322,8 +1326,9 @@ base class CompactLinkedCustomHashSet<E> extends _HashFieldBase
|
||||
) : _validKey = validKey ?? TypeTest<E>().test;
|
||||
|
||||
Set<R> cast<R>() => Set.castFrom<E, R>(this);
|
||||
Set<E> toSet() => CompactLinkedCustomHashSet<E>(_equality, _hasher, _validKey)
|
||||
..addAll(this);
|
||||
Set<E> toSet() =>
|
||||
CompactLinkedCustomHashSet<E>(_equality, _hasher, _validKey)
|
||||
..addAll(this);
|
||||
}
|
||||
|
||||
/// Expose [_Map] as [DefaultMap] and [_Set] as [DefaultSet] so that
|
||||
|
||||
@@ -969,6 +969,7 @@ class _BroadcastSubscriptionWrapper<T> implements StreamSubscription<T> {
|
||||
/// Simple implementation of [StreamIterator].
|
||||
///
|
||||
/// Pauses the stream between calls to [moveNext].
|
||||
@pragma('dyn-module:language-impl:callable')
|
||||
class _StreamIterator<T> implements StreamIterator<T> {
|
||||
// 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<T> implements StreamIterator<T> {
|
||||
/// Subscription being listened to.
|
||||
///
|
||||
/// Set to `null` when the stream subscription is done or canceled.
|
||||
@pragma('dyn-module:language-impl:callable')
|
||||
StreamSubscription<T>? _subscription;
|
||||
|
||||
/// Data value depending on the current state.
|
||||
@@ -1029,6 +1031,7 @@ class _StreamIterator<T> implements StreamIterator<T> {
|
||||
@pragma("vm:entry-point")
|
||||
bool _hasValue = false;
|
||||
|
||||
@pragma('dyn-module:language-impl:callable')
|
||||
_StreamIterator(final Stream<T> stream)
|
||||
: _stateData = checkNotNullable(stream, "stream");
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user