mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:17:14 +00:00
[kernel,vm] Migrate first part of vm transformations
Since the VM package isn't opted in, the individual libraries have been annotated with `@dart=2.12` to opt in to null safety. TEST=existing Change-Id: I0bfbcf69cb80d32bb6b80a171f7bdb62fde7ca65 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/195277 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Aske Simon Christensen <askesc@google.com>
This commit is contained in:
parent
a11d9f17fb
commit
b8bc0dd751
|
@ -119,8 +119,8 @@ class CoreTypes {
|
|||
CoreTypes(Component component)
|
||||
: index = new LibraryIndex.coreLibraries(component);
|
||||
|
||||
late final Procedure asyncErrorWrapperHelperProcedure = index
|
||||
.getTopLevelMember('dart:async', '_asyncErrorWrapperHelper') as Procedure;
|
||||
late final Procedure asyncErrorWrapperHelperProcedure =
|
||||
index.getTopLevelProcedure('dart:async', '_asyncErrorWrapperHelper');
|
||||
|
||||
late final Library asyncLibrary = index.getLibrary('dart:async');
|
||||
|
||||
|
@ -139,33 +139,33 @@ class CoreTypes {
|
|||
late final Member asyncStarStreamControllerClose =
|
||||
index.getMember('dart:async', '_AsyncStarStreamController', 'close');
|
||||
|
||||
late final Constructor asyncStarStreamControllerDefaultConstructor = index
|
||||
.getMember('dart:async', '_AsyncStarStreamController', '') as Constructor;
|
||||
late final Constructor asyncStarStreamControllerDefaultConstructor =
|
||||
index.getConstructor('dart:async', '_AsyncStarStreamController', '');
|
||||
|
||||
late final Member asyncStarStreamControllerStream =
|
||||
index.getMember('dart:async', '_AsyncStarStreamController', 'get:stream');
|
||||
|
||||
late final Procedure asyncStarMoveNextHelper = index.getTopLevelMember(
|
||||
'dart:async', '_asyncStarMoveNextHelper') as Procedure;
|
||||
late final Procedure asyncStarMoveNextHelper =
|
||||
index.getTopLevelProcedure('dart:async', '_asyncStarMoveNextHelper');
|
||||
|
||||
late final Procedure asyncThenWrapperHelperProcedure = index
|
||||
.getTopLevelMember('dart:async', '_asyncThenWrapperHelper') as Procedure;
|
||||
late final Procedure asyncThenWrapperHelperProcedure =
|
||||
index.getTopLevelProcedure('dart:async', '_asyncThenWrapperHelper');
|
||||
|
||||
late final Procedure awaitHelperProcedure =
|
||||
index.getTopLevelMember('dart:async', '_awaitHelper') as Procedure;
|
||||
index.getTopLevelProcedure('dart:async', '_awaitHelper');
|
||||
|
||||
late final Class boolClass = index.getClass('dart:core', 'bool');
|
||||
|
||||
late final Class futureImplClass = index.getClass('dart:async', '_Future');
|
||||
|
||||
late final Constructor futureImplConstructor =
|
||||
index.getMember('dart:async', '_Future', '') as Constructor;
|
||||
index.getConstructor('dart:async', '_Future', '');
|
||||
|
||||
late final Procedure completeOnAsyncReturn = index.getTopLevelMember(
|
||||
'dart:async', '_completeOnAsyncReturn') as Procedure;
|
||||
late final Procedure completeOnAsyncReturn =
|
||||
index.getTopLevelProcedure('dart:async', '_completeOnAsyncReturn');
|
||||
|
||||
late final Procedure completeOnAsyncError = index.getTopLevelMember(
|
||||
'dart:async', '_completeOnAsyncError') as Procedure;
|
||||
late final Procedure completeOnAsyncError =
|
||||
index.getTopLevelProcedure('dart:async', '_completeOnAsyncError');
|
||||
|
||||
late final Library coreLibrary = index.getLibrary('dart:core');
|
||||
|
||||
|
@ -180,7 +180,7 @@ class CoreTypes {
|
|||
index.getClass('dart:async', 'FutureOr');
|
||||
|
||||
late final Procedure identicalProcedure =
|
||||
index.getTopLevelMember('dart:core', 'identical') as Procedure;
|
||||
index.getTopLevelProcedure('dart:core', 'identical');
|
||||
|
||||
late final Class intClass = index.getClass('dart:core', 'int');
|
||||
|
||||
|
@ -192,47 +192,46 @@ class CoreTypes {
|
|||
late final Class invocationMirrorClass =
|
||||
index.getClass('dart:core', '_InvocationMirror');
|
||||
|
||||
late final Constructor invocationMirrorWithTypeConstructor = index.getMember(
|
||||
'dart:core', '_InvocationMirror', '_withType') as Constructor;
|
||||
late final Constructor invocationMirrorWithTypeConstructor =
|
||||
index.getConstructor('dart:core', '_InvocationMirror', '_withType');
|
||||
|
||||
late final Class iterableClass = index.getClass('dart:core', 'Iterable');
|
||||
|
||||
late final Procedure iterableGetIterator =
|
||||
index.getMember('dart:core', 'Iterable', 'get:iterator') as Procedure;
|
||||
index.getProcedure('dart:core', 'Iterable', 'get:iterator');
|
||||
|
||||
late final Class iteratorClass = index.getClass('dart:core', 'Iterator');
|
||||
|
||||
late final Procedure iteratorMoveNext =
|
||||
index.getMember('dart:core', 'Iterator', 'moveNext') as Procedure;
|
||||
index.getProcedure('dart:core', 'Iterator', 'moveNext');
|
||||
|
||||
late final Procedure iteratorGetCurrent =
|
||||
index.getMember('dart:core', 'Iterator', 'get:current') as Procedure;
|
||||
index.getProcedure('dart:core', 'Iterator', 'get:current');
|
||||
|
||||
late final Class listClass = index.getClass('dart:core', 'List');
|
||||
|
||||
late final Procedure listDefaultConstructor =
|
||||
index.getMember('dart:core', 'List', '') as Procedure;
|
||||
index.getProcedure('dart:core', 'List', '');
|
||||
|
||||
late final Procedure listFromConstructor =
|
||||
index.getMember('dart:core', 'List', 'from') as Procedure;
|
||||
index.getProcedure('dart:core', 'List', 'from');
|
||||
|
||||
late final Procedure listUnmodifiableConstructor =
|
||||
index.getMember('dart:core', 'List', 'unmodifiable') as Procedure;
|
||||
index.getProcedure('dart:core', 'List', 'unmodifiable');
|
||||
|
||||
late final Class setClass = index.getClass('dart:core', 'Set');
|
||||
|
||||
late final Class mapClass = index.getClass('dart:core', 'Map');
|
||||
|
||||
late final Procedure mapUnmodifiable =
|
||||
index.getMember('dart:core', 'Map', 'unmodifiable') as Procedure;
|
||||
index.getProcedure('dart:core', 'Map', 'unmodifiable');
|
||||
|
||||
/// The `dart:mirrors` library, or `null` if the component does not use it.
|
||||
late final Library? mirrorsLibrary = index.tryGetLibrary('dart:mirrors');
|
||||
|
||||
late final Constructor noSuchMethodErrorDefaultConstructor =
|
||||
// TODO(regis): Replace 'withInvocation' with '' after dart2js is fixed.
|
||||
index.getMember('dart:core', 'NoSuchMethodError', 'withInvocation')
|
||||
as Constructor;
|
||||
index.getConstructor('dart:core', 'NoSuchMethodError', 'withInvocation');
|
||||
|
||||
late final Class deprecatedNullClass = index.getClass('dart:core', 'Null');
|
||||
|
||||
|
@ -241,18 +240,17 @@ class CoreTypes {
|
|||
late final Class objectClass = index.getClass('dart:core', 'Object');
|
||||
|
||||
late final Procedure objectEquals =
|
||||
index.getMember('dart:core', 'Object', '==') as Procedure;
|
||||
index.getProcedure('dart:core', 'Object', '==');
|
||||
|
||||
late final Class pragmaClass = index.getClass('dart:core', 'pragma');
|
||||
|
||||
late final Field pragmaName =
|
||||
index.getMember('dart:core', 'pragma', 'name') as Field;
|
||||
late final Field pragmaName = index.getField('dart:core', 'pragma', 'name');
|
||||
|
||||
late final Field pragmaOptions =
|
||||
index.getMember('dart:core', 'pragma', 'options') as Field;
|
||||
index.getField('dart:core', 'pragma', 'options');
|
||||
|
||||
late final Constructor pragmaConstructor =
|
||||
index.getMember('dart:core', 'pragma', '_') as Constructor;
|
||||
index.getConstructor('dart:core', 'pragma', '_');
|
||||
|
||||
late final Class stackTraceClass = index.getClass('dart:core', 'StackTrace');
|
||||
|
||||
|
@ -268,7 +266,7 @@ class CoreTypes {
|
|||
index.getClass('dart:async', '_StreamIterator');
|
||||
|
||||
late final Constructor streamIteratorDefaultConstructor =
|
||||
index.getMember('dart:async', '_StreamIterator', '') as Constructor;
|
||||
index.getConstructor('dart:async', '_StreamIterator', '');
|
||||
|
||||
late final Member streamIteratorMoveNext =
|
||||
index.getMember('dart:async', '_StreamIterator', 'moveNext');
|
||||
|
@ -281,7 +279,7 @@ class CoreTypes {
|
|||
late final Class symbolClass = index.getClass('dart:core', 'Symbol');
|
||||
|
||||
late final Constructor syncIterableDefaultConstructor =
|
||||
index.getMember('dart:core', '_SyncIterable', '') as Constructor;
|
||||
index.getConstructor('dart:core', '_SyncIterable', '');
|
||||
|
||||
late final Class syncIteratorClass =
|
||||
index.getClass('dart:core', '_SyncIterator');
|
||||
|
@ -294,40 +292,40 @@ class CoreTypes {
|
|||
|
||||
late final Class typeClass = index.getClass('dart:core', 'Type');
|
||||
|
||||
late final Constructor fallThroughErrorUrlAndLineConstructor = index
|
||||
.getMember('dart:core', 'FallThroughError', '_create') as Constructor;
|
||||
late final Constructor fallThroughErrorUrlAndLineConstructor =
|
||||
index.getConstructor('dart:core', 'FallThroughError', '_create');
|
||||
|
||||
late final Procedure boolFromEnvironment =
|
||||
index.getMember('dart:core', 'bool', 'fromEnvironment') as Procedure;
|
||||
index.getProcedure('dart:core', 'bool', 'fromEnvironment');
|
||||
|
||||
late final Procedure createSentinelMethod =
|
||||
index.getTopLevelMember('dart:_internal', 'createSentinel') as Procedure;
|
||||
index.getTopLevelProcedure('dart:_internal', 'createSentinel');
|
||||
|
||||
late final Procedure isSentinelMethod =
|
||||
index.getTopLevelMember('dart:_internal', 'isSentinel') as Procedure;
|
||||
index.getTopLevelProcedure('dart:_internal', 'isSentinel');
|
||||
|
||||
late final Constructor
|
||||
lateInitializationFieldAssignedDuringInitializationConstructor =
|
||||
index.getMember('dart:_internal', 'LateError', 'fieldADI') as Constructor;
|
||||
index.getConstructor('dart:_internal', 'LateError', 'fieldADI');
|
||||
|
||||
late final Constructor
|
||||
lateInitializationLocalAssignedDuringInitializationConstructor =
|
||||
index.getMember('dart:_internal', 'LateError', 'localADI') as Constructor;
|
||||
index.getConstructor('dart:_internal', 'LateError', 'localADI');
|
||||
|
||||
late final Constructor lateInitializationFieldNotInitializedConstructor =
|
||||
index.getMember('dart:_internal', 'LateError', 'fieldNI') as Constructor;
|
||||
index.getConstructor('dart:_internal', 'LateError', 'fieldNI');
|
||||
|
||||
late final Constructor lateInitializationLocalNotInitializedConstructor =
|
||||
index.getMember('dart:_internal', 'LateError', 'localNI') as Constructor;
|
||||
index.getConstructor('dart:_internal', 'LateError', 'localNI');
|
||||
|
||||
late final Constructor lateInitializationFieldAlreadyInitializedConstructor =
|
||||
index.getMember('dart:_internal', 'LateError', 'fieldAI') as Constructor;
|
||||
index.getConstructor('dart:_internal', 'LateError', 'fieldAI');
|
||||
|
||||
late final Constructor lateInitializationLocalAlreadyInitializedConstructor =
|
||||
index.getMember('dart:_internal', 'LateError', 'localAI') as Constructor;
|
||||
index.getConstructor('dart:_internal', 'LateError', 'localAI');
|
||||
|
||||
late final Constructor reachabilityErrorConstructor =
|
||||
index.getMember('dart:_internal', 'ReachabilityError', '') as Constructor;
|
||||
index.getConstructor('dart:_internal', 'ReachabilityError', '');
|
||||
|
||||
late final Class cellClass = index.getClass('dart:_late_helper', '_Cell');
|
||||
|
||||
|
|
|
@ -108,6 +108,19 @@ class LibraryIndex {
|
|||
return _libraries[library]?.tryGetMember(className, memberName);
|
||||
}
|
||||
|
||||
Constructor getConstructor(
|
||||
String library, String className, String memberName) {
|
||||
return _getLibraryIndex(library).getConstructor(className, memberName);
|
||||
}
|
||||
|
||||
Procedure getProcedure(String library, String className, String memberName) {
|
||||
return _getLibraryIndex(library).getProcedure(className, memberName);
|
||||
}
|
||||
|
||||
Field getField(String library, String className, String memberName) {
|
||||
return _getLibraryIndex(library).getField(className, memberName);
|
||||
}
|
||||
|
||||
/// Returns the top-level member with the given name, in the given library.
|
||||
///
|
||||
/// If a getter or setter is wanted, the `get:` or `set:` prefix must be
|
||||
|
@ -127,6 +140,14 @@ class LibraryIndex {
|
|||
String library, String className, String memberName) {
|
||||
return tryGetMember(library, topLevel, memberName);
|
||||
}
|
||||
|
||||
Procedure getTopLevelProcedure(String library, String memberName) {
|
||||
return getProcedure(library, topLevel, memberName);
|
||||
}
|
||||
|
||||
Field getTopLevelField(String library, String memberName) {
|
||||
return getField(library, topLevel, memberName);
|
||||
}
|
||||
}
|
||||
|
||||
class _ClassTable {
|
||||
|
@ -186,6 +207,18 @@ class _ClassTable {
|
|||
Member? tryGetMember(String className, String memberName) {
|
||||
return classes[className]?.tryGetMember(memberName);
|
||||
}
|
||||
|
||||
Constructor getConstructor(String className, String memberName) {
|
||||
return _getClassIndex(className).getConstructor(memberName);
|
||||
}
|
||||
|
||||
Procedure getProcedure(String className, String memberName) {
|
||||
return _getClassIndex(className).getProcedure(memberName);
|
||||
}
|
||||
|
||||
Field getField(String className, String memberName) {
|
||||
return _getClassIndex(className).getField(memberName);
|
||||
}
|
||||
}
|
||||
|
||||
class _MemberTable {
|
||||
|
@ -290,4 +323,31 @@ class _MemberTable {
|
|||
}
|
||||
|
||||
Member? tryGetMember(String name) => members[name];
|
||||
|
||||
Constructor getConstructor(String name) {
|
||||
Member member = getMember(name);
|
||||
if (member is! Constructor) {
|
||||
throw "Member '$name' in $containerName is not a Constructor: "
|
||||
"${member} (${member.runtimeType}).";
|
||||
}
|
||||
return member;
|
||||
}
|
||||
|
||||
Procedure getProcedure(String name) {
|
||||
Member member = getMember(name);
|
||||
if (member is! Procedure) {
|
||||
throw "Member '$name' in $containerName is not a Procedure: "
|
||||
"${member} (${member.runtimeType}).";
|
||||
}
|
||||
return member;
|
||||
}
|
||||
|
||||
Field getField(String name) {
|
||||
Member member = getMember(name);
|
||||
if (member is! Field) {
|
||||
throw "Member '$name' in $containerName is not a Field: "
|
||||
"${member} (${member.runtimeType}).";
|
||||
}
|
||||
return member;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,8 +25,8 @@ class VmConstantsBackend extends ConstantsBackend {
|
|||
.firstWhere((Class klass) => klass.name == '_ImmutableMap');
|
||||
// ignore: unnecessary_null_comparison
|
||||
assert(immutableMapClass != null);
|
||||
Field unmodifiableSetMap = coreTypes.index
|
||||
.getMember('dart:collection', '_UnmodifiableSet', '_map') as Field;
|
||||
Field unmodifiableSetMap =
|
||||
coreTypes.index.getField('dart:collection', '_UnmodifiableSet', '_map');
|
||||
|
||||
return new VmConstantsBackend._(immutableMapClass, unmodifiableSetMap,
|
||||
unmodifiableSetMap.enclosingClass!);
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// @dart=2.12
|
||||
|
||||
library vm.metadata.call_site_attributes;
|
||||
|
||||
import 'package:kernel/ast.dart';
|
||||
|
@ -11,7 +13,7 @@ import 'package:kernel/src/printer.dart';
|
|||
class CallSiteAttributesMetadata {
|
||||
final DartType receiverType;
|
||||
|
||||
const CallSiteAttributesMetadata({this.receiverType});
|
||||
const CallSiteAttributesMetadata({required this.receiverType});
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// @dart=2.12
|
||||
|
||||
// This transformation annotates call sites with the receiver type.
|
||||
// This is done to avoid reimplementing [Expression.getStaticType] in
|
||||
// C++.
|
||||
|
@ -19,8 +21,9 @@ import '../metadata/call_site_attributes.dart';
|
|||
|
||||
CallSiteAttributesMetadataRepository addRepositoryTo(Component component) {
|
||||
return component.metadata.putIfAbsent(
|
||||
CallSiteAttributesMetadataRepository.repositoryTag,
|
||||
() => new CallSiteAttributesMetadataRepository());
|
||||
CallSiteAttributesMetadataRepository.repositoryTag,
|
||||
() => new CallSiteAttributesMetadataRepository())
|
||||
as CallSiteAttributesMetadataRepository;
|
||||
}
|
||||
|
||||
void transformLibraries(Component component, List<Library> libraries,
|
||||
|
@ -33,7 +36,7 @@ void transformLibraries(Component component, List<Library> libraries,
|
|||
class AnnotateWithStaticTypes extends RecursiveVisitor {
|
||||
final CallSiteAttributesMetadataRepository _metadata;
|
||||
final TypeEnvironment env;
|
||||
StaticTypeContext _staticTypeContext;
|
||||
StaticTypeContext? _staticTypeContext;
|
||||
|
||||
AnnotateWithStaticTypes(
|
||||
Component component, CoreTypes coreTypes, ClassHierarchy hierarchy)
|
||||
|
@ -49,7 +52,7 @@ class AnnotateWithStaticTypes extends RecursiveVisitor {
|
|||
|
||||
void annotateWithType(TreeNode node, Expression receiver) {
|
||||
_metadata.mapping[node] = new CallSiteAttributesMetadata(
|
||||
receiverType: receiver.getStaticType(_staticTypeContext));
|
||||
receiverType: receiver.getStaticType(_staticTypeContext!));
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -80,7 +83,7 @@ class AnnotateWithStaticTypes extends RecursiveVisitor {
|
|||
|
||||
/// Returns [true] if the given [member] has any parameters annotated with
|
||||
/// generic-covariant-impl attribute.
|
||||
static bool hasGenericCovariantParameters(Member member) {
|
||||
static bool hasGenericCovariantParameters(Member? member) {
|
||||
if (member is Procedure) {
|
||||
return containsGenericCovariantImpl(
|
||||
member.function.positionalParameters) ||
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// @dart=2.12
|
||||
|
||||
// This file contains logic which is shared between the ffi_definition and
|
||||
// ffi_use_site transformers.
|
||||
|
||||
|
@ -195,7 +197,7 @@ class FfiTransformer extends Transformer {
|
|||
final LibraryIndex index;
|
||||
final ClassHierarchy hierarchy;
|
||||
final DiagnosticReporter diagnosticReporter;
|
||||
final ReferenceFromIndex referenceFromIndex;
|
||||
final ReferenceFromIndex? referenceFromIndex;
|
||||
|
||||
final Class objectClass;
|
||||
final Class intClass;
|
||||
|
@ -288,8 +290,8 @@ class FfiTransformer extends Transformer {
|
|||
/// Classes corresponding to [NativeType], indexed by [NativeType].
|
||||
final List<Class> nativeTypesClasses;
|
||||
|
||||
Library currentLibrary;
|
||||
IndexedLibrary currentLibraryIndex;
|
||||
Library? currentLibrary;
|
||||
IndexedLibrary? currentLibraryIndex;
|
||||
|
||||
FfiTransformer(this.index, this.coreTypes, this.hierarchy,
|
||||
this.diagnosticReporter, this.referenceFromIndex)
|
||||
|
@ -300,23 +302,25 @@ class FfiTransformer extends Transformer {
|
|||
listClass = coreTypes.listClass,
|
||||
typeClass = coreTypes.typeClass,
|
||||
unsafeCastMethod =
|
||||
index.getTopLevelMember('dart:_internal', 'unsafeCast'),
|
||||
index.getTopLevelProcedure('dart:_internal', 'unsafeCast'),
|
||||
nativeEffectMethod =
|
||||
index.getTopLevelMember('dart:_internal', '_nativeEffect'),
|
||||
index.getTopLevelProcedure('dart:_internal', '_nativeEffect'),
|
||||
typedDataClass = index.getClass('dart:typed_data', 'TypedData'),
|
||||
typedDataBufferGetter =
|
||||
index.getMember('dart:typed_data', 'TypedData', 'get:buffer'),
|
||||
typedDataOffsetInBytesGetter = index.getMember(
|
||||
index.getProcedure('dart:typed_data', 'TypedData', 'get:buffer'),
|
||||
typedDataOffsetInBytesGetter = index.getProcedure(
|
||||
'dart:typed_data', 'TypedData', 'get:offsetInBytes'),
|
||||
byteBufferAsUint8List =
|
||||
index.getMember('dart:typed_data', 'ByteBuffer', 'asUint8List'),
|
||||
uint8ListFactory = index.getMember('dart:typed_data', 'Uint8List', ''),
|
||||
index.getProcedure('dart:typed_data', 'ByteBuffer', 'asUint8List'),
|
||||
uint8ListFactory =
|
||||
index.getProcedure('dart:typed_data', 'Uint8List', ''),
|
||||
pragmaClass = coreTypes.pragmaClass,
|
||||
pragmaName = coreTypes.pragmaName,
|
||||
pragmaOptions = coreTypes.pragmaOptions,
|
||||
listElementAt = coreTypes.index.getMember('dart:core', 'List', '[]'),
|
||||
numAddition = coreTypes.index.getMember('dart:core', 'num', '+'),
|
||||
numMultiplication = coreTypes.index.getMember('dart:core', 'num', '*'),
|
||||
listElementAt = coreTypes.index.getProcedure('dart:core', 'List', '[]'),
|
||||
numAddition = coreTypes.index.getProcedure('dart:core', 'num', '+'),
|
||||
numMultiplication =
|
||||
coreTypes.index.getProcedure('dart:core', 'num', '*'),
|
||||
ffiLibrary = index.getLibrary('dart:ffi'),
|
||||
allocatorClass = index.getClass('dart:ffi', 'Allocator'),
|
||||
nativeFunctionClass = index.getClass('dart:ffi', 'NativeFunction'),
|
||||
|
@ -324,120 +328,128 @@ class FfiTransformer extends Transformer {
|
|||
arrayClass = index.getClass('dart:ffi', 'Array'),
|
||||
arraySizeClass = index.getClass('dart:ffi', '_ArraySize'),
|
||||
arraySizeDimension1Field =
|
||||
index.getMember('dart:ffi', '_ArraySize', 'dimension1'),
|
||||
index.getField('dart:ffi', '_ArraySize', 'dimension1'),
|
||||
arraySizeDimension2Field =
|
||||
index.getMember('dart:ffi', '_ArraySize', 'dimension2'),
|
||||
index.getField('dart:ffi', '_ArraySize', 'dimension2'),
|
||||
arraySizeDimension3Field =
|
||||
index.getMember('dart:ffi', '_ArraySize', 'dimension3'),
|
||||
index.getField('dart:ffi', '_ArraySize', 'dimension3'),
|
||||
arraySizeDimension4Field =
|
||||
index.getMember('dart:ffi', '_ArraySize', 'dimension4'),
|
||||
index.getField('dart:ffi', '_ArraySize', 'dimension4'),
|
||||
arraySizeDimension5Field =
|
||||
index.getMember('dart:ffi', '_ArraySize', 'dimension5'),
|
||||
index.getField('dart:ffi', '_ArraySize', 'dimension5'),
|
||||
arraySizeDimensionsField =
|
||||
index.getMember('dart:ffi', '_ArraySize', 'dimensions'),
|
||||
index.getField('dart:ffi', '_ArraySize', 'dimensions'),
|
||||
pointerClass = index.getClass('dart:ffi', 'Pointer'),
|
||||
compoundClass = index.getClass('dart:ffi', '_Compound'),
|
||||
structClass = index.getClass('dart:ffi', 'Struct'),
|
||||
unionClass = index.getClass('dart:ffi', 'Union'),
|
||||
ffiStructLayoutClass = index.getClass('dart:ffi', '_FfiStructLayout'),
|
||||
ffiStructLayoutTypesField =
|
||||
index.getMember('dart:ffi', '_FfiStructLayout', 'fieldTypes'),
|
||||
index.getField('dart:ffi', '_FfiStructLayout', 'fieldTypes'),
|
||||
ffiStructLayoutPackingField =
|
||||
index.getMember('dart:ffi', '_FfiStructLayout', 'packing'),
|
||||
index.getField('dart:ffi', '_FfiStructLayout', 'packing'),
|
||||
ffiInlineArrayClass = index.getClass('dart:ffi', '_FfiInlineArray'),
|
||||
ffiInlineArrayElementTypeField =
|
||||
index.getMember('dart:ffi', '_FfiInlineArray', 'elementType'),
|
||||
index.getField('dart:ffi', '_FfiInlineArray', 'elementType'),
|
||||
ffiInlineArrayLengthField =
|
||||
index.getMember('dart:ffi', '_FfiInlineArray', 'length'),
|
||||
index.getField('dart:ffi', '_FfiInlineArray', 'length'),
|
||||
packedClass = index.getClass('dart:ffi', 'Packed'),
|
||||
packedMemberAlignmentField =
|
||||
index.getMember('dart:ffi', 'Packed', 'memberAlignment'),
|
||||
allocateMethod = index.getMember('dart:ffi', 'AllocatorAlloc', 'call'),
|
||||
index.getField('dart:ffi', 'Packed', 'memberAlignment'),
|
||||
allocateMethod =
|
||||
index.getProcedure('dart:ffi', 'AllocatorAlloc', 'call'),
|
||||
allocatorAllocateMethod =
|
||||
index.getMember('dart:ffi', 'Allocator', 'allocate'),
|
||||
castMethod = index.getMember('dart:ffi', 'Pointer', 'cast'),
|
||||
offsetByMethod = index.getMember('dart:ffi', 'Pointer', '_offsetBy'),
|
||||
elementAtMethod = index.getMember('dart:ffi', 'Pointer', 'elementAt'),
|
||||
addressGetter = index.getMember('dart:ffi', 'Pointer', 'get:address'),
|
||||
index.getProcedure('dart:ffi', 'Allocator', 'allocate'),
|
||||
castMethod = index.getProcedure('dart:ffi', 'Pointer', 'cast'),
|
||||
offsetByMethod = index.getProcedure('dart:ffi', 'Pointer', '_offsetBy'),
|
||||
elementAtMethod =
|
||||
index.getProcedure('dart:ffi', 'Pointer', 'elementAt'),
|
||||
addressGetter =
|
||||
index.getProcedure('dart:ffi', 'Pointer', 'get:address'),
|
||||
compoundTypedDataBaseField =
|
||||
index.getMember('dart:ffi', '_Compound', '_typedDataBase'),
|
||||
index.getField('dart:ffi', '_Compound', '_typedDataBase'),
|
||||
arrayTypedDataBaseField =
|
||||
index.getMember('dart:ffi', 'Array', '_typedDataBase'),
|
||||
arraySizeField = index.getMember('dart:ffi', 'Array', '_size'),
|
||||
index.getField('dart:ffi', 'Array', '_typedDataBase'),
|
||||
arraySizeField = index.getField('dart:ffi', 'Array', '_size'),
|
||||
arrayNestedDimensionsField =
|
||||
index.getMember('dart:ffi', 'Array', '_nestedDimensions'),
|
||||
arrayCheckIndex = index.getMember('dart:ffi', 'Array', '_checkIndex'),
|
||||
index.getField('dart:ffi', 'Array', '_nestedDimensions'),
|
||||
arrayCheckIndex =
|
||||
index.getProcedure('dart:ffi', 'Array', '_checkIndex'),
|
||||
arrayNestedDimensionsFlattened =
|
||||
index.getMember('dart:ffi', 'Array', '_nestedDimensionsFlattened'),
|
||||
index.getField('dart:ffi', 'Array', '_nestedDimensionsFlattened'),
|
||||
arrayNestedDimensionsFirst =
|
||||
index.getMember('dart:ffi', 'Array', '_nestedDimensionsFirst'),
|
||||
index.getField('dart:ffi', 'Array', '_nestedDimensionsFirst'),
|
||||
arrayNestedDimensionsRest =
|
||||
index.getMember('dart:ffi', 'Array', '_nestedDimensionsRest'),
|
||||
index.getField('dart:ffi', 'Array', '_nestedDimensionsRest'),
|
||||
structFromTypedDataBase =
|
||||
index.getMember('dart:ffi', 'Struct', '_fromTypedDataBase'),
|
||||
index.getConstructor('dart:ffi', 'Struct', '_fromTypedDataBase'),
|
||||
unionFromTypedDataBase =
|
||||
index.getMember('dart:ffi', 'Union', '_fromTypedDataBase'),
|
||||
arrayConstructor = index.getMember('dart:ffi', 'Array', '_'),
|
||||
index.getConstructor('dart:ffi', 'Union', '_fromTypedDataBase'),
|
||||
arrayConstructor = index.getConstructor('dart:ffi', 'Array', '_'),
|
||||
fromAddressInternal =
|
||||
index.getTopLevelMember('dart:ffi', '_fromAddress'),
|
||||
index.getTopLevelProcedure('dart:ffi', '_fromAddress'),
|
||||
structPointerRef =
|
||||
index.getMember('dart:ffi', 'StructPointer', 'get:ref'),
|
||||
index.getProcedure('dart:ffi', 'StructPointer', 'get:ref'),
|
||||
structPointerElemAt =
|
||||
index.getMember('dart:ffi', 'StructPointer', '[]'),
|
||||
index.getProcedure('dart:ffi', 'StructPointer', '[]'),
|
||||
unionPointerRef =
|
||||
index.getMember('dart:ffi', 'UnionPointer', 'get:ref'),
|
||||
unionPointerElemAt = index.getMember('dart:ffi', 'UnionPointer', '[]'),
|
||||
structArrayElemAt = index.getMember('dart:ffi', 'StructArray', '[]'),
|
||||
unionArrayElemAt = index.getMember('dart:ffi', 'UnionArray', '[]'),
|
||||
arrayArrayElemAt = index.getMember('dart:ffi', 'ArrayArray', '[]'),
|
||||
arrayArrayAssignAt = index.getMember('dart:ffi', 'ArrayArray', '[]='),
|
||||
asFunctionMethod =
|
||||
index.getMember('dart:ffi', 'NativeFunctionPointer', 'asFunction'),
|
||||
index.getProcedure('dart:ffi', 'UnionPointer', 'get:ref'),
|
||||
unionPointerElemAt =
|
||||
index.getProcedure('dart:ffi', 'UnionPointer', '[]'),
|
||||
structArrayElemAt = index.getProcedure('dart:ffi', 'StructArray', '[]'),
|
||||
unionArrayElemAt = index.getProcedure('dart:ffi', 'UnionArray', '[]'),
|
||||
arrayArrayElemAt = index.getProcedure('dart:ffi', 'ArrayArray', '[]'),
|
||||
arrayArrayAssignAt =
|
||||
index.getProcedure('dart:ffi', 'ArrayArray', '[]='),
|
||||
asFunctionMethod = index.getProcedure(
|
||||
'dart:ffi', 'NativeFunctionPointer', 'asFunction'),
|
||||
asFunctionInternal =
|
||||
index.getTopLevelMember('dart:ffi', '_asFunctionInternal'),
|
||||
sizeOfMethod = index.getTopLevelMember('dart:ffi', 'sizeOf'),
|
||||
lookupFunctionMethod = index.getMember(
|
||||
index.getTopLevelProcedure('dart:ffi', '_asFunctionInternal'),
|
||||
sizeOfMethod = index.getTopLevelProcedure('dart:ffi', 'sizeOf'),
|
||||
lookupFunctionMethod = index.getProcedure(
|
||||
'dart:ffi', 'DynamicLibraryExtension', 'lookupFunction'),
|
||||
fromFunctionMethod =
|
||||
index.getMember('dart:ffi', 'Pointer', 'fromFunction'),
|
||||
index.getProcedure('dart:ffi', 'Pointer', 'fromFunction'),
|
||||
libraryLookupMethod =
|
||||
index.getMember('dart:ffi', 'DynamicLibrary', 'lookup'),
|
||||
abiMethod = index.getTopLevelMember('dart:ffi', '_abi'),
|
||||
index.getProcedure('dart:ffi', 'DynamicLibrary', 'lookup'),
|
||||
abiMethod = index.getTopLevelProcedure('dart:ffi', '_abi'),
|
||||
pointerFromFunctionProcedure =
|
||||
index.getTopLevelMember('dart:ffi', '_pointerFromFunction'),
|
||||
index.getTopLevelProcedure('dart:ffi', '_pointerFromFunction'),
|
||||
nativeCallbackFunctionProcedure =
|
||||
index.getTopLevelMember('dart:ffi', '_nativeCallbackFunction'),
|
||||
index.getTopLevelProcedure('dart:ffi', '_nativeCallbackFunction'),
|
||||
nativeTypesClasses = nativeTypeClassNames
|
||||
.map((name) => index.getClass('dart:ffi', name))
|
||||
.toList(),
|
||||
loadMethods = Map.fromIterable(optimizedTypes, value: (t) {
|
||||
final name = nativeTypeClassNames[t.index];
|
||||
return index.getTopLevelMember('dart:ffi', "_load$name");
|
||||
return index.getTopLevelProcedure('dart:ffi', "_load$name");
|
||||
}),
|
||||
loadUnalignedMethods =
|
||||
Map.fromIterable(unalignedLoadsStores, value: (t) {
|
||||
final name = nativeTypeClassNames[t.index];
|
||||
return index.getTopLevelMember('dart:ffi', "_load${name}Unaligned");
|
||||
return index.getTopLevelProcedure(
|
||||
'dart:ffi', "_load${name}Unaligned");
|
||||
}),
|
||||
storeMethods = Map.fromIterable(optimizedTypes, value: (t) {
|
||||
final name = nativeTypeClassNames[t.index];
|
||||
return index.getTopLevelMember('dart:ffi', "_store$name");
|
||||
return index.getTopLevelProcedure('dart:ffi', "_store$name");
|
||||
}),
|
||||
storeUnalignedMethods =
|
||||
Map.fromIterable(unalignedLoadsStores, value: (t) {
|
||||
final name = nativeTypeClassNames[t.index];
|
||||
return index.getTopLevelMember('dart:ffi', "_store${name}Unaligned");
|
||||
return index.getTopLevelProcedure(
|
||||
'dart:ffi', "_store${name}Unaligned");
|
||||
}),
|
||||
elementAtMethods = Map.fromIterable(optimizedTypes, value: (t) {
|
||||
final name = nativeTypeClassNames[t.index];
|
||||
return index.getTopLevelMember('dart:ffi', "_elementAt$name");
|
||||
return index.getTopLevelProcedure('dart:ffi', "_elementAt$name");
|
||||
}),
|
||||
memCopy = index.getTopLevelMember('dart:ffi', '_memCopy'),
|
||||
allocationTearoff = index.getMember(
|
||||
memCopy = index.getTopLevelProcedure('dart:ffi', '_memCopy'),
|
||||
allocationTearoff = index.getProcedure(
|
||||
'dart:ffi', 'AllocatorAlloc', LibraryIndex.tearoffPrefix + 'call'),
|
||||
asFunctionTearoff = index.getMember('dart:ffi', 'NativeFunctionPointer',
|
||||
LibraryIndex.tearoffPrefix + 'asFunction'),
|
||||
lookupFunctionTearoff = index.getMember(
|
||||
asFunctionTearoff = index.getProcedure('dart:ffi',
|
||||
'NativeFunctionPointer', LibraryIndex.tearoffPrefix + 'asFunction'),
|
||||
lookupFunctionTearoff = index.getProcedure(
|
||||
'dart:ffi',
|
||||
'DynamicLibraryExtension',
|
||||
LibraryIndex.tearoffPrefix + 'lookupFunction');
|
||||
|
@ -472,7 +484,7 @@ class FfiTransformer extends Transformer {
|
|||
/// [Handle] -> [Object]
|
||||
/// [NativeFunction]<T1 Function(T2, T3) -> S1 Function(S2, S3)
|
||||
/// where DartRepresentationOf(Tn) -> Sn
|
||||
DartType convertNativeTypeToDartType(DartType nativeType,
|
||||
DartType? convertNativeTypeToDartType(DartType nativeType,
|
||||
{bool allowCompounds = false,
|
||||
bool allowHandle = false,
|
||||
bool allowInlineArray = false}) {
|
||||
|
@ -481,7 +493,7 @@ class FfiTransformer extends Transformer {
|
|||
}
|
||||
final InterfaceType native = nativeType;
|
||||
final Class nativeClass = native.classNode;
|
||||
final NativeType nativeType_ = getType(nativeClass);
|
||||
final NativeType? nativeType_ = getType(nativeClass);
|
||||
|
||||
if (nativeClass == arrayClass) {
|
||||
if (!allowInlineArray) {
|
||||
|
@ -519,27 +531,29 @@ class FfiTransformer extends Transformer {
|
|||
return null;
|
||||
}
|
||||
|
||||
final FunctionType fun = native.typeArguments[0];
|
||||
final FunctionType fun = native.typeArguments[0] as FunctionType;
|
||||
if (fun.namedParameters.isNotEmpty) return null;
|
||||
if (fun.positionalParameters.length != fun.requiredParameterCount) {
|
||||
return null;
|
||||
}
|
||||
if (fun.typeParameters.length != 0) return null;
|
||||
|
||||
final DartType returnType = convertNativeTypeToDartType(fun.returnType,
|
||||
final DartType? returnType = convertNativeTypeToDartType(fun.returnType,
|
||||
allowCompounds: true, allowHandle: true);
|
||||
if (returnType == null) return null;
|
||||
final List<DartType> argumentTypes = fun.positionalParameters
|
||||
.map((t) => convertNativeTypeToDartType(t,
|
||||
allowCompounds: true, allowHandle: true))
|
||||
.map((t) =>
|
||||
convertNativeTypeToDartType(t,
|
||||
allowCompounds: true, allowHandle: true) ??
|
||||
dummyDartType)
|
||||
.toList();
|
||||
if (argumentTypes.contains(null)) return null;
|
||||
if (argumentTypes.contains(dummyDartType)) return null;
|
||||
return FunctionType(argumentTypes, returnType, Nullability.legacy);
|
||||
}
|
||||
|
||||
/// The [NativeType] corresponding to [c]. Returns `null` for user-defined
|
||||
/// structs.
|
||||
NativeType getType(Class c) {
|
||||
NativeType? getType(Class c) {
|
||||
final int index = nativeTypesClasses.indexOf(c);
|
||||
if (index == -1) {
|
||||
return null;
|
||||
|
@ -559,9 +573,9 @@ class FfiTransformer extends Transformer {
|
|||
Expression runtimeBranchOnLayout(Map<Abi, int> values) {
|
||||
return MethodInvocation(
|
||||
intListConstantExpression([
|
||||
values[Abi.wordSize64],
|
||||
values[Abi.wordSize32Align32],
|
||||
values[Abi.wordSize32Align64]
|
||||
values[Abi.wordSize64]!,
|
||||
values[Abi.wordSize32Align32]!,
|
||||
values[Abi.wordSize32Align64]!
|
||||
]),
|
||||
Name("[]"),
|
||||
Arguments([StaticInvocation(abiMethod, Arguments([]))]),
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// @dart=2.12
|
||||
|
||||
import 'package:kernel/ast.dart';
|
||||
|
||||
/// Wraps the initializers of late local variables in closures.
|
||||
|
@ -18,7 +20,7 @@ class LateVarInitTransformer {
|
|||
|
||||
// Variables with no initializer or a trivial initializer are ignored.
|
||||
if (s.initializer == null) return false;
|
||||
final Expression init = s.initializer;
|
||||
final Expression? init = s.initializer;
|
||||
if (init is StringLiteral) return false;
|
||||
if (init is BoolLiteral) return false;
|
||||
if (init is IntLiteral) return false;
|
||||
|
@ -47,12 +49,13 @@ class LateVarInitTransformer {
|
|||
return [fn, node];
|
||||
}
|
||||
|
||||
List<Statement> _transformStatements(List<Statement> statements) {
|
||||
List<Statement>? _transformStatements(List<Statement> statements) {
|
||||
if (!statements.any((s) => _shouldApplyTransform(s))) return null;
|
||||
final List<Statement> newStatements = <Statement>[];
|
||||
for (Statement s in statements) {
|
||||
if (_shouldApplyTransform(s)) {
|
||||
newStatements.addAll(_transformVariableDeclaration(s));
|
||||
newStatements
|
||||
.addAll(_transformVariableDeclaration(s as VariableDeclaration));
|
||||
} else {
|
||||
newStatements.add(s);
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// @dart=2.12
|
||||
|
||||
library vm.transformations.specializer.factory_specializer;
|
||||
|
||||
import 'package:kernel/kernel.dart';
|
||||
|
@ -33,6 +35,7 @@ class FactorySpecializer extends BaseSpecializer {
|
|||
|
||||
TreeNode transformStaticInvocation(StaticInvocation invocation) {
|
||||
final target = invocation.target;
|
||||
// ignore: unnecessary_null_comparison
|
||||
if (target == null) {
|
||||
return invocation;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// @dart=2.12
|
||||
|
||||
library vm.transformations.specializer.list_factory_specializer;
|
||||
|
||||
import 'package:kernel/ast.dart';
|
||||
|
@ -39,28 +41,29 @@ class ListFactorySpecializer extends BaseSpecializer {
|
|||
|
||||
ListFactorySpecializer(CoreTypes coreTypes)
|
||||
: _defaultListFactory =
|
||||
coreTypes.index.getMember('dart:core', 'List', ''),
|
||||
coreTypes.index.getProcedure('dart:core', 'List', ''),
|
||||
_listEmptyFactory =
|
||||
coreTypes.index.getMember('dart:core', 'List', 'empty'),
|
||||
coreTypes.index.getProcedure('dart:core', 'List', 'empty'),
|
||||
_listFilledFactory =
|
||||
coreTypes.index.getMember('dart:core', 'List', 'filled'),
|
||||
coreTypes.index.getProcedure('dart:core', 'List', 'filled'),
|
||||
_listGenerateFactory =
|
||||
coreTypes.index.getMember('dart:core', 'List', 'generate'),
|
||||
coreTypes.index.getProcedure('dart:core', 'List', 'generate'),
|
||||
_growableListFactory =
|
||||
coreTypes.index.getMember('dart:core', '_GrowableList', ''),
|
||||
coreTypes.index.getProcedure('dart:core', '_GrowableList', ''),
|
||||
_growableListEmptyFactory =
|
||||
coreTypes.index.getMember('dart:core', '_GrowableList', 'empty'),
|
||||
_growableListFilledFactory =
|
||||
coreTypes.index.getMember('dart:core', '_GrowableList', 'filled'),
|
||||
_growableListGenerateFactory =
|
||||
coreTypes.index.getMember('dart:core', '_GrowableList', 'generate'),
|
||||
_fixedListFactory = coreTypes.index.getMember('dart:core', '_List', ''),
|
||||
coreTypes.index.getProcedure('dart:core', '_GrowableList', 'empty'),
|
||||
_growableListFilledFactory = coreTypes.index
|
||||
.getProcedure('dart:core', '_GrowableList', 'filled'),
|
||||
_growableListGenerateFactory = coreTypes.index
|
||||
.getProcedure('dart:core', '_GrowableList', 'generate'),
|
||||
_fixedListFactory =
|
||||
coreTypes.index.getProcedure('dart:core', '_List', ''),
|
||||
_fixedListEmptyFactory =
|
||||
coreTypes.index.getMember('dart:core', '_List', 'empty'),
|
||||
coreTypes.index.getProcedure('dart:core', '_List', 'empty'),
|
||||
_fixedListFilledFactory =
|
||||
coreTypes.index.getMember('dart:core', '_List', 'filled'),
|
||||
coreTypes.index.getProcedure('dart:core', '_List', 'filled'),
|
||||
_fixedListGenerateFactory =
|
||||
coreTypes.index.getMember('dart:core', '_List', 'generate') {
|
||||
coreTypes.index.getProcedure('dart:core', '_List', 'generate') {
|
||||
assert(_defaultListFactory.isFactory);
|
||||
assert(_listEmptyFactory.isFactory);
|
||||
assert(_listFilledFactory.isFactory);
|
||||
|
@ -96,7 +99,8 @@ class ListFactorySpecializer extends BaseSpecializer {
|
|||
TreeNode transformListEmptyFactory(StaticInvocation node) {
|
||||
final args = node.arguments;
|
||||
assert(args.positional.length == 0);
|
||||
final bool growable = _getConstantOptionalArgument(args, 'growable', false);
|
||||
final bool? growable =
|
||||
_getConstantOptionalArgument(args, 'growable', false);
|
||||
if (growable == null) {
|
||||
return node;
|
||||
}
|
||||
|
@ -118,7 +122,8 @@ class ListFactorySpecializer extends BaseSpecializer {
|
|||
final fill = args.positional[1];
|
||||
final fillingWithNull = fill is NullLiteral ||
|
||||
(fill is ConstantExpression && fill.constant is NullConstant);
|
||||
final bool growable = _getConstantOptionalArgument(args, 'growable', false);
|
||||
final bool? growable =
|
||||
_getConstantOptionalArgument(args, 'growable', false);
|
||||
if (growable == null) {
|
||||
return node;
|
||||
}
|
||||
|
@ -150,7 +155,7 @@ class ListFactorySpecializer extends BaseSpecializer {
|
|||
assert(args.positional.length == 2);
|
||||
final length = args.positional[0];
|
||||
final generator = args.positional[1];
|
||||
final bool growable = _getConstantOptionalArgument(args, 'growable', true);
|
||||
final bool? growable = _getConstantOptionalArgument(args, 'growable', true);
|
||||
if (growable == null) {
|
||||
return node;
|
||||
}
|
||||
|
@ -168,7 +173,7 @@ class ListFactorySpecializer extends BaseSpecializer {
|
|||
/// Returns constant value of the only optional argument in [args],
|
||||
/// or null if it is not a constant. Returns [defaultValue] if optional
|
||||
/// argument is not passed. Argument is asserted to have the given [name].
|
||||
bool /*?*/ _getConstantOptionalArgument(
|
||||
bool? _getConstantOptionalArgument(
|
||||
Arguments args, String name, bool defaultValue) {
|
||||
if (args.named.isEmpty) {
|
||||
return defaultValue;
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// @dart=2.12
|
||||
|
||||
library vm.transformations.specializer.map_factory_specializer;
|
||||
|
||||
import 'package:kernel/ast.dart';
|
||||
|
@ -19,14 +21,14 @@ class MapFactorySpecializer extends BaseSpecializer {
|
|||
|
||||
MapFactorySpecializer(CoreTypes coreTypes)
|
||||
: _linkedHashMapDefaultFactory = assertNotNull(
|
||||
coreTypes.index.getMember(
|
||||
coreTypes.index.getProcedure(
|
||||
'dart:collection',
|
||||
'LinkedHashMap',
|
||||
'',
|
||||
),
|
||||
),
|
||||
_internalLinkedHashMapConstructor = assertNotNull(
|
||||
coreTypes.index.getMember(
|
||||
coreTypes.index.getConstructor(
|
||||
'dart:collection',
|
||||
'_InternalLinkedHashMap',
|
||||
'',
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// @dart=2.12
|
||||
|
||||
library vm.transformations.specializer.set_factory_specializer;
|
||||
|
||||
import 'package:kernel/ast.dart';
|
||||
|
@ -19,14 +21,14 @@ class SetFactorySpecializer extends BaseSpecializer {
|
|||
|
||||
SetFactorySpecializer(CoreTypes coreTypes)
|
||||
: _linkedHashSetDefaultFactory = assertNotNull(
|
||||
coreTypes.index.getMember(
|
||||
coreTypes.index.getProcedure(
|
||||
'dart:collection',
|
||||
'LinkedHashSet',
|
||||
'',
|
||||
),
|
||||
),
|
||||
_compactLinkedHashSetConstructor = assertNotNull(
|
||||
coreTypes.index.getMember(
|
||||
coreTypes.index.getConstructor(
|
||||
'dart:collection',
|
||||
'_CompactLinkedHashSet',
|
||||
'',
|
||||
|
|
Loading…
Reference in a new issue