9439795445
In `async` functions, instead of completing the function's `Future` via `Completer`, do it directly. This should be slightly more efficient as we eliminate a layer of indirection when completing. Move reading the `_future` field of `_AsyncSuspendState` to the completion functions, to avoid adding a `struct.get`s at each call site. In ACX demo, makes the final binary 0.1% smaller (13,689 bytes). Fixes #60719. Issue: https://github.com/dart-lang/sdk/issues/60719 CoreLibraryReviewExempt: Wasm-specific change. Change-Id: I27b376eb2fb9c3705ee930fb33b06d9accfd14b8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/429000 Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Ömer Ağacan <omersa@google.com>
488 lines
25 KiB
Dart
488 lines
25 KiB
Dart
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
|
|
// 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.
|
|
|
|
import 'package:kernel/ast.dart';
|
|
import 'package:kernel/core_types.dart';
|
|
import 'package:kernel/library_index.dart';
|
|
|
|
/// Kernel nodes for classes and members referenced specifically by the
|
|
/// compiler.
|
|
mixin KernelNodes {
|
|
Component get component;
|
|
|
|
LibraryIndex get index;
|
|
|
|
CoreTypes get coreTypes;
|
|
|
|
// dart:_internal classes
|
|
late final Class symbolClass = index.getClass("dart:_internal", "Symbol");
|
|
|
|
// dart:_js_types classes
|
|
late final Class jsStringClass =
|
|
index.getClass("dart:_string", "JSStringImpl");
|
|
|
|
// dart:collection classes
|
|
late final Class hashFieldBaseClass =
|
|
index.getClass("dart:_compact_hash", "_HashFieldBase");
|
|
late final Class immutableMapClass =
|
|
index.getClass("dart:_compact_hash", "_ConstMap");
|
|
late final Class immutableSetClass =
|
|
index.getClass("dart:_compact_hash", "_ConstSet");
|
|
|
|
// dart:core various classes
|
|
late final Class boxedBoolClass =
|
|
index.getClass("dart:_boxed_bool", "BoxedBool");
|
|
late final Class boxedDoubleClass =
|
|
index.getClass("dart:_boxed_double", "BoxedDouble");
|
|
late final Class boxedIntClass =
|
|
index.getClass("dart:_boxed_int", "BoxedInt");
|
|
late final Class closureClass = index.getClass("dart:core", "_Closure");
|
|
late final Class listBaseClass = index.getClass("dart:_list", "WasmListBase");
|
|
late final Procedure listBaseIndexOperator =
|
|
index.getProcedure("dart:_list", "WasmListBase", "[]");
|
|
late final Class fixedLengthListClass =
|
|
index.getClass("dart:_list", "ModifiableFixedLengthList");
|
|
late final Class growableListClass =
|
|
index.getClass("dart:_list", "GrowableList");
|
|
late final Class immutableListClass =
|
|
index.getClass("dart:_list", "ImmutableList");
|
|
late final Class invocationClass = index.getClass("dart:core", 'Invocation');
|
|
late final Class noSuchMethodErrorClass =
|
|
index.getClass("dart:core", "NoSuchMethodError");
|
|
late final Class typeErrorClass = index.getClass("dart:core", "_TypeError");
|
|
late final Class javaScriptErrorClass =
|
|
index.getClass("dart:core", "_JavaScriptError");
|
|
|
|
// dart:core runtime type classes
|
|
late final Class typeClass = index.getClass("dart:core", "_Type");
|
|
late final Field typeIsDeclaredNullableField =
|
|
index.getField("dart:core", "_Type", "isDeclaredNullable");
|
|
late final InterfaceType typeType =
|
|
InterfaceType(typeClass, Nullability.nonNullable);
|
|
late final Class abstractFunctionTypeClass =
|
|
index.getClass("dart:core", "_AbstractFunctionType");
|
|
late final Class functionTypeClass =
|
|
index.getClass("dart:core", "_FunctionType");
|
|
late final Field functionTypeTypeParameterOffsetField =
|
|
index.getField("dart:core", "_FunctionType", "typeParameterOffset");
|
|
late final Field functionTypeTypeParameterBoundsField =
|
|
index.getField("dart:core", "_FunctionType", "typeParameterBounds");
|
|
late final Field functionTypeTypeParameterDefaultsField =
|
|
index.getField("dart:core", "_FunctionType", "typeParameterDefaults");
|
|
late final Field functionTypeReturnTypeField =
|
|
index.getField("dart:core", "_FunctionType", "returnType");
|
|
late final Field functionTypePositionalParametersField =
|
|
index.getField("dart:core", "_FunctionType", "positionalParameters");
|
|
late final Field functionTypeRequiredParameterCountField =
|
|
index.getField("dart:core", "_FunctionType", "requiredParameterCount");
|
|
late final Field functionTypeTypeParameterNamedParamsField =
|
|
index.getField("dart:core", "_FunctionType", "namedParameters");
|
|
late final Class functionTypeParameterTypeClass =
|
|
index.getClass("dart:core", "_FunctionTypeParameterType");
|
|
late final Field functionTypeParameterTypeIndexField =
|
|
index.getField("dart:core", "_FunctionTypeParameterType", "index");
|
|
late final Class futureOrTypeClass =
|
|
index.getClass("dart:core", "_FutureOrType");
|
|
late final Field futureOrTypeTypeArgumentField =
|
|
index.getField("dart:core", "_FutureOrType", "typeArgument");
|
|
late final Class interfaceTypeClass =
|
|
index.getClass("dart:core", "_InterfaceType");
|
|
late final Field interfaceTypeClassIdField =
|
|
index.getField("dart:core", "_InterfaceType", "classId");
|
|
late final Field interfaceTypeTypeArguments =
|
|
index.getField("dart:core", "_InterfaceType", "typeArguments");
|
|
late final Class interfaceTypeParameterTypeClass =
|
|
index.getClass("dart:core", "_InterfaceTypeParameterType");
|
|
late final Field interfaceTypeParameterTypeEnvironmentIndexField = index
|
|
.getField("dart:core", "_InterfaceTypeParameterType", "environmentIndex");
|
|
late final Class namedParameterClass =
|
|
index.getClass("dart:core", "_NamedParameter");
|
|
late final Field namedParameterNameField =
|
|
index.getField("dart:core", "_NamedParameter", "name");
|
|
late final Field namedParameterTypeField =
|
|
index.getField("dart:core", "_NamedParameter", "type");
|
|
late final Field namedParameterIsRequiredField =
|
|
index.getField("dart:core", "_NamedParameter", "isRequired");
|
|
late final InterfaceType namedParameterType =
|
|
InterfaceType(namedParameterClass, Nullability.nonNullable);
|
|
late final Class bottomTypeClass = index.getClass("dart:core", "_BottomType");
|
|
late final Class topTypeClass = index.getClass("dart:core", "_TopType");
|
|
late final Field topTypeKindField =
|
|
index.getField("dart:core", "_TopType", "_kind");
|
|
late final Class stackTraceClass = index.getClass("dart:core", "StackTrace");
|
|
late final Class abstractRecordTypeClass =
|
|
index.getClass("dart:core", "_AbstractRecordType");
|
|
late final Class recordTypeClass = index.getClass("dart:core", "_RecordType");
|
|
late final Field recordTypeFieldTypesField =
|
|
index.getField("dart:core", "_RecordType", "fieldTypes");
|
|
late final Field recordTypeNamesField =
|
|
index.getField("dart:core", "_RecordType", "names");
|
|
late final Class moduleRtt = index.getClass("dart:core", "_ModuleRtt");
|
|
late final Field moduleRttOffsets =
|
|
index.getField("dart:core", "_ModuleRtt", "typeRowDisplacementOffsets");
|
|
late final Field moduleRttDisplacementTable =
|
|
index.getField("dart:core", "_ModuleRtt", "typeRowDisplacementTable");
|
|
late final Field moduleRttSubstTable = index.getField(
|
|
"dart:core", "_ModuleRtt", "typeRowDisplacementSubstTable");
|
|
late final Field moduleRttTypeNames =
|
|
index.getField("dart:core", "_ModuleRtt", "typeNames");
|
|
late final Procedure registerModuleRtt =
|
|
index.getTopLevelProcedure("dart:core", "_registerModuleRtt");
|
|
|
|
// dart:core sync* support classes
|
|
late final Class suspendStateClass =
|
|
index.getClass("dart:core", "_SuspendState");
|
|
late final Class syncStarIterableClass =
|
|
index.getClass("dart:core", "_SyncStarIterable");
|
|
late final Class syncStarIteratorClass =
|
|
index.getClass("dart:core", "_SyncStarIterator");
|
|
|
|
// async support classes
|
|
late final Class asyncSuspendStateClass =
|
|
index.getClass("dart:async", "_AsyncSuspendState");
|
|
late final Procedure awaitHelper =
|
|
index.getTopLevelProcedure("dart:async", "_awaitHelper");
|
|
late final Procedure awaitHelperWithTypeCheck =
|
|
index.getTopLevelProcedure("dart:async", "_awaitHelperWithTypeCheck");
|
|
late final Procedure newAsyncSuspendState =
|
|
index.getTopLevelProcedure("dart:async", "_newAsyncSuspendState");
|
|
|
|
late final Procedure asyncSuspendStateComplete =
|
|
index.getProcedure("dart:async", "_AsyncSuspendState", "_complete");
|
|
late final Procedure asyncSuspendStateCompleteError =
|
|
index.getProcedure("dart:async", "_AsyncSuspendState", "_completeError");
|
|
late final Procedure asyncSuspendStateCompleteErrorWithCurrentStack =
|
|
index.getProcedure(
|
|
"dart:async", "_AsyncSuspendState", "_completeErrorWithCurrentStack");
|
|
late final Procedure makeFuture =
|
|
index.getTopLevelProcedure("dart:async", "_makeFuture");
|
|
|
|
// dart:ffi classes
|
|
late final Class ffiPointerClass = index.getClass("dart:ffi", "Pointer");
|
|
|
|
// dart:_wasm classes
|
|
late final Library wasmLibrary = index.getLibrary("dart:_wasm");
|
|
late final Class wasmTypesBaseClass =
|
|
index.getClass("dart:_wasm", "_WasmBase");
|
|
late final wasmI8Class = index.getClass("dart:_wasm", "WasmI8");
|
|
late final wasmI16Class = index.getClass("dart:_wasm", "WasmI16");
|
|
late final wasmI32Class = index.getClass("dart:_wasm", "WasmI32");
|
|
late final wasmI32Value = index.getField("dart:_wasm", "WasmI32", "_value");
|
|
late final wasmI64Class = index.getClass("dart:_wasm", "WasmI64");
|
|
late final wasmF32Class = index.getClass("dart:_wasm", "WasmF32");
|
|
late final wasmF64Class = index.getClass("dart:_wasm", "WasmF64");
|
|
late final Class wasmAnyRefClass = index.getClass("dart:_wasm", "WasmAnyRef");
|
|
late final Class wasmExternRefClass =
|
|
index.getClass("dart:_wasm", "WasmExternRef");
|
|
late final Class wasmFuncRefClass =
|
|
index.getClass("dart:_wasm", "WasmFuncRef");
|
|
late final Class wasmEqRefClass = index.getClass("dart:_wasm", "WasmEqRef");
|
|
late final Class wasmStructRefClass =
|
|
index.getClass("dart:_wasm", "WasmStructRef");
|
|
late final Class wasmArrayRefClass =
|
|
index.getClass("dart:_wasm", "WasmArrayRef");
|
|
late final Class wasmFunctionClass =
|
|
index.getClass("dart:_wasm", "WasmFunction");
|
|
late final Class wasmVoidClass = index.getClass("dart:_wasm", "WasmVoid");
|
|
late final Class wasmTableClass = index.getClass("dart:_wasm", "WasmTable");
|
|
late final Class wasmI31RefClass = index.getClass("dart:_wasm", "WasmI31Ref");
|
|
late final Class wasmArrayClass = index.getClass("dart:_wasm", "WasmArray");
|
|
late final Class immutableWasmArrayClass =
|
|
index.getClass("dart:_wasm", "ImmutableWasmArray");
|
|
late final Field wasmArrayValueField =
|
|
index.getField("dart:_wasm", "WasmArray", "_value");
|
|
late final Field immutableWasmArrayValueField =
|
|
index.getField("dart:_wasm", "ImmutableWasmArray", "_value");
|
|
late final Field uninitializedHashBaseIndex = index.getTopLevelField(
|
|
"dart:_compact_hash", "_uninitializedHashBaseIndex");
|
|
late final Field wasmI64ValueField =
|
|
index.getField("dart:_wasm", "WasmI64", "_value");
|
|
|
|
// dart:_internal procedures
|
|
late final Procedure loadLibrary =
|
|
index.getTopLevelProcedure("dart:_internal", "loadLibrary");
|
|
late final Procedure checkLibraryIsLoaded =
|
|
index.getTopLevelProcedure("dart:_internal", "checkLibraryIsLoaded");
|
|
late final Procedure? loadLibraryImportMap = index.tryGetProcedure(
|
|
"dart:_internal", LibraryIndex.topLevel, "get:_importMapping");
|
|
|
|
// dart:_js_helper procedures
|
|
late final Procedure getInternalizedString =
|
|
index.getTopLevelProcedure("dart:_js_helper", "getInternalizedString");
|
|
late final Procedure areEqualInJS =
|
|
index.getTopLevelProcedure("dart:_js_helper", "areEqualInJS");
|
|
late final Procedure toJSNumber =
|
|
index.getTopLevelProcedure("dart:_js_helper", "toJSNumber");
|
|
|
|
// dart:_js_types procedures
|
|
late final Procedure jsStringEquals =
|
|
index.getProcedure("dart:_string", "JSStringImpl", "==");
|
|
late final Procedure jsStringInterpolate =
|
|
index.getProcedure("dart:_string", "JSStringImpl", "_interpolate");
|
|
late final Procedure jsStringInterpolate1 =
|
|
index.getProcedure("dart:_string", "JSStringImpl", "_interpolate1");
|
|
late final Procedure jsStringInterpolate2 =
|
|
index.getProcedure("dart:_string", "JSStringImpl", "_interpolate2");
|
|
late final Procedure jsStringInterpolate3 =
|
|
index.getProcedure("dart:_string", "JSStringImpl", "_interpolate3");
|
|
late final Procedure jsStringInterpolate4 =
|
|
index.getProcedure("dart:_string", "JSStringImpl", "_interpolate4");
|
|
|
|
// dart:collection procedures and fields
|
|
late final Procedure mapFactory =
|
|
index.getProcedure("dart:collection", "LinkedHashMap", "_default");
|
|
late final Procedure mapFromWasmArray =
|
|
index.getProcedure("dart:_compact_hash", "DefaultMap", "fromWasmArray");
|
|
late final Procedure setFactory =
|
|
index.getProcedure("dart:collection", "LinkedHashSet", "_default");
|
|
late final Procedure setFromWasmArray =
|
|
index.getProcedure("dart:_compact_hash", "DefaultSet", "fromWasmArray");
|
|
late final Procedure growableListEmpty =
|
|
index.getProcedure("dart:_list", "GrowableList", "empty");
|
|
late final Constructor growableListFromWasmArray =
|
|
index.getConstructor("dart:_list", "GrowableList", "_withData");
|
|
late final Procedure hashImmutableIndexNullable = index.getProcedure(
|
|
"dart:collection", "_HashAbstractImmutableBase", "get:_indexNullable");
|
|
late final Field hashFieldBaseIndexField =
|
|
index.getField("dart:_compact_hash", "_HashFieldBase", "_index");
|
|
late final Field hashFieldBaseHashMaskField =
|
|
index.getField("dart:_compact_hash", "_HashFieldBase", "_hashMask");
|
|
late final Field hashFieldBaseDataField =
|
|
index.getField("dart:_compact_hash", "_HashFieldBase", "_data");
|
|
late final Field hashFieldBaseUsedDataField =
|
|
index.getField("dart:_compact_hash", "_HashFieldBase", "_usedData");
|
|
late final Field hashFieldBaseDeletedKeysField =
|
|
index.getField("dart:_compact_hash", "_HashFieldBase", "_deletedKeys");
|
|
|
|
// dart:core various procedures
|
|
late final Procedure boxedBoolEquals =
|
|
index.getProcedure("dart:_boxed_bool", "BoxedBool", "==");
|
|
late final Procedure boxedIntEquals =
|
|
index.getProcedure("dart:_boxed_int", "BoxedInt", "==");
|
|
late final Procedure objectHashCode =
|
|
index.getProcedure("dart:core", "Object", "get:hashCode");
|
|
late final Procedure objectNoSuchMethod =
|
|
index.getProcedure("dart:core", "Object", "noSuchMethod");
|
|
late final Procedure objectGetTypeArguments =
|
|
index.getProcedure("dart:core", "Object", "_getTypeArguments");
|
|
late final Procedure objectTypeArguments =
|
|
index.getProcedure("dart:core", "Object", "get:_typeArguments");
|
|
late final Procedure nullToString =
|
|
index.getProcedure("dart:core", "Object", "_nullToString");
|
|
late final Procedure nullNoSuchMethod =
|
|
index.getProcedure("dart:core", "Object", "_nullNoSuchMethod");
|
|
late final Procedure truncDiv =
|
|
index.getProcedure("dart:_boxed_int", "BoxedInt", "_truncDiv");
|
|
late final Procedure runtimeTypeEquals =
|
|
index.getTopLevelProcedure("dart:core", "_runtimeTypeEquals");
|
|
late final Procedure runtimeTypeHashCode =
|
|
index.getTopLevelProcedure("dart:core", "_runtimeTypeHashCode");
|
|
|
|
// dart:core invocation/exception procedures
|
|
late final Procedure invocationGetterFactory =
|
|
index.getProcedure("dart:core", "Invocation", "getter");
|
|
late final Procedure invocationSetterFactory =
|
|
index.getProcedure("dart:core", "Invocation", "setter");
|
|
late final Procedure invocationMethodFactory =
|
|
index.getProcedure("dart:core", "Invocation", "method");
|
|
late final Procedure invocationGenericMethodFactory =
|
|
index.getProcedure("dart:core", "Invocation", "genericMethod");
|
|
late final Procedure noSuchMethodErrorThrowWithInvocation = index
|
|
.getProcedure("dart:core", "NoSuchMethodError", "_throwWithInvocation");
|
|
late final Procedure noSuchMethodErrorThrowUnimplementedExternalMemberError =
|
|
index.getProcedure("dart:core", "NoSuchMethodError",
|
|
"_throwUnimplementedExternalMemberError");
|
|
late final Procedure stackTraceCurrent =
|
|
index.getProcedure("dart:core", "StackTrace", "get:current");
|
|
late final Procedure throwNullCheckErrorWithCurrentStack = index.getProcedure(
|
|
"dart:core", "_TypeError", "_throwNullCheckErrorWithCurrentStack");
|
|
late final Procedure throwAsCheckError =
|
|
index.getProcedure("dart:core", "_TypeError", "_throwAsCheckError");
|
|
late final Procedure throwInterfaceTypeAsCheckError1 = index
|
|
.getTopLevelProcedure("dart:core", "_throwInterfaceTypeAsCheckError1");
|
|
late final Procedure throwInterfaceTypeAsCheckError2 = index
|
|
.getTopLevelProcedure("dart:core", "_throwInterfaceTypeAsCheckError2");
|
|
late final Procedure throwInterfaceTypeAsCheckError = index
|
|
.getTopLevelProcedure("dart:core", "_throwInterfaceTypeAsCheckError");
|
|
late final Procedure throwWasmRefError =
|
|
index.getProcedure("dart:core", "_TypeError", "_throwWasmRefError");
|
|
late final Procedure throwArgumentTypeCheckError = index.getProcedure(
|
|
"dart:core", "_TypeError", "_throwArgumentTypeCheckError");
|
|
late final Procedure throwTypeArgumentBoundCheckError = index.getProcedure(
|
|
"dart:core", "_TypeError", "_throwTypeArgumentBoundCheckError");
|
|
late final Procedure throwAssertionError =
|
|
index.getProcedure("dart:core", "AssertionError", "_throwWithMessage");
|
|
late final Procedure javaScriptErrorFactory =
|
|
index.getProcedure("dart:core", "_JavaScriptError", "_");
|
|
late final Procedure rangeErrorCheckValueInInterval =
|
|
index.getProcedure("dart:core", "RangeError", "checkValueInInterval");
|
|
late final Class errorClass = index.getClass("dart:core", "Error");
|
|
late final Field errorClassStackTraceField =
|
|
index.getField("dart:core", "Error", "_stackTrace");
|
|
late final Procedure errorThrow =
|
|
index.getProcedure("dart:core", "Error", "_throw");
|
|
late final Procedure errorThrowWithCurrentStackTrace =
|
|
index.getProcedure("dart:core", "Error", "_throwWithCurrentStackTrace");
|
|
|
|
// dart:core type procedures
|
|
late final Procedure getClosureRuntimeType =
|
|
index.getProcedure("dart:core", '_Closure', "_getClosureRuntimeType");
|
|
late final Procedure getMasqueradedRuntimeType =
|
|
index.getTopLevelProcedure("dart:core", "_getMasqueradedRuntimeType");
|
|
late final Procedure isNullabilityCheck =
|
|
index.getTopLevelProcedure("dart:core", "_isNullabilityCheck");
|
|
late final Procedure isSubtype =
|
|
index.getTopLevelProcedure("dart:core", "_isSubtype");
|
|
late final Procedure isInterfaceSubtype =
|
|
index.getTopLevelProcedure("dart:core", "_isInterfaceSubtype");
|
|
late final Procedure isInterfaceSubtype0 =
|
|
index.getTopLevelProcedure("dart:core", "_isInterfaceSubtype0");
|
|
late final Procedure isInterfaceSubtype1 =
|
|
index.getTopLevelProcedure("dart:core", "_isInterfaceSubtype1");
|
|
late final Procedure isInterfaceSubtype2 =
|
|
index.getTopLevelProcedure("dart:core", "_isInterfaceSubtype2");
|
|
late final Procedure asSubtype =
|
|
index.getTopLevelProcedure("dart:core", "_asSubtype");
|
|
late final Procedure asInterfaceSubtype =
|
|
index.getTopLevelProcedure("dart:core", "_asInterfaceSubtype");
|
|
late final Procedure asInterfaceSubtype0 =
|
|
index.getTopLevelProcedure("dart:core", "_asInterfaceSubtype0");
|
|
late final Procedure asInterfaceSubtype1 =
|
|
index.getTopLevelProcedure("dart:core", "_asInterfaceSubtype1");
|
|
late final Procedure asInterfaceSubtype2 =
|
|
index.getTopLevelProcedure("dart:core", "_asInterfaceSubtype2");
|
|
late final Procedure isTypeSubtype =
|
|
index.getTopLevelProcedure("dart:core", "_isTypeSubtype");
|
|
late final Procedure verifyOptimizedTypeCheck =
|
|
index.getTopLevelProcedure("dart:core", "_verifyOptimizedTypeCheck");
|
|
late final Procedure checkClosureShape =
|
|
index.getTopLevelProcedure("dart:core", "_checkClosureShape");
|
|
late final Procedure checkClosureType =
|
|
index.getTopLevelProcedure("dart:core", "_checkClosureType");
|
|
late final Procedure typeAsNullable =
|
|
index.getProcedure("dart:core", "_Type", "get:asNullable");
|
|
late final Procedure createNormalizedFutureOrType = index.getProcedure(
|
|
"dart:core", "_TypeUniverse", "createNormalizedFutureOrType");
|
|
late final Procedure substituteFunctionTypeArgument = index.getProcedure(
|
|
"dart:core", "_TypeUniverse", "substituteFunctionTypeArgument");
|
|
|
|
// dart:core dynamic invocation helper procedures
|
|
late final Procedure getNamedParameterIndex =
|
|
index.getTopLevelProcedure("dart:core", "_getNamedParameterIndex");
|
|
late final Procedure typeArgumentsToList =
|
|
index.getTopLevelProcedure("dart:core", "_typeArgumentsToList");
|
|
late final Procedure positionalParametersToList =
|
|
index.getTopLevelProcedure("dart:core", "_positionalParametersToList");
|
|
late final Procedure namedParametersToMap =
|
|
index.getTopLevelProcedure("dart:core", "_namedParametersToMap");
|
|
late final Procedure namedParameterMapToArray =
|
|
index.getTopLevelProcedure("dart:core", "_namedParameterMapToArray");
|
|
late final Procedure listOf =
|
|
index.getProcedure("dart:_list", "ModifiableFixedLengthList", "of");
|
|
|
|
// dart:_wasm procedures
|
|
late final Procedure wasmFunctionCall =
|
|
index.getProcedure("dart:_wasm", "WasmFunction", "get:call");
|
|
late final Procedure wasmTableCallIndirect =
|
|
index.getProcedure("dart:_wasm", "WasmTable", "callIndirect");
|
|
|
|
// Hash utils
|
|
late final Field hashSeed = index.getTopLevelField('dart:core', '_hashSeed');
|
|
late final Procedure systemHashCombine =
|
|
index.getProcedure("dart:_internal", "SystemHash", "combine");
|
|
|
|
// Dynamic module helpers
|
|
late final Class constCacheClass =
|
|
index.getClass('dart:_internal', 'WasmConstCache');
|
|
late final Constructor constCacheInit =
|
|
index.getConstructor('dart:_internal', 'WasmConstCache', '');
|
|
late final Procedure constCacheCanonicalize = index.getProcedure(
|
|
'dart:_internal', 'WasmConstCache', 'canonicalizeValue');
|
|
late final Procedure constCacheArrayCanonicalize = index.getProcedure(
|
|
'dart:_internal', 'WasmArrayConstCache', 'canonicalizeArrayValue');
|
|
late final Procedure registerUpdateableFuncRefs = index.getTopLevelProcedure(
|
|
'dart:_internal', 'registerUpdateableFuncRefs');
|
|
late final Procedure getUpdateableFuncRef =
|
|
index.getTopLevelProcedure('dart:_internal', 'getUpdateableFuncRef');
|
|
late final Procedure classIdToModuleId =
|
|
index.getTopLevelProcedure('dart:_internal', 'classIdToModuleId');
|
|
late final Procedure localizeClassId =
|
|
index.getTopLevelProcedure('dart:_internal', 'localizeClassId');
|
|
late final Procedure scopeClassId =
|
|
index.getTopLevelProcedure('dart:_internal', 'scopeClassId');
|
|
late final Procedure globalizeClassId =
|
|
index.getTopLevelProcedure('dart:_internal', 'globalizeClassId');
|
|
late final Procedure registerModuleClassRange =
|
|
index.getTopLevelProcedure('dart:_internal', 'registerModuleClassRange');
|
|
late final Procedure constCacheGetter =
|
|
index.getTopLevelProcedure('dart:_internal', 'getConstCache');
|
|
late final Field objectConstArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'objectConstArray');
|
|
late final Field stringConstArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'stringConstArray');
|
|
late final Field stringConstImmutableArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'stringConstImmutableArray');
|
|
late final Field typeConstArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'typeConstArray');
|
|
late final Field typeArrayConstArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'typeArrayConstArray');
|
|
late final Field namedParameterConstArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'nameParameterConstArray');
|
|
late final Field i8ConstImmutableArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'i8ConstImmutableArray');
|
|
late final Field i32ConstArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'i32ConstArray');
|
|
late final Field i64ConstImmutableArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'i64ConstImmutableArray');
|
|
late final Field boxedIntImmutableArrayCache =
|
|
index.getTopLevelField('dart:_internal', 'boxedIntImmutableArray');
|
|
|
|
// Debugging
|
|
late final Procedure printToConsole =
|
|
index.getTopLevelProcedure("dart:_internal", "printToConsole");
|
|
|
|
late final Map<Member, (Extension, ExtensionMemberDescriptor)>
|
|
_extensionCache = {};
|
|
|
|
late final Map<InterfaceType, Field> wasmArrayConstCache = {
|
|
_makeElementType(coreTypes.objectClass, nullable: true):
|
|
objectConstArrayCache,
|
|
_makeElementType(typeClass): typeConstArrayCache,
|
|
_makeElementType(namedParameterClass): namedParameterConstArrayCache,
|
|
_makeElementType(coreTypes.stringClass): stringConstArrayCache,
|
|
_makeElementType(wasmI32Class): i32ConstArrayCache,
|
|
_makeElementType(wasmArrayClass,
|
|
typeArguments: [_makeElementType(typeClass)]): typeArrayConstArrayCache,
|
|
};
|
|
late final Map<InterfaceType, Field> immutableWasmArrayConstCache = {
|
|
_makeElementType(coreTypes.stringClass): stringConstImmutableArrayCache,
|
|
_makeElementType(wasmI8Class): i8ConstImmutableArrayCache,
|
|
_makeElementType(wasmI64Class): i64ConstImmutableArrayCache,
|
|
_makeElementType(boxedIntClass): boxedIntImmutableArrayCache,
|
|
};
|
|
|
|
InterfaceType _makeElementType(Class c,
|
|
{bool nullable = false, List<InterfaceType>? typeArguments}) =>
|
|
InterfaceType(
|
|
c,
|
|
nullable ? Nullability.nullable : Nullability.nonNullable,
|
|
typeArguments);
|
|
|
|
(Extension, ExtensionMemberDescriptor) extensionOfMember(Member member) {
|
|
return _extensionCache.putIfAbsent(member, () {
|
|
assert(member.isExtensionMember);
|
|
|
|
final memberRef = member.reference;
|
|
for (final ext in member.enclosingLibrary.extensions) {
|
|
for (final descriptor in ext.memberDescriptors) {
|
|
if (memberRef == descriptor.memberReference) {
|
|
return (ext, descriptor);
|
|
}
|
|
}
|
|
}
|
|
throw 'Did not find extension for $member';
|
|
});
|
|
}
|
|
}
|