[dart2wasm] Add annotations to member and static intrinsics.
Each annotation corresponds to an enum value in the compiler that then dictates the generated code. This is only done for static call and member intrinsics and not instance call intrinsics. This is because the target member of an instance intrinsic maybe be an interface rather than the annotated implementation of a method. Change-Id: Iff8fe09b5078d81940cb1813fb65de50473519b1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/402960 Commit-Queue: Nate Biggs <natebiggs@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
This commit is contained in:
+971
-778
File diff suppressed because it is too large
Load Diff
@@ -10,6 +10,7 @@ import 'package:kernel/type_algebra.dart';
|
||||
import 'package:kernel/type_environment.dart';
|
||||
|
||||
import 'list_factory_specializer.dart';
|
||||
import 'util.dart';
|
||||
|
||||
void transformLibraries(
|
||||
List<Library> libraries, CoreTypes coreTypes, ClassHierarchy hierarchy) {
|
||||
@@ -208,6 +209,7 @@ class _WasmTransformer extends Transformer {
|
||||
isExternal: true,
|
||||
isSynthetic: true,
|
||||
fileUri: cls.fileUri);
|
||||
addPragma(getTypeArguments, 'wasm:intrinsic', coreTypes);
|
||||
cls.addProcedure(getTypeArguments);
|
||||
}
|
||||
return super.visitClass(cls);
|
||||
|
||||
@@ -182,6 +182,7 @@ final class BoxedDouble implements double {
|
||||
return intBitsToDouble(aBits);
|
||||
}
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external double operator -();
|
||||
|
||||
@pragma("wasm:prefer-inline")
|
||||
@@ -283,8 +284,11 @@ final class BoxedDouble implements double {
|
||||
return intBitsToDouble(rounded);
|
||||
}
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external double floorToDouble();
|
||||
@pragma("wasm:intrinsic")
|
||||
external double ceilToDouble();
|
||||
@pragma("wasm:intrinsic")
|
||||
external double truncateToDouble();
|
||||
|
||||
num clamp(num lowerLimit, num upperLimit) {
|
||||
|
||||
@@ -15,8 +15,11 @@ final class BoxedInt implements int {
|
||||
@pragma("wasm:entry-point")
|
||||
BoxedInt._(this.value);
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external num operator +(num other);
|
||||
@pragma("wasm:intrinsic")
|
||||
external num operator -(num other);
|
||||
@pragma("wasm:intrinsic")
|
||||
external num operator *(num other);
|
||||
|
||||
@pragma("wasm:prefer-inline")
|
||||
@@ -70,10 +73,14 @@ final class BoxedInt implements int {
|
||||
? this - (this ~/ other) * other
|
||||
: BoxedDouble.computeRemainder(toDouble(), unsafeCast<double>(other));
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external int operator -();
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external int operator &(int other);
|
||||
@pragma("wasm:intrinsic")
|
||||
external int operator |(int other);
|
||||
@pragma("wasm:intrinsic")
|
||||
external int operator ^(int other);
|
||||
|
||||
@pragma("wasm:prefer-inline")
|
||||
@@ -121,9 +128,13 @@ final class BoxedInt implements int {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool operator <(num other);
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool operator >(num other);
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool operator >=(num other);
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool operator <=(num other);
|
||||
|
||||
@pragma("wasm:prefer-inline")
|
||||
@@ -276,6 +287,7 @@ final class BoxedInt implements int {
|
||||
return this;
|
||||
}
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external double toDouble();
|
||||
|
||||
String toStringAsFixed(int fractionDigits) {
|
||||
@@ -419,6 +431,7 @@ final class BoxedInt implements int {
|
||||
|
||||
int get hashCode => intHashCode(this);
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external int operator ~();
|
||||
external int get bitLength;
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ part of "internal_patch.dart";
|
||||
|
||||
@pragma("wasm:entry-point")
|
||||
class ClassID {
|
||||
@pragma("wasm:intrinsic")
|
||||
external static WasmI32 getID(Object? value);
|
||||
|
||||
@pragma("wasm:class-id", "dart.typed_data#_ExternalUint8Array")
|
||||
|
||||
@@ -56,6 +56,7 @@ final class _Closure implements Function {
|
||||
|
||||
@pragma("wasm:entry-point")
|
||||
@pragma("wasm:prefer-inline")
|
||||
@pragma("wasm:intrinsic")
|
||||
external static _FunctionType _getClosureRuntimeType(_Closure closure);
|
||||
|
||||
@override
|
||||
@@ -84,35 +85,42 @@ final class _Closure implements Function {
|
||||
// Helpers for implementing `hashCode`, `operator ==`.
|
||||
|
||||
/// Whether the closure is an instantiation.
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool get _isInstantiationClosure;
|
||||
|
||||
/// When the closure is an instantiation, get the instantiated closure.
|
||||
///
|
||||
/// Traps when the closure is not an instantiation.
|
||||
@pragma("wasm:intrinsic")
|
||||
external _Closure get _instantiatedClosure;
|
||||
|
||||
/// When the closure is an instantiation, returns the combined hash code of
|
||||
/// the captured types.
|
||||
///
|
||||
/// Traps when the closure is not an instantiation.
|
||||
@pragma("wasm:intrinsic")
|
||||
external int _instantiationClosureTypeHash();
|
||||
|
||||
/// When this [_Closure] and [other] are instantiations, compare captured
|
||||
/// types for equality.
|
||||
///
|
||||
/// Traps when one or both of the closures are not an instantiation.
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool _instantiationClosureTypeEquals(_Closure other);
|
||||
|
||||
/// Whether the closure is an instance tear-off.
|
||||
///
|
||||
/// Instance tear-offs will have receivers.
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool get _isInstanceTearOff;
|
||||
|
||||
/// When the closure is an instance tear-off, returns the receiver.
|
||||
///
|
||||
/// Traps when the closure is not an instance tear-off.
|
||||
@pragma("wasm:intrinsic")
|
||||
external Object? get _instanceTearOffReceiver;
|
||||
|
||||
/// The vtable of the closure.
|
||||
@pragma("wasm:intrinsic")
|
||||
external WasmAnyRef get _vtable;
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ import 'dart:_wasm';
|
||||
part "closure.dart";
|
||||
part "double_patch.dart";
|
||||
part "errors_patch.dart";
|
||||
part "function_patch.dart";
|
||||
part "identical_patch.dart";
|
||||
part "named_parameters.dart";
|
||||
part "object_patch.dart";
|
||||
|
||||
@@ -32,6 +32,10 @@ class Error {
|
||||
error._stackTrace ??= stackTrace;
|
||||
}
|
||||
}
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external Never _throw(Object object, StackTrace stackTrace);
|
||||
}
|
||||
|
||||
class _Error extends Error {
|
||||
|
||||
@@ -40,3 +40,116 @@ void _storePointer<S extends NativeType>(
|
||||
int offsetInBytes,
|
||||
Pointer<S> value,
|
||||
) => _storeUint32(typedDataBase, offsetInBytes, value._address.toIntUnsigned());
|
||||
|
||||
// The following functions are implemented in the method recognizer.
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external int _loadInt8(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external int _loadInt16(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external int _loadInt32(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external int _loadInt64(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external int _loadUint8(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external int _loadUint16(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external int _loadUint32(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external int _loadUint64(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external double _loadFloat(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external double _loadDouble(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external double _loadFloatUnaligned(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external double _loadDoubleUnaligned(Object typedDataBase, int offsetInBytes);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeInt8(Object typedDataBase, int offsetInBytes, int value);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeInt16(Object typedDataBase, int offsetInBytes, int value);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeInt32(Object typedDataBase, int offsetInBytes, int value);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeInt64(Object typedDataBase, int offsetInBytes, int value);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeUint8(Object typedDataBase, int offsetInBytes, int value);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeUint16(Object typedDataBase, int offsetInBytes, int value);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeUint32(Object typedDataBase, int offsetInBytes, int value);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeUint64(Object typedDataBase, int offsetInBytes, int value);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeFloat(
|
||||
Object typedDataBase,
|
||||
int offsetInBytes,
|
||||
double value,
|
||||
);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeDouble(
|
||||
Object typedDataBase,
|
||||
int offsetInBytes,
|
||||
double value,
|
||||
);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeFloatUnaligned(
|
||||
Object typedDataBase,
|
||||
int offsetInBytes,
|
||||
double value,
|
||||
);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _storeDoubleUnaligned(
|
||||
Object typedDataBase,
|
||||
int offsetInBytes,
|
||||
double value,
|
||||
);
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
// Copyright (c) 2025, 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.
|
||||
|
||||
part of "core_patch.dart";
|
||||
|
||||
@patch
|
||||
class Function {
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external static apply(
|
||||
Function function,
|
||||
List<dynamic>? positionalArguments, [
|
||||
Map<Symbol, dynamic>? namedArguments,
|
||||
]);
|
||||
}
|
||||
@@ -5,7 +5,9 @@
|
||||
part of "core_patch.dart";
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool identical(Object? a, Object? b);
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external int identityHashCode(Object? object);
|
||||
|
||||
@@ -67,6 +67,7 @@ abstract class WasmStringBase implements String {}
|
||||
//
|
||||
// Important: this is unsafe and must be used with care.
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external T unsafeCast<T>(Object? v);
|
||||
|
||||
// A version of [unsafeCast] that is opaque to the TFA. The TFA knows about the
|
||||
@@ -75,12 +76,14 @@ external T unsafeCast<T>(Object? v);
|
||||
// used. One such situation is when either the source or destination type is not
|
||||
// an ordinary Dart type, for instance if it is one of the special Wasm types
|
||||
// from wasm_types.dart.
|
||||
@pragma("wasm:intrinsic")
|
||||
external T unsafeCastOpaque<T>(Object? v);
|
||||
|
||||
// This function can be used to keep an object alive till that point.
|
||||
void reachabilityFence(Object? object) {}
|
||||
|
||||
// This function can be used to encode native side effects.
|
||||
@pragma("wasm:intrinsic")
|
||||
external void _nativeEffect(Object object);
|
||||
|
||||
// Thomas Wang 64-bit mix.
|
||||
@@ -96,9 +99,13 @@ int mix64(int n) {
|
||||
return n;
|
||||
}
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external int floatToIntBits(double value);
|
||||
@pragma("wasm:intrinsic")
|
||||
external double intBitsToFloat(int value);
|
||||
@pragma("wasm:intrinsic")
|
||||
external int doubleToIntBits(double value);
|
||||
@pragma("wasm:intrinsic")
|
||||
external double intBitsToDouble(int value);
|
||||
|
||||
/// Used to invoke a Dart closure from JS (for microtasks and other callbacks),
|
||||
|
||||
@@ -5,5 +5,7 @@
|
||||
library dart._object_helper;
|
||||
|
||||
// Access hidden identity hash code field.
|
||||
@pragma("wasm:intrinsic")
|
||||
external int getIdentityHashField(Object obj);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void setIdentityHashField(Object obj, int hash);
|
||||
|
||||
@@ -7,6 +7,7 @@ part of "core_patch.dart";
|
||||
@patch
|
||||
class Object {
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool operator ==(Object other);
|
||||
|
||||
// Random number generator used to generate identity hash codes.
|
||||
@@ -41,6 +42,7 @@ class Object {
|
||||
object._typeArguments;
|
||||
|
||||
@patch
|
||||
@pragma("wasm:intrinsic")
|
||||
external Type get runtimeType;
|
||||
|
||||
@patch
|
||||
|
||||
@@ -1956,8 +1956,11 @@ const bool _isJsCompatibility = bool.fromEnvironment(
|
||||
_Type _getMasqueradedRuntimeTypeNullable(Object? object) =>
|
||||
object == null ? _literal<Null>() : _getMasqueradedRuntimeType(object);
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool _isObjectClassId(WasmI32 classId);
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool _isClosureClassId(WasmI32 classId);
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool _isRecordClassId(WasmI32 classId);
|
||||
|
||||
// Used by the generated code to compare types captured by instantiation
|
||||
|
||||
@@ -29,6 +29,7 @@ class WasmAnyRef extends _WasmBase {
|
||||
const WasmAnyRef._();
|
||||
|
||||
/// Upcast Dart object to `anyref`.
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmAnyRef.fromObject(Object o);
|
||||
|
||||
/// Whether this reference is a Dart object.
|
||||
@@ -53,6 +54,7 @@ extension ExternalizeNullable on WasmAnyRef? {
|
||||
class WasmExternRef extends _WasmBase {
|
||||
// To avoid conflating the null externref with Dart's null, we provide a
|
||||
// special getter for the null externref.
|
||||
@pragma("wasm:intrinsic")
|
||||
external static WasmExternRef? get nullRef;
|
||||
}
|
||||
|
||||
@@ -65,16 +67,22 @@ extension InternalizeNullable on WasmExternRef? {
|
||||
WasmAnyRef? internalize() => _internalizeNullable(this);
|
||||
}
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external WasmExternRef _externalizeNonNullable(WasmAnyRef ref);
|
||||
@pragma("wasm:intrinsic")
|
||||
external WasmExternRef? _externalizeNullable(WasmAnyRef? ref);
|
||||
@pragma("wasm:intrinsic")
|
||||
external WasmAnyRef _internalizeNonNullable(WasmExternRef ref);
|
||||
@pragma("wasm:intrinsic")
|
||||
external WasmAnyRef? _internalizeNullable(WasmExternRef? ref);
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool _wasmExternRefIsNull(WasmExternRef? ref);
|
||||
|
||||
/// The Wasm `funcref` type.
|
||||
@pragma("wasm:entry-point")
|
||||
class WasmFuncRef extends _WasmBase {
|
||||
/// Upcast typed function reference to `funcref`
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmFuncRef.fromWasmFunction(WasmFunction<Function> fun);
|
||||
}
|
||||
|
||||
@@ -85,6 +93,7 @@ class WasmEqRef extends WasmAnyRef {
|
||||
const WasmEqRef._() : super._();
|
||||
|
||||
/// Upcast Dart object to `eqref`.
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmEqRef.fromObject(Object o);
|
||||
}
|
||||
|
||||
@@ -92,6 +101,7 @@ class WasmEqRef extends WasmAnyRef {
|
||||
@pragma("wasm:entry-point")
|
||||
class WasmStructRef extends WasmEqRef {
|
||||
/// Upcast Dart object to `structref`.
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmStructRef.fromObject(Object o);
|
||||
}
|
||||
|
||||
@@ -122,11 +132,17 @@ class WasmI32 extends _WasmBase {
|
||||
/// Constructor for constant instances.
|
||||
const WasmI32(this._value);
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmI32.fromInt(int value);
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmI32.int8FromInt(int value);
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmI32.uint8FromInt(int value);
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmI32.int16FromInt(int value);
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmI32.uint16FromInt(int value);
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmI32.fromBool(bool value);
|
||||
external int toIntSigned();
|
||||
external int toIntUnsigned();
|
||||
@@ -163,6 +179,7 @@ class WasmI64 extends _WasmBase {
|
||||
/// Constructor for constant instances.
|
||||
const WasmI64(this._value);
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmI64.fromInt(int value);
|
||||
|
||||
external int toInt();
|
||||
@@ -201,6 +218,7 @@ class WasmF32 extends _WasmBase {
|
||||
/// Constructor for constant instances.
|
||||
const WasmF32(this._value);
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmF32.fromDouble(double value);
|
||||
external double toDouble();
|
||||
}
|
||||
@@ -214,6 +232,7 @@ class WasmF64 extends _WasmBase {
|
||||
/// Constructor for constant instances.
|
||||
const WasmF64(this._value);
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmF64.fromDouble(double value);
|
||||
|
||||
external double toDouble();
|
||||
@@ -237,55 +256,77 @@ class WasmArray<T> extends WasmArrayRef {
|
||||
@pragma("wasm:entry-point")
|
||||
final List<Object?> _value;
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmArray(int length);
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmArray.filled(int length, T value);
|
||||
|
||||
const WasmArray.literal(this._value) : super._();
|
||||
}
|
||||
|
||||
extension WasmArrayExt<T> on WasmArray<T> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external T operator [](int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void operator []=(int index, T value);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void copy(
|
||||
int offset,
|
||||
WasmArray<T> source,
|
||||
int sourceOffset,
|
||||
int size,
|
||||
);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void fill(int offset, T value, int size);
|
||||
@pragma("wasm:intrinsic")
|
||||
external WasmArray<T> clone();
|
||||
}
|
||||
|
||||
extension I8ArrayExt on WasmArray<WasmI8> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readSigned(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readUnsigned(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void write(int index, int value);
|
||||
}
|
||||
|
||||
extension I16ArrayExt on WasmArray<WasmI16> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readSigned(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readUnsigned(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void write(int index, int value);
|
||||
}
|
||||
|
||||
extension I32ArrayExt on WasmArray<WasmI32> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readSigned(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readUnsigned(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void write(int index, int value);
|
||||
}
|
||||
|
||||
extension I64ArrayExt on WasmArray<WasmI64> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external int read(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void write(int index, int value);
|
||||
}
|
||||
|
||||
extension F32ArrayExt on WasmArray<WasmF32> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external double read(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void write(int index, double value);
|
||||
}
|
||||
|
||||
extension F64ArrayExt on WasmArray<WasmF64> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external double read(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external void write(int index, double value);
|
||||
}
|
||||
|
||||
@@ -298,40 +339,52 @@ class ImmutableWasmArray<T> extends WasmArrayRef {
|
||||
@pragma("wasm:entry-point")
|
||||
final List<Object?> _value;
|
||||
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory ImmutableWasmArray(int length);
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory ImmutableWasmArray.filled(int length, T value);
|
||||
|
||||
const ImmutableWasmArray.literal(this._value) : super._();
|
||||
}
|
||||
|
||||
extension ImmutableWasmArrayExt<T> on ImmutableWasmArray<T> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external T operator [](int index);
|
||||
}
|
||||
|
||||
extension ImmutableI8ArrayExt on ImmutableWasmArray<WasmI8> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readSigned(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readUnsigned(int index);
|
||||
}
|
||||
|
||||
extension ImmutableI16ArrayExt on ImmutableWasmArray<WasmI16> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readSigned(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readUnsigned(int index);
|
||||
}
|
||||
|
||||
extension ImmutableI32ArrayExt on ImmutableWasmArray<WasmI32> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readSigned(int index);
|
||||
@pragma("wasm:intrinsic")
|
||||
external int readUnsigned(int index);
|
||||
}
|
||||
|
||||
extension ImmutableI64ArrayExt on ImmutableWasmArray<WasmI64> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external int read(int index);
|
||||
}
|
||||
|
||||
extension ImmutableF32ArrayExt on ImmutableWasmArray<WasmF32> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external double read(int index);
|
||||
}
|
||||
|
||||
extension ImmutableF64ArrayExt on ImmutableWasmArray<WasmF64> {
|
||||
@pragma("wasm:intrinsic")
|
||||
external double read(int index);
|
||||
}
|
||||
|
||||
@@ -342,11 +395,13 @@ class WasmFunction<F extends Function> extends WasmFuncRef {
|
||||
///
|
||||
/// The argument must directly name a static function with no optional
|
||||
/// parameters and no type parameters.
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmFunction.fromFunction(F f);
|
||||
|
||||
/// Downcast `funcref` to a typed function reference.
|
||||
///
|
||||
/// Will throw if the reference is not a function with the expected signature.
|
||||
@pragma("wasm:intrinsic")
|
||||
external factory WasmFunction.fromFuncRef(WasmFuncRef ref);
|
||||
|
||||
/// Call the function referred to by this typed function reference.
|
||||
@@ -459,4 +514,5 @@ external WasmExternRef? externRefForJSAny(JSAny object);
|
||||
//
|
||||
// NOTICE: If the object's class is a subtype of T but not a subclass this will
|
||||
// return `false`.
|
||||
@pragma("wasm:intrinsic")
|
||||
external bool isSubClassOf<T>(Object object);
|
||||
|
||||
Reference in New Issue
Block a user