Skip to content

Commit f8f10b8

Browse files
natebiggsCommit Queue
authored andcommitted
[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 <[email protected]> Reviewed-by: Martin Kustermann <[email protected]>
1 parent f49c620 commit f8f10b8

16 files changed

+1230
-803
lines changed

pkg/dart2wasm/lib/intrinsics.dart

Lines changed: 996 additions & 803 deletions
Large diffs are not rendered by default.

pkg/dart2wasm/lib/transformers.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:kernel/type_algebra.dart';
1010
import 'package:kernel/type_environment.dart';
1111

1212
import 'list_factory_specializer.dart';
13+
import 'util.dart';
1314

1415
void transformLibraries(
1516
List<Library> libraries, CoreTypes coreTypes, ClassHierarchy hierarchy) {
@@ -208,6 +209,7 @@ class _WasmTransformer extends Transformer {
208209
isExternal: true,
209210
isSynthetic: true,
210211
fileUri: cls.fileUri);
212+
addPragma(getTypeArguments, 'wasm:intrinsic', coreTypes);
211213
cls.addProcedure(getTypeArguments);
212214
}
213215
return super.visitClass(cls);

sdk/lib/_internal/wasm/lib/boxed_double.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ final class BoxedDouble implements double {
182182
return intBitsToDouble(aBits);
183183
}
184184

185+
@pragma("wasm:intrinsic")
185186
external double operator -();
186187

187188
@pragma("wasm:prefer-inline")
@@ -283,8 +284,11 @@ final class BoxedDouble implements double {
283284
return intBitsToDouble(rounded);
284285
}
285286

287+
@pragma("wasm:intrinsic")
286288
external double floorToDouble();
289+
@pragma("wasm:intrinsic")
287290
external double ceilToDouble();
291+
@pragma("wasm:intrinsic")
288292
external double truncateToDouble();
289293

290294
num clamp(num lowerLimit, num upperLimit) {

sdk/lib/_internal/wasm/lib/boxed_int.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ final class BoxedInt implements int {
1515
@pragma("wasm:entry-point")
1616
BoxedInt._(this.value);
1717

18+
@pragma("wasm:intrinsic")
1819
external num operator +(num other);
20+
@pragma("wasm:intrinsic")
1921
external num operator -(num other);
22+
@pragma("wasm:intrinsic")
2023
external num operator *(num other);
2124

2225
@pragma("wasm:prefer-inline")
@@ -70,10 +73,14 @@ final class BoxedInt implements int {
7073
? this - (this ~/ other) * other
7174
: BoxedDouble.computeRemainder(toDouble(), unsafeCast<double>(other));
7275

76+
@pragma("wasm:intrinsic")
7377
external int operator -();
7478

79+
@pragma("wasm:intrinsic")
7580
external int operator &(int other);
81+
@pragma("wasm:intrinsic")
7682
external int operator |(int other);
83+
@pragma("wasm:intrinsic")
7784
external int operator ^(int other);
7885

7986
@pragma("wasm:prefer-inline")
@@ -121,9 +128,13 @@ final class BoxedInt implements int {
121128
return 0;
122129
}
123130

131+
@pragma("wasm:intrinsic")
124132
external bool operator <(num other);
133+
@pragma("wasm:intrinsic")
125134
external bool operator >(num other);
135+
@pragma("wasm:intrinsic")
126136
external bool operator >=(num other);
137+
@pragma("wasm:intrinsic")
127138
external bool operator <=(num other);
128139

129140
@pragma("wasm:prefer-inline")
@@ -276,6 +287,7 @@ final class BoxedInt implements int {
276287
return this;
277288
}
278289

290+
@pragma("wasm:intrinsic")
279291
external double toDouble();
280292

281293
String toStringAsFixed(int fractionDigits) {
@@ -419,6 +431,7 @@ final class BoxedInt implements int {
419431

420432
int get hashCode => intHashCode(this);
421433

434+
@pragma("wasm:intrinsic")
422435
external int operator ~();
423436
external int get bitLength;
424437

sdk/lib/_internal/wasm/lib/class_id.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ part of "internal_patch.dart";
66

77
@pragma("wasm:entry-point")
88
class ClassID {
9+
@pragma("wasm:intrinsic")
910
external static WasmI32 getID(Object? value);
1011

1112
@pragma("wasm:class-id", "dart.typed_data#_ExternalUint8Array")

sdk/lib/_internal/wasm/lib/closure.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ final class _Closure implements Function {
5656

5757
@pragma("wasm:entry-point")
5858
@pragma("wasm:prefer-inline")
59+
@pragma("wasm:intrinsic")
5960
external static _FunctionType _getClosureRuntimeType(_Closure closure);
6061

6162
@override
@@ -84,35 +85,42 @@ final class _Closure implements Function {
8485
// Helpers for implementing `hashCode`, `operator ==`.
8586

8687
/// Whether the closure is an instantiation.
88+
@pragma("wasm:intrinsic")
8789
external bool get _isInstantiationClosure;
8890

8991
/// When the closure is an instantiation, get the instantiated closure.
9092
///
9193
/// Traps when the closure is not an instantiation.
94+
@pragma("wasm:intrinsic")
9295
external _Closure get _instantiatedClosure;
9396

9497
/// When the closure is an instantiation, returns the combined hash code of
9598
/// the captured types.
9699
///
97100
/// Traps when the closure is not an instantiation.
101+
@pragma("wasm:intrinsic")
98102
external int _instantiationClosureTypeHash();
99103

100104
/// When this [_Closure] and [other] are instantiations, compare captured
101105
/// types for equality.
102106
///
103107
/// Traps when one or both of the closures are not an instantiation.
108+
@pragma("wasm:intrinsic")
104109
external bool _instantiationClosureTypeEquals(_Closure other);
105110

106111
/// Whether the closure is an instance tear-off.
107112
///
108113
/// Instance tear-offs will have receivers.
114+
@pragma("wasm:intrinsic")
109115
external bool get _isInstanceTearOff;
110116

111117
/// When the closure is an instance tear-off, returns the receiver.
112118
///
113119
/// Traps when the closure is not an instance tear-off.
120+
@pragma("wasm:intrinsic")
114121
external Object? get _instanceTearOffReceiver;
115122

116123
/// The vtable of the closure.
124+
@pragma("wasm:intrinsic")
117125
external WasmAnyRef get _vtable;
118126
}

sdk/lib/_internal/wasm/lib/core_patch.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import 'dart:_wasm';
6565
part "closure.dart";
6666
part "double_patch.dart";
6767
part "errors_patch.dart";
68+
part "function_patch.dart";
6869
part "identical_patch.dart";
6970
part "named_parameters.dart";
7071
part "object_patch.dart";

sdk/lib/_internal/wasm/lib/errors_patch.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ class Error {
3232
error._stackTrace ??= stackTrace;
3333
}
3434
}
35+
36+
@patch
37+
@pragma("wasm:intrinsic")
38+
external Never _throw(Object object, StackTrace stackTrace);
3539
}
3640

3741
class _Error extends Error {

sdk/lib/_internal/wasm/lib/ffi_patch.dart

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,116 @@ void _storePointer<S extends NativeType>(
4040
int offsetInBytes,
4141
Pointer<S> value,
4242
) => _storeUint32(typedDataBase, offsetInBytes, value._address.toIntUnsigned());
43+
44+
// The following functions are implemented in the method recognizer.
45+
@patch
46+
@pragma("wasm:intrinsic")
47+
external int _loadInt8(Object typedDataBase, int offsetInBytes);
48+
49+
@patch
50+
@pragma("wasm:intrinsic")
51+
external int _loadInt16(Object typedDataBase, int offsetInBytes);
52+
53+
@patch
54+
@pragma("wasm:intrinsic")
55+
external int _loadInt32(Object typedDataBase, int offsetInBytes);
56+
57+
@patch
58+
@pragma("wasm:intrinsic")
59+
external int _loadInt64(Object typedDataBase, int offsetInBytes);
60+
61+
@patch
62+
@pragma("wasm:intrinsic")
63+
external int _loadUint8(Object typedDataBase, int offsetInBytes);
64+
65+
@patch
66+
@pragma("wasm:intrinsic")
67+
external int _loadUint16(Object typedDataBase, int offsetInBytes);
68+
69+
@patch
70+
@pragma("wasm:intrinsic")
71+
external int _loadUint32(Object typedDataBase, int offsetInBytes);
72+
73+
@patch
74+
@pragma("wasm:intrinsic")
75+
external int _loadUint64(Object typedDataBase, int offsetInBytes);
76+
77+
@patch
78+
@pragma("wasm:intrinsic")
79+
external double _loadFloat(Object typedDataBase, int offsetInBytes);
80+
81+
@patch
82+
@pragma("wasm:intrinsic")
83+
external double _loadDouble(Object typedDataBase, int offsetInBytes);
84+
85+
@patch
86+
@pragma("wasm:intrinsic")
87+
external double _loadFloatUnaligned(Object typedDataBase, int offsetInBytes);
88+
89+
@patch
90+
@pragma("wasm:intrinsic")
91+
external double _loadDoubleUnaligned(Object typedDataBase, int offsetInBytes);
92+
93+
@patch
94+
@pragma("wasm:intrinsic")
95+
external void _storeInt8(Object typedDataBase, int offsetInBytes, int value);
96+
97+
@patch
98+
@pragma("wasm:intrinsic")
99+
external void _storeInt16(Object typedDataBase, int offsetInBytes, int value);
100+
101+
@patch
102+
@pragma("wasm:intrinsic")
103+
external void _storeInt32(Object typedDataBase, int offsetInBytes, int value);
104+
105+
@patch
106+
@pragma("wasm:intrinsic")
107+
external void _storeInt64(Object typedDataBase, int offsetInBytes, int value);
108+
109+
@patch
110+
@pragma("wasm:intrinsic")
111+
external void _storeUint8(Object typedDataBase, int offsetInBytes, int value);
112+
113+
@patch
114+
@pragma("wasm:intrinsic")
115+
external void _storeUint16(Object typedDataBase, int offsetInBytes, int value);
116+
117+
@patch
118+
@pragma("wasm:intrinsic")
119+
external void _storeUint32(Object typedDataBase, int offsetInBytes, int value);
120+
121+
@patch
122+
@pragma("wasm:intrinsic")
123+
external void _storeUint64(Object typedDataBase, int offsetInBytes, int value);
124+
125+
@patch
126+
@pragma("wasm:intrinsic")
127+
external void _storeFloat(
128+
Object typedDataBase,
129+
int offsetInBytes,
130+
double value,
131+
);
132+
133+
@patch
134+
@pragma("wasm:intrinsic")
135+
external void _storeDouble(
136+
Object typedDataBase,
137+
int offsetInBytes,
138+
double value,
139+
);
140+
141+
@patch
142+
@pragma("wasm:intrinsic")
143+
external void _storeFloatUnaligned(
144+
Object typedDataBase,
145+
int offsetInBytes,
146+
double value,
147+
);
148+
149+
@patch
150+
@pragma("wasm:intrinsic")
151+
external void _storeDoubleUnaligned(
152+
Object typedDataBase,
153+
int offsetInBytes,
154+
double value,
155+
);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
part of "core_patch.dart";
6+
7+
@patch
8+
class Function {
9+
@patch
10+
@pragma("wasm:intrinsic")
11+
external static apply(
12+
Function function,
13+
List<dynamic>? positionalArguments, [
14+
Map<Symbol, dynamic>? namedArguments,
15+
]);
16+
}

0 commit comments

Comments
 (0)