[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:
Johnni Winther 2021-05-03 12:13:28 +00:00 committed by commit-bot@chromium.org
parent a11d9f17fb
commit b8bc0dd751
11 changed files with 250 additions and 158 deletions

View file

@ -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');

View file

@ -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;
}
}

View file

@ -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!);

View file

@ -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() =>

View file

@ -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) ||

View file

@ -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([]))]),

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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',
'',

View file

@ -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',
'',