[dart2wasm] Split patch files by whether they use JS interop

The eventual goal of the `dart2wasm_standalone` platform is to not rely
on a JavaScript environment, which requires rewriting everything that
currently relies on `js_interop` or `JS()` helpers.

Since most of the patches are still written in Dart and we don't want
to duplicate that code for the standalone target, this splits patch
files by whether they rely on JS-interop or not. The main entrypoint
for each patch (e.g. `lib/_internal/wasm/lib/core_patch.dart`) no
longer relies on JS-interop and can safely be used in the standalone
target. Part files that previously needed to use JS-interop have been
moved into separate patches now, which allows us to migrate them
incrementally.

In some cases, it was easier to add new patch files:

- Similar to the split between `boxed_int` and the `toString` helper
  patch, we now have the same for `boxed_double`.
- The functionality to copy from JS typed data wrappers into Dart typed
  lists wouldn't work with standalone, so I've moved it into a separate
  method we can patch to be a noop.
- `dart:_wasm` exposes APIs to convert between `JSAny` and `externref`.
  This is part of a public API, but I had to move those declarations
  into a patch file because they wouldn't work with standalone.
  Arguably, a separate library (`dart:_wasm_js_interop`?) would be
  cleaner but it might be fine as long as `dart:_wasm` is experimental?

For now, new patch files relying on JS interop are also applied to the
standalone target. They are marked with a comment indicating that they
need to be migrated though.

Change-Id: I583f23f6cc1a3fc7332962292d69f3a7b0327409
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/489660
Reviewed-by: Slava Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
This commit is contained in:
Simon Binder
2026-04-13 03:44:43 -07:00
committed by Commit Queue
parent 56df2ae167
commit 152cc247e0
25 changed files with 738 additions and 543 deletions
+4 -139
View File
@@ -5,8 +5,6 @@
import "dart:_error_utils";
import 'dart:_boxed_int' show intHashCode;
import 'dart:_internal' show doubleToIntBits, intBitsToDouble;
import 'dart:_js_helper' show JS;
import 'dart:_string';
import 'dart:_wasm';
@pragma("wasm:entry-point")
@@ -332,146 +330,13 @@ final class BoxedDouble implements double {
);
static int _cacheEvictIndex = 0;
String toString() {
final int bits = doubleToIntBits(value);
external String toString();
if (bits == doubleToIntBits(0.0)) return '0.0';
if (bits == doubleToIntBits(-0.0)) return '-0.0';
if (bits == doubleToIntBits(1.0)) return '1.0';
if (bits == doubleToIntBits(-1.0)) return '-1.0';
external toStringAsFixed(int fractionDigits);
for (int i = 0; i < CACHE_LENGTH; i++) {
// Special cases such as -0.0/0.0 and NaN are never inserted into the
// cache.
if (bits == _cacheKeys[i]) {
return _cacheValues[i];
}
}
if (isNaN) return "NaN";
if (isInfinite) {
if (isNegative) return "-Infinity";
return "Infinity";
}
external String toStringAsExponential([int? fractionDigits]);
String result = JSStringImpl.fromRefUnchecked(
JS<WasmExternRef?>(
'Function.prototype.call.bind(Number.prototype.toString)',
WasmF64.fromDouble(value),
),
);
if (this % 1.0 == 0.0 && result.indexOf('e') == -1) {
result = '$result.0';
}
// Replace the least recently inserted entry.
_cacheKeys[_cacheEvictIndex] = bits;
_cacheValues[_cacheEvictIndex] = result;
_cacheEvictIndex = (_cacheEvictIndex + 1) & CACHE_MASK;
return result;
}
String toStringAsFixed(int fractionDigits) {
// See ECMAScript-262, 15.7.4.5 for details.
// Step 2.
// 0 <= fractionDigits <= 20
RangeErrorUtils.checkValueBetweenZeroAndPositiveMax(
fractionDigits,
20,
"fractionDigits",
);
// Step 3.
double x = this;
// Step 4.
if (isNaN) return "NaN";
if (this == double.infinity) return "Infinity";
if (this == -double.infinity) return "-Infinity";
// Step 5 and 6 skipped. Will be dealt with by native function.
// Step 7.
if (x >= 1e21 || x <= -1e21) {
return x.toString();
}
String result = _toStringAsFixed(fractionDigits);
if (this == 0 && isNegative) return '-$result';
return result;
}
String _toStringAsFixed(int fractionDigits) => JSStringImpl.fromRefUnchecked(
JS<WasmExternRef>(
"(d, digits) => d.toFixed(digits)",
value,
fractionDigits.toDouble(),
),
);
String toStringAsExponential([int? fractionDigits]) {
// See ECMAScript-262, 15.7.4.6 for details.
// The EcmaScript specification checks for NaN and Infinity before looking
// at the fractionDigits. In Dart we are consistent with toStringAsFixed and
// look at the fractionDigits first.
// Step 7.
if (fractionDigits != null) {
// 0 <= fractionDigits <= 20
RangeErrorUtils.checkValueBetweenZeroAndPositiveMax(
fractionDigits,
20,
"fractionDigits",
);
}
if (isNaN) return "NaN";
if (this == double.infinity) return "Infinity";
if (this == -double.infinity) return "-Infinity";
String result = _toStringAsExponential(fractionDigits);
if (this == 0 && isNegative) return '-$result';
return result;
}
String _toStringAsExponential(int? fractionDigits) =>
JSStringImpl.fromRefUnchecked(
fractionDigits == null
? JS<WasmExternRef>("d => d.toExponential()", value)
: JS<WasmExternRef>(
"(d, f) => d.toExponential(f)",
value,
fractionDigits.toDouble(),
),
);
String toStringAsPrecision(int precision) {
// See ECMAScript-262, 15.7.4.7 for details.
// The EcmaScript specification checks for NaN and Infinity before looking
// at the fractionDigits. In Dart we are consistent with toStringAsFixed and
// look at the fractionDigits first.
// Step 8.
RangeErrorUtils.checkValueInInterval(precision, 1, 21, "precision");
if (isNaN) return "NaN";
if (this == double.infinity) return "Infinity";
if (this == -double.infinity) return "-Infinity";
String result = _toStringAsPrecision(precision);
if (this == 0 && isNegative) return '-$result';
return result;
}
String _toStringAsPrecision(int fractionDigits) =>
JSStringImpl.fromRefUnchecked(
JS<WasmExternRef>(
"(d, precision) => d.toPrecision(precision)",
value,
fractionDigits.toDouble(),
),
);
external String toStringAsPrecision(int precision);
// Order is: NaN > Infinity > ... > 0.0 > -0.0 > ... > -Infinity.
int compareTo(num other) {
@@ -0,0 +1,155 @@
// Copyright (c) 2026, 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 "dart:_internal" show doubleToIntBits, intBitsToDouble, patch;
import 'dart:_js_helper' show JS;
import 'dart:_string';
@patch
class BoxedDouble {
@patch
String toString() {
final int bits = doubleToIntBits(value);
if (bits == doubleToIntBits(0.0)) return '0.0';
if (bits == doubleToIntBits(-0.0)) return '-0.0';
if (bits == doubleToIntBits(1.0)) return '1.0';
if (bits == doubleToIntBits(-1.0)) return '-1.0';
for (int i = 0; i < CACHE_LENGTH; i++) {
// Special cases such as -0.0/0.0 and NaN are never inserted into the
// cache.
if (bits == _cacheKeys[i]) {
return _cacheValues[i];
}
}
if (isNaN) return "NaN";
if (isInfinite) {
if (isNegative) return "-Infinity";
return "Infinity";
}
String result = JSStringImpl.fromRefUnchecked(
JS<WasmExternRef?>(
'Function.prototype.call.bind(Number.prototype.toString)',
WasmF64.fromDouble(value),
),
);
if (this % 1.0 == 0.0 && result.indexOf('e') == -1) {
result = '$result.0';
}
// Replace the least recently inserted entry.
_cacheKeys[_cacheEvictIndex] = bits;
_cacheValues[_cacheEvictIndex] = result;
_cacheEvictIndex = (_cacheEvictIndex + 1) & CACHE_MASK;
return result;
}
@patch
String toStringAsFixed(int fractionDigits) {
// See ECMAScript-262, 15.7.4.5 for details.
// Step 2.
// 0 <= fractionDigits <= 20
RangeErrorUtils.checkValueBetweenZeroAndPositiveMax(
fractionDigits,
20,
"fractionDigits",
);
// Step 3.
double x = this;
// Step 4.
if (isNaN) return "NaN";
if (this == double.infinity) return "Infinity";
if (this == -double.infinity) return "-Infinity";
// Step 5 and 6 skipped. Will be dealt with by native function.
// Step 7.
if (x >= 1e21 || x <= -1e21) {
return x.toString();
}
String result = _toStringAsFixed(fractionDigits);
if (this == 0 && isNegative) return '-$result';
return result;
}
String _toStringAsFixed(int fractionDigits) => JSStringImpl.fromRefUnchecked(
JS<WasmExternRef>(
"(d, digits) => d.toFixed(digits)",
value,
fractionDigits.toDouble(),
),
);
@patch
String toStringAsExponential([int? fractionDigits]) {
// See ECMAScript-262, 15.7.4.6 for details.
// The EcmaScript specification checks for NaN and Infinity before looking
// at the fractionDigits. In Dart we are consistent with toStringAsFixed and
// look at the fractionDigits first.
// Step 7.
if (fractionDigits != null) {
// 0 <= fractionDigits <= 20
RangeErrorUtils.checkValueBetweenZeroAndPositiveMax(
fractionDigits,
20,
"fractionDigits",
);
}
if (isNaN) return "NaN";
if (this == double.infinity) return "Infinity";
if (this == -double.infinity) return "-Infinity";
String result = _toStringAsExponential(fractionDigits);
if (this == 0 && isNegative) return '-$result';
return result;
}
String _toStringAsExponential(int? fractionDigits) =>
JSStringImpl.fromRefUnchecked(
fractionDigits == null
? JS<WasmExternRef>("d => d.toExponential()", value)
: JS<WasmExternRef>(
"(d, f) => d.toExponential(f)",
value,
fractionDigits.toDouble(),
),
);
@patch
String toStringAsPrecision(int precision) {
// See ECMAScript-262, 15.7.4.7 for details.
// The EcmaScript specification checks for NaN and Infinity before looking
// at the fractionDigits. In Dart we are consistent with toStringAsFixed and
// look at the fractionDigits first.
// Step 8.
RangeErrorUtils.checkValueInInterval(precision, 1, 21, "precision");
if (isNaN) return "NaN";
if (this == double.infinity) return "Infinity";
if (this == -double.infinity) return "-Infinity";
String result = _toStringAsPrecision(precision);
if (this == 0 && isNegative) return '-$result';
return result;
}
String _toStringAsPrecision(int fractionDigits) =>
JSStringImpl.fromRefUnchecked(
JS<WasmExternRef>(
"(d, precision) => d.toPrecision(precision)",
value,
fractionDigits.toDouble(),
),
);
}
@@ -1,4 +1,4 @@
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// Copyright (c) 2026, 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.
@@ -31,20 +31,8 @@ import "dart:_internal"
import 'dart:_error_utils';
import "dart:_internal" as _internal;
import 'dart:_js_helper'
show
JS,
JSSyntaxRegExp,
quoteStringForRegExp,
jsStringFromDartString,
stringify,
JavaScriptStack,
JSExternWrapperExt;
import 'dart:_list';
import 'dart:_string' show JSStringImpl, JSStringImplExt;
import "dart:collection"
show
HashMap,
@@ -64,25 +52,17 @@ import 'dart:math' show Random;
import "dart:typed_data";
import 'dart:_object_helper';
import 'dart:_string_helper';
import 'dart:_wasm';
import 'internal_patch.dart';
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";
part "record_patch.dart";
part "regexp_patch.dart";
part "stack_trace_patch.dart";
part "stopwatch_patch.dart";
part "type.dart";
part "uri_patch.dart";
typedef _Smi = int; // For compatibility with VM patch files
@@ -1,8 +1,18 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// Copyright (c) 2026, 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 "internal_patch.dart";
import 'dart:async';
import 'dart:js_interop'
show
JSPromise,
JSPromiseToFuture,
JSString,
ListToJSArray,
StringToJSString;
import 'dart:_js_helper' show dartifyRaw, JSValue, JSAnyToExternRef;
import 'dart:_string' show JSStringImpl;
import 'dart:_wasm';
/// Contains active futures for any entities (either module names or IDs)
/// currently being loaded.
+3 -1
View File
@@ -2,7 +2,9 @@
// 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";
import "dart:_internal" show patch;
import 'dart:_js_helper' show JS;
import 'dart:_js_helper';
@patch
class double {
@@ -1,8 +1,23 @@
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// Copyright (c) 2026, 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 "internal_patch.dart";
import 'dart:js_interop'
show
ByteBufferToJSArrayBuffer,
JSArray,
JSFunction,
JSFunctionUtilExtension,
JSString,
JSArrayToList,
JSStringToString,
JSPromise,
JSPromiseToFuture,
ListToJSArray,
StringToJSString;
import 'dart:_js_helper' show dartifyRaw, JSValue, JSAnyToExternRef;
import 'dart:_wasm';
import 'dart:typed_data' show Uint8List;
@pragma("wasm:import", "moduleLoadingHelper.loadDynamicModuleFromUri")
external WasmExternRef _loadModuleFromUri(
@@ -0,0 +1,16 @@
// Copyright (c) 2026, 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 "dart:_js_helper" show JS, jsStringFromDartString, JSExternWrapperExt;
import 'dart:_string' show JSStringImpl;
import 'dart:_wasm';
String jsonEncode(String object) =>
// Use checked boxing as `JSON.stringify` can be patched by users.
JSStringImpl.fromRef(
JS<WasmExternRef>(
"s => JSON.stringify(s)",
jsStringFromDartString(object).wrappedExternRef,
),
);
@@ -2,39 +2,9 @@
// 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 'dart:async';
import "dart:_js_helper"
show
JS,
JSAnyToExternRef,
jsStringFromDartString,
jsUint8ArrayFromDartUint8List,
JSExternWrapperExt;
import "dart:_js_types" show JSStringImpl;
import 'dart:_string';
import 'dart:js_interop'
show
ByteBufferToJSArrayBuffer,
JSArray,
JSFunction,
JSFunctionUtilExtension,
JSString,
JSArrayToList,
JSStringToString,
JSPromise,
JSPromiseToFuture,
ListToJSArray,
StringToJSString;
import 'dart:_js_helper' show dartifyRaw, JSValue;
import 'dart:_js_types';
import 'dart:_wasm';
import 'dart:math';
import 'dart:typed_data' show Uint8List;
part "class_id.dart";
part "deferred.dart";
part "dynamic_module.dart";
part "print_patch.dart";
part "symbol_patch.dart";
// Compilation to Wasm is always fully null safe.
@@ -121,59 +91,6 @@ external int doubleToIntBits(double value);
@pragma("wasm:intrinsic")
external double intBitsToDouble(int value);
@pragma("wasm:prefer-inline")
void _invokeMainArg0(WasmExternRef jsArrayRef, Function() mainMethod) {
mainMethod();
return;
}
@pragma("wasm:prefer-inline")
void _invokeMainArg1(
WasmExternRef jsArrayRef,
Function(List<String>) mainMethod,
) {
final jsArray = (JSValue(jsArrayRef) as JSArray<JSString>).toDart;
final args = <String>[for (final jsValue in jsArray) jsValue.toDart];
mainMethod(List.unmodifiable(args));
return;
}
@pragma("wasm:prefer-inline")
void _invokeMainArg2(
WasmExternRef jsArrayRef,
Function(List<String>, Null) mainMethod,
) {
final jsArray = (JSValue(jsArrayRef) as JSArray<JSString>).toDart;
final args = <String>[for (final jsValue in jsArray) jsValue.toDart];
mainMethod(List.unmodifiable(args), null);
return;
}
// Will be patched in `pkg/dart2wasm/lib/compile.dart` right before TFA.
external void _invokeMainInternal(WasmExternRef jsArray);
/// Used to invoke the `main` function from JS, printing any exceptions that
/// escape.
@pragma("wasm:export", "\$invokeMain")
void _invokeMain(WasmExternRef jsArrayRef) {
try {
_invokeMainInternal(jsArrayRef);
} catch (e, s) {
print(e);
print(s);
rethrow;
}
}
String jsonEncode(String object) =>
// Use checked boxing as `JSON.stringify` can be patched by users.
JSStringImpl.fromRef(
JS<WasmExternRef>(
"s => JSON.stringify(s)",
jsStringFromDartString(object).wrappedExternRef,
),
);
/// Whether to check bounds in [IndexErrorUtils.checkIndex],
/// which are used in list and typed data implementations.
///
@@ -0,0 +1,52 @@
// Copyright (c) 2026, 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 'dart:js_interop'
show JSArray, JSArrayToList, JSString, JSStringToString;
import 'dart:_js_helper' show JSValue;
import 'dart:_wasm';
@pragma("wasm:prefer-inline")
void _invokeMainArg0(WasmExternRef jsArrayRef, Function() mainMethod) {
mainMethod();
return;
}
@pragma("wasm:prefer-inline")
void _invokeMainArg1(
WasmExternRef jsArrayRef,
Function(List<String>) mainMethod,
) {
final jsArray = (JSValue(jsArrayRef) as JSArray<JSString>).toDart;
final args = <String>[for (final jsValue in jsArray) jsValue.toDart];
mainMethod(List.unmodifiable(args));
return;
}
@pragma("wasm:prefer-inline")
void _invokeMainArg2(
WasmExternRef jsArrayRef,
Function(List<String>, Null) mainMethod,
) {
final jsArray = (JSValue(jsArrayRef) as JSArray<JSString>).toDart;
final args = <String>[for (final jsValue in jsArray) jsValue.toDart];
mainMethod(List.unmodifiable(args), null);
return;
}
// Will be patched in `pkg/dart2wasm/lib/compile.dart` right before TFA.
external void _invokeMainInternal(WasmExternRef jsArray);
/// Used to invoke the `main` function from JS, printing any exceptions that
/// escape.
@pragma("wasm:export", "\$invokeMain")
void _invokeMain(WasmExternRef jsArrayRef) {
try {
_invokeMainInternal(jsArrayRef);
} catch (e, s) {
print(e);
print(s);
rethrow;
}
}
@@ -0,0 +1,147 @@
// Copyright (c) 2026, 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 "dart:_error_utils";
import "dart:_internal" show patch;
import "dart:js_interop";
import "dart:_js_types" show JSUint8ArrayImpl;
import "dart:_wasm";
@patch
double atan2(num a, num b) => _atan2(a.toDouble(), b.toDouble());
@patch
double sin(num radians) => _sin(radians.toDouble());
@patch
double cos(num radians) => _cos(radians.toDouble());
@patch
double tan(num radians) => _tan(radians.toDouble());
@patch
double acos(num x) => _acos(x.toDouble());
@patch
double asin(num x) => _asin(x.toDouble());
@patch
double atan(num x) => _atan(x.toDouble());
@patch
double sqrt(num x) => x.toDouble().sqrt();
@patch
double exp(num x) => _exp(x.toDouble());
@patch
double log(num x) => _log(x.toDouble());
@pragma("wasm:import", "Math.pow")
external double _doublePow(double base, double exponent);
@pragma("wasm:import", "Math.atan2")
external double _atan2(double a, double b);
@pragma("wasm:import", "Math.sin")
external double _sin(double x);
@pragma("wasm:import", "Math.cos")
external double _cos(double x);
@pragma("wasm:import", "Math.tan")
external double _tan(double x);
@pragma("wasm:import", "Math.acos")
external double _acos(double x);
@pragma("wasm:import", "Math.asin")
external double _asin(double x);
@pragma("wasm:import", "Math.atan")
external double _atan(double x);
@pragma("wasm:import", "Math.exp")
external double _exp(double x);
@pragma("wasm:import", "Math.log")
external double _log(double x);
@JS('crypto')
external _JSCrypto get _jsCryptoGetter;
final _JSCrypto _jsCrypto = _jsCryptoGetter;
extension type _JSCrypto._(JSObject _jsCrypto) implements JSObject {}
extension _JSCryptoGetRandomValues on _JSCrypto {
@JS('getRandomValues')
external void getRandomValues(JSUint8Array array);
}
@JS('Math')
external _JSMath get _jsMathGetter;
final _JSMath _jsMath = _jsMathGetter;
extension type _JSMath._(JSObject _jsMath) implements JSObject {}
extension _JSMathRandom on _JSMath {
@JS('random')
external double random();
}
@patch
class _Random {
@patch
static int _initialSeed() {
final low = (_jsMath.random() * 4294967295.0).toInt();
final high = (_jsMath.random() * 4294967295.0).toInt();
return ((high << 32) | low);
}
}
class _SecureRandom implements Random {
final JSUint8ArrayImpl _buffer = JSUint8ArrayImpl(8);
_SecureRandom() {
// Throw early in constructor if entropy source is not hooked up.
_getBytes(1);
}
// Return count bytes of entropy as an integer; count <= 8.
int _getBytes(int count) {
final JSUint8ArrayImpl bufferView = JSUint8ArrayImpl.view(
_buffer.buffer,
0,
count,
);
final JSUint8Array bufferViewJS = bufferView.toJS;
_jsCrypto.getRandomValues(bufferViewJS);
int value = 0;
for (int i = 0; i < count; i += 1) {
value = (value << 8) | bufferView[i];
}
return value;
}
int nextInt(int max) {
RangeErrorUtils.checkValueInInterval(
max,
1,
_POW2_32,
"max",
"Must be positive and <= 2^32",
);
final byteCount =
((max - 1).bitLength + 7) >> 3; // Divide number of bits by 8, round up.
if (byteCount == 0) {
return 0; // Not random if max == 1.
}
var rnd;
var result;
do {
rnd = _getBytes(byteCount);
result = rnd % max;
} while ((rnd - result + max) > (1 << (byteCount << 3)));
return result;
}
double nextDouble() {
return (_getBytes(7) >> 3) / _POW2_53_D;
}
bool nextBool() {
return _getBytes(1).isEven;
}
// Constants used by the algorithm.
static const _POW2_32 = 1 << 32;
static const _POW2_53_D = 1.0 * (1 << 53);
}
+1 -136
View File
@@ -4,8 +4,6 @@
import "dart:_error_utils";
import "dart:_internal" show mix64, patch;
import "dart:_js_types" show JSUint8ArrayImpl;
import "dart:js_interop";
import "dart:_wasm";
/// There are no parts of this patch library.
@@ -81,9 +79,6 @@ num pow(num x, num exponent) {
return _doublePow(xDouble, exponentDouble);
}
@pragma("wasm:import", "Math.pow")
external double _doublePow(double base, double exponent);
int _intPow(int base, int exponent) {
// Exponentiation by squaring.
int result = 1;
@@ -100,46 +95,6 @@ int _intPow(int base, int exponent) {
return result;
}
@patch
double atan2(num a, num b) => _atan2(a.toDouble(), b.toDouble());
@patch
double sin(num radians) => _sin(radians.toDouble());
@patch
double cos(num radians) => _cos(radians.toDouble());
@patch
double tan(num radians) => _tan(radians.toDouble());
@patch
double acos(num x) => _acos(x.toDouble());
@patch
double asin(num x) => _asin(x.toDouble());
@patch
double atan(num x) => _atan(x.toDouble());
@patch
double sqrt(num x) => x.toDouble().sqrt();
@patch
double exp(num x) => _exp(x.toDouble());
@patch
double log(num x) => _log(x.toDouble());
@pragma("wasm:import", "Math.atan2")
external double _atan2(double a, double b);
@pragma("wasm:import", "Math.sin")
external double _sin(double x);
@pragma("wasm:import", "Math.cos")
external double _cos(double x);
@pragma("wasm:import", "Math.tan")
external double _tan(double x);
@pragma("wasm:import", "Math.acos")
external double _acos(double x);
@pragma("wasm:import", "Math.asin")
external double _asin(double x);
@pragma("wasm:import", "Math.atan")
external double _atan(double x);
@pragma("wasm:import", "Math.exp")
external double _exp(double x);
@pragma("wasm:import", "Math.log")
external double _log(double x);
// TODO(iposva): Handle patch methods within a patch class correctly.
@patch
class Random {
@@ -229,11 +184,7 @@ class _Random implements Random {
static int _setupSeed(int seed) => mix64(seed);
static int _initialSeed() {
final low = (_jsMath.random() * 4294967295.0).toInt();
final high = (_jsMath.random() * 4294967295.0).toInt();
return ((high << 32) | low);
}
external static int _initialSeed();
static int _nextSeed() {
// Trigger the PRNG once to change the internal state.
@@ -241,89 +192,3 @@ class _Random implements Random {
return _prng._stateLow;
}
}
@JS('crypto')
external _JSCrypto get _jsCryptoGetter;
final _JSCrypto _jsCrypto = _jsCryptoGetter;
extension type _JSCrypto._(JSObject _jsCrypto) implements JSObject {}
extension _JSCryptoGetRandomValues on _JSCrypto {
@JS('getRandomValues')
external void getRandomValues(JSUint8Array array);
}
@JS('Math')
external _JSMath get _jsMathGetter;
final _JSMath _jsMath = _jsMathGetter;
extension type _JSMath._(JSObject _jsMath) implements JSObject {}
extension _JSMathRandom on _JSMath {
@JS('random')
external double random();
}
class _SecureRandom implements Random {
final JSUint8ArrayImpl _buffer = JSUint8ArrayImpl(8);
_SecureRandom() {
// Throw early in constructor if entropy source is not hooked up.
_getBytes(1);
}
// Return count bytes of entropy as an integer; count <= 8.
int _getBytes(int count) {
final JSUint8ArrayImpl bufferView = JSUint8ArrayImpl.view(
_buffer.buffer,
0,
count,
);
final JSUint8Array bufferViewJS = bufferView.toJS;
_jsCrypto.getRandomValues(bufferViewJS);
int value = 0;
for (int i = 0; i < count; i += 1) {
value = (value << 8) | bufferView[i];
}
return value;
}
int nextInt(int max) {
RangeErrorUtils.checkValueInInterval(
max,
1,
_POW2_32,
"max",
"Must be positive and <= 2^32",
);
final byteCount =
((max - 1).bitLength + 7) >> 3; // Divide number of bits by 8, round up.
if (byteCount == 0) {
return 0; // Not random if max == 1.
}
var rnd;
var result;
do {
rnd = _getBytes(byteCount);
result = rnd % max;
} while ((rnd - result + max) > (1 << (byteCount << 3)));
return result;
}
double nextDouble() {
return (_getBytes(7) >> 3) / _POW2_53_D;
}
bool nextBool() {
return _getBytes(1).isEven;
}
// Constants used by the algorithm.
static const _POW2_32 = 1 << 32;
static const _POW2_53_D = 1.0 * (1 << 53);
}
+1 -1
View File
@@ -2,7 +2,7 @@
// 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 "internal_patch.dart";
import "dart:_js_helper" show JS, jsStringFromDartString, JSExternWrapperExt;
@patch
void printToConsole(String line) => JS<void>(
+2 -1
View File
@@ -2,7 +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.
part of "core_patch.dart";
import 'dart:_js_helper' show JSSyntaxRegExp, quoteStringForRegExp;
import 'dart:_internal' show patch;
@patch
class RegExp {
@@ -2,7 +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.
part of "core_patch.dart";
import 'dart:_internal' show patch;
import 'dart:_js_helper' show JavaScriptStack;
@patch
class StackTrace {
@@ -2,7 +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.
part of "core_patch.dart";
import 'dart:_internal' show patch;
import 'dart:_js_helper' show JS;
@patch
class Stopwatch {
+28 -72
View File
@@ -28,8 +28,6 @@ import 'dart:_internal'
WhereTypeIterable;
import 'dart:_simd';
import 'dart:_wasm';
import 'dart:_js_types';
import 'dart:_js_helper';
import 'dart:collection' show ListBase;
import 'dart:math' show Random;
@@ -1923,6 +1921,18 @@ mixin _IntListMixin implements TypedDataList<int> {
}
}
/// Outside of the standalone build, checks if [from] is a JS typed array and
/// copies contents into a WASM array.
///
/// Returns whether a copy was made, or false if [from] is not a typed array.
external bool tryCopyExternalIntTypedData(
Iterable<int> from,
_IntListMixin to,
int start,
int skipCount,
int count,
);
mixin _TypedIntListMixin<SpawnedType extends TypedDataList<int>>
on _IntListMixin {
SpawnedType _createList(int length);
@@ -1943,48 +1953,8 @@ mixin _TypedIntListMixin<SpawnedType extends TypedDataList<int>>
throw UnsupportedError("Cannot modify an unmodifiable list");
}
if (from is JSIntegerArrayBase) {
// We only add this mixin to typed lists in this library so we know
// `this` is `TypedData`.
final fromTypedData = unsafeCast<JSIntegerArrayBase>(from);
final fromElementSize = fromTypedData.elementSizeInBytes;
if (fromElementSize == 1 && this is WasmI8ArrayBase) {
final destTypedData = unsafeCast<WasmI8ArrayBase>(this);
copyToWasmI8Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return;
}
if (fromElementSize == 2 && this is WasmI16ArrayBase) {
final destTypedData = unsafeCast<WasmI16ArrayBase>(this);
copyToWasmI16Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return;
}
if (fromElementSize == 4 && this is _WasmI32ArrayBase) {
final destTypedData = unsafeCast<_WasmI32ArrayBase>(this);
copyToWasmI32Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return;
}
// NOTICE: We currently don't have `JSUint64Array` classes in
// `dart:js_interop`.
if (tryCopyExternalIntTypedData(from, this, start, skipCount, count)) {
return;
}
if (from is TypedData) {
@@ -2375,6 +2345,18 @@ mixin _DoubleListMixin implements TypedDataList<double> {
}
}
/// Outside of the standalone build, checks if [from] is a JS typed array and
/// copies contents into a WASM array.
///
/// Returns whether a copy was made, or false if [from] is not a typed array.
external bool tryCopyExternalFloatTypedData(
Iterable<double> from,
_DoubleListMixin to,
int start,
int skipCount,
int count,
);
mixin _TypedDoubleListMixin<SpawnedType extends TypedDataList<double>>
on _DoubleListMixin {
SpawnedType _createList(int length);
@@ -2399,34 +2381,8 @@ mixin _TypedDoubleListMixin<SpawnedType extends TypedDataList<double>>
throw UnsupportedError("Cannot modify an unmodifiable list");
}
if (from is JSFloatArrayBase) {
// We only add this mixin to typed lists in this library so we know
// `this` is `TypedData`.
final fromTypedData = unsafeCast<JSFloatArrayBase>(from);
final fromElementSize = fromTypedData.elementSizeInBytes;
if (fromElementSize == 4 && this is _WasmF32ArrayBase) {
final destTypedData = unsafeCast<_WasmF32ArrayBase>(this);
copyToWasmF32Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return;
}
if (fromElementSize == 8 && this is _WasmF64ArrayBase) {
final destTypedData = unsafeCast<_WasmF64ArrayBase>(this);
copyToWasmF64Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return;
}
if (tryCopyExternalFloatTypedData(from, this, start, skipCount, count)) {
return;
}
if (from is TypedData) {
@@ -0,0 +1,103 @@
// Copyright (c) 2026, 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 'dart:_internal' show patch, unsafeCast;
import 'dart:_js_types';
import 'dart:_js_helper';
@patch
bool tryCopyExternalIntTypedData(
Iterable<int> from,
_IntListMixin to,
int start,
int skipCount,
int count,
) {
if (from is JSIntegerArrayBase) {
// We only add this mixin to typed lists in this library so we know
// `this` is `TypedData`.
final fromTypedData = unsafeCast<JSIntegerArrayBase>(from);
final fromElementSize = fromTypedData.elementSizeInBytes;
if (fromElementSize == 1 && to is WasmI8ArrayBase) {
final destTypedData = unsafeCast<WasmI8ArrayBase>(to);
copyToWasmI8Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return true;
}
if (fromElementSize == 2 && to is WasmI16ArrayBase) {
final destTypedData = unsafeCast<WasmI16ArrayBase>(to);
copyToWasmI16Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return true;
}
if (fromElementSize == 4 && to is _WasmI32ArrayBase) {
final destTypedData = unsafeCast<_WasmI32ArrayBase>(to);
copyToWasmI32Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return true;
}
// NOTICE: We currently don't have `JSUint64Array` classes in
// `dart:js_interop`.
}
return false;
}
@patch
bool tryCopyExternalFloatTypedData(
Iterable<double> from,
_DoubleListMixin to,
int start,
int skipCount,
int count,
) {
if (from is JSFloatArrayBase) {
// We only add this mixin to typed lists in this library so we know
// `this` is `TypedData`.
final fromTypedData = unsafeCast<JSFloatArrayBase>(from);
final fromElementSize = fromTypedData.elementSizeInBytes;
if (fromElementSize == 4 && to is _WasmF32ArrayBase) {
final destTypedData = unsafeCast<_WasmF32ArrayBase>(to);
copyToWasmF32Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return true;
}
if (fromElementSize == 8 && to is _WasmF64ArrayBase) {
final destTypedData = unsafeCast<_WasmF64ArrayBase>(to);
copyToWasmF64Array(
fromTypedData.toJSArrayExternRef()!,
skipCount,
destTypedData.data,
destTypedData.offsetInElements + start,
count,
);
return true;
}
}
return false;
}
+5 -1
View File
@@ -2,7 +2,11 @@
// 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";
import 'dart:_internal' show patch;
import 'dart:_js_helper' show JS;
import 'dart:_string';
import 'dart:_wasm';
import 'dart:convert' show Encoding, utf8;
@patch
class Uri {
@@ -2,17 +2,16 @@
// 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 "dart:_internal" show patch;
import "dart:_js_helper";
import "dart:_wasm";
import "dart:js_interop";
@patch
extension WasmExternRefToJSAny on WasmExternRef {
@patch
JSAny get toJS => JSValue.box(this) as JSAny;
}
@patch
// Note: We would make this an extension method on JSAny, but external methods
// on JS interop types are assumed to be JS interop functions, not methods that
// are patched in patch files. So instead we just use a plain function here.
WasmExternRef? externRefForJSAny(JSAny object) =>
(object as JSValue).toExternRef;
@@ -1,4 +1,4 @@
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// Copyright (c) 2026, 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.
-11
View File
@@ -4,8 +4,6 @@
library dart._wasm;
import 'dart:js_interop';
part 'memory.dart';
// A collection a special Dart types that are mapped directly to Wasm types
@@ -787,15 +785,6 @@ extension DoubleWasmInstructions on double {
double sqrt() => this.toWasmF64().sqrt().toDouble();
}
extension WasmExternRefToJSAny on WasmExternRef {
external JSAny get toJS;
}
// Note: We would make this an extension method on JSAny, but external methods
// on JS interop types are assumed to be JS interop functions, not methods that
// are patched in patch files. So instead we just use a plain function here.
external WasmExternRef? externRefForJSAny(JSAny object);
// Tests whether the given object's class is a subclass of T.
//
// NOTICE: If the object's class is a subtype of T but not a subclass this will
+94 -28
View File
@@ -144,6 +144,7 @@
"_internal/vm_shared/lib/bigint_patch.dart",
"_internal/vm_shared/lib/bool_patch.dart",
"_internal/vm_shared/lib/date_patch.dart",
"_internal/wasm/lib/double_patch.dart",
"_internal/vm_shared/lib/map_patch.dart",
"_internal/vm_shared/lib/null_patch.dart",
"_internal/wasm/lib/array_patch.dart",
@@ -152,9 +153,13 @@
"_internal/wasm/lib/date_patch_patch.dart",
"_internal/wasm/lib/int_common_patch.dart",
"_internal/wasm/lib/int_patch.dart",
"_internal/wasm/lib/regexp_patch.dart",
"_internal/wasm/lib/stack_trace_patch.dart",
"_internal/wasm/lib/string_buffer_patch.dart",
"_internal/wasm/lib/string_patch.dart",
"_internal/wasm/lib/stopwatch_patch.dart",
"_internal/wasm/lib/sync_star_patch.dart",
"_internal/wasm/lib/uri_patch.dart",
"_internal/wasm/lib/weak_patch.dart"
]
},
@@ -173,13 +178,16 @@
},
"_boxed_int": {
"uri": "_internal/wasm/lib/boxed_int.dart",
"patches": "_internal/wasm/lib/boxed_int_to_string.dart"
"patches": "_internal/wasm/lib/boxed_int_patch.dart"
},
"_string": {
"uri": "_internal/wasm/lib/js_string.dart"
},
"_typed_data": {
"uri": "_internal/wasm/lib/typed_data.dart"
"uri": "_internal/wasm/lib/typed_data.dart",
"patches": [
"_internal/wasm/lib/typed_data_copy_from_js.dart"
]
},
"_js_helper": {
"uri": "_internal/wasm/lib/js_helper.dart",
@@ -208,6 +216,7 @@
"_internal/vm_shared/lib/bigint_patch.dart",
"_internal/vm_shared/lib/bool_patch.dart",
"_internal/vm_shared/lib/date_patch.dart",
"_internal/wasm/lib/double_patch.dart",
"_internal/vm_shared/lib/map_patch.dart",
"_internal/vm_shared/lib/null_patch.dart",
"_internal/wasm/lib/array_patch.dart",
@@ -216,7 +225,11 @@
"_internal/wasm/lib/date_patch_patch.dart",
"_internal/wasm/lib/int_common_patch.dart",
"_internal/wasm/lib/int_patch.dart",
"_internal/wasm/lib/regexp_patch.dart",
"_internal/wasm/lib/stack_trace_patch.dart",
"_internal/wasm/lib/stopwatch_patch.dart",
"_internal/wasm/lib/sync_star_patch.dart",
"_internal/wasm/lib/uri_patch.dart",
"_internal/wasm/lib/weak_patch.dart",
"_internal/wasm_js_compatibility/lib/string_buffer_patch.dart",
"_internal/wasm_js_compatibility/lib/string_patch.dart"
@@ -231,7 +244,7 @@
},
"_boxed_int": {
"uri": "_internal/wasm/lib/boxed_int.dart",
"patches": "_internal/wasm_js_compatibility/lib/boxed_int_to_string.dart"
"patches": "_internal/wasm_js_compatibility/lib/boxed_int_patch.dart"
},
"_string": {
"uri": "_internal/wasm/lib/js_string.dart"
@@ -272,12 +285,17 @@
"_internal/wasm/lib/array_patch.dart",
"_internal/wasm/lib/bigint_patch_patch.dart",
"_internal/wasm/lib/core_patch.dart",
"_internal/wasm/lib/double_patch.dart",
"_internal/wasm/lib/date_patch_patch.dart",
"_internal/wasm/lib/int_common_patch.dart",
"_internal/wasm/lib/int_patch.dart",
"_internal/wasm/lib/regexp_patch.dart",
"_internal/wasm/lib/stack_trace_patch.dart",
"_internal/wasm/lib/string_buffer_patch.dart",
"_internal/wasm/lib/string_patch.dart",
"_internal/wasm/lib/stopwatch_patch.dart",
"_internal/wasm/lib/sync_star_patch.dart",
"_internal/wasm/lib/uri_patch.dart",
"_internal/wasm/lib/weak_patch.dart"
]
},
@@ -287,6 +305,12 @@
"_internal/wasm/lib/convert_patch.dart"
]
},
"developer": {
"uri": "developer/developer.dart",
"patches": [
"_internal/js_runtime/lib/developer_patch.dart"
]
},
"typed_data": {
"uri": "typed_data/typed_data.dart",
"patches": [
@@ -296,19 +320,50 @@
},
"_boxed_int": {
"uri": "_internal/wasm/lib/boxed_int.dart",
"patches": "_internal/wasm/lib/boxed_int_to_string.dart"
"patches": "_internal/wasm/lib/boxed_int_patch.dart"
},
"_boxed_double": {
"uri": "_internal/wasm/lib/boxed_double.dart",
"patches": [
"_internal/wasm/lib/boxed_double_patch.dart"
]
},
"_string": {
"uri": "_internal/wasm/lib/js_string.dart"
},
"_typed_data": {
"uri": "_internal/wasm/lib/typed_data.dart"
"uri": "_internal/wasm/lib/typed_data.dart",
"patches": [
"_internal/wasm/lib/typed_data_copy_from_js.dart"
]
},
"_js_helper": {
"uri": "_internal/wasm/lib/js_helper.dart",
"patches": [
"_internal/wasm/lib/js_helper_patch.dart"
]
},
"_internal": {
"uri": "internal/internal.dart",
"patches": [
"_internal/wasm/lib/internal_patch.dart",
"_internal/wasm/lib/deferred_patch.dart",
"_internal/wasm/lib/dynamic_module_patch.dart",
"_internal/wasm/lib/internal_json_encode_patch.dart",
"_internal/wasm/lib/invoke_main_patch.dart",
"_internal/wasm/lib/print_patch.dart"
]
},
"_wasm": {
"uri": "_wasm/wasm_types.dart",
"patches": "_internal/wasm/lib/wasm_types_patch.dart"
},
"math": {
"uri": "math/math.dart",
"patches": [
"_internal/wasm/lib/math_patch.dart",
"_internal/wasm/lib/math_externs_patch.dart"
]
}
}
},
@@ -319,12 +374,46 @@
}
],
"libraries": {
"_boxed_double": {
"uri": "_internal/wasm/lib/boxed_double.dart",
"patches": [
"_internal/wasm/lib/boxed_double_patch.dart"
]
},
"_internal": {
"uri": "internal/internal.dart",
"patches": [
"_internal/wasm/lib/internal_patch.dart",
"_internal/wasm/lib/deferred_patch.dart",
"_internal/wasm/lib/dynamic_module_patch.dart",
"_internal/wasm/lib/internal_json_encode_patch.dart",
"_internal/wasm/lib/invoke_main_patch.dart",
"_internal/wasm/lib/print_patch.dart"
]
},
"_wasm": {
"uri": "_wasm/wasm_types.dart",
"patches": "_internal/wasm/lib/wasm_types_patch.dart"
},
"async": {
"uri": "async/async.dart",
"patches": [
"_internal/wasm/lib/async_patch.dart",
"_internal/wasm/lib/timer_patch.dart"
]
},
"developer": {
"uri": "developer/developer.dart",
"patches": [
"_internal/js_runtime/lib/developer_patch.dart"
]
},
"math": {
"uri": "math/math.dart",
"patches": [
"_internal/wasm/lib/math_patch.dart",
"_internal/wasm/lib/math_externs_patch.dart"
]
}
}
},
@@ -342,9 +431,6 @@
"_boxed_int": {
"uri": "_internal/wasm/lib/boxed_int.dart"
},
"_boxed_double": {
"uri": "_internal/wasm/lib/boxed_double.dart"
},
"_compact_hash": {
"uri": "_internal/wasm/lib/compact_hash.dart"
},
@@ -357,12 +443,6 @@
"_internal/js_shared/lib/http_patch.dart"
]
},
"_internal": {
"uri": "internal/internal.dart",
"patches": [
"_internal/wasm/lib/internal_patch.dart"
]
},
"_js_string_convert": {
"uri": "_internal/wasm/lib/js_string_convert.dart"
},
@@ -381,10 +461,6 @@
"_string_helper": {
"uri": "_internal/wasm/lib/string_helper.dart"
},
"_wasm": {
"uri": "_wasm/wasm_types.dart",
"patches": "_internal/wasm/lib/wasm_types_patch.dart"
},
"collection": {
"uri": "collection/collection.dart",
"patches": [
@@ -392,12 +468,6 @@
"_internal/wasm/lib/hash_factories.dart"
]
},
"developer": {
"uri": "developer/developer.dart",
"patches": [
"_internal/js_runtime/lib/developer_patch.dart"
]
},
"ffi": {
"uri": "ffi/ffi.dart",
"patches": [
@@ -430,10 +500,6 @@
"js_interop_unsafe": {
"uri": "js_interop_unsafe/js_interop_unsafe.dart",
"patches": "_internal/wasm/lib/js_interop_unsafe_patch.dart"
},
"math": {
"uri": "math/math.dart",
"patches": "_internal/wasm/lib/math_patch.dart"
}
}
},
+79 -28
View File
@@ -133,6 +133,7 @@ wasm:
- _internal/vm_shared/lib/bigint_patch.dart
- _internal/vm_shared/lib/bool_patch.dart
- _internal/vm_shared/lib/date_patch.dart
- _internal/wasm/lib/double_patch.dart
- _internal/vm_shared/lib/map_patch.dart
- _internal/vm_shared/lib/null_patch.dart
- _internal/wasm/lib/array_patch.dart
@@ -141,9 +142,13 @@ wasm:
- _internal/wasm/lib/date_patch_patch.dart
- _internal/wasm/lib/int_common_patch.dart
- _internal/wasm/lib/int_patch.dart
- _internal/wasm/lib/regexp_patch.dart
- _internal/wasm/lib/stack_trace_patch.dart
- _internal/wasm/lib/string_buffer_patch.dart
- _internal/wasm/lib/string_patch.dart
- _internal/wasm/lib/stopwatch_patch.dart
- _internal/wasm/lib/sync_star_patch.dart
- _internal/wasm/lib/uri_patch.dart
- _internal/wasm/lib/weak_patch.dart
convert:
uri: convert/convert.dart
@@ -157,11 +162,13 @@ wasm:
_boxed_int:
uri: _internal/wasm/lib/boxed_int.dart
patches:
_internal/wasm/lib/boxed_int_to_string.dart
_internal/wasm/lib/boxed_int_patch.dart
_string:
uri: _internal/wasm/lib/js_string.dart
_typed_data:
uri: _internal/wasm/lib/typed_data.dart
patches:
- _internal/wasm/lib/typed_data_copy_from_js.dart
_js_helper:
uri: _internal/wasm/lib/js_helper.dart
patches:
@@ -181,6 +188,7 @@ wasm_js_compatibility:
- _internal/vm_shared/lib/bigint_patch.dart
- _internal/vm_shared/lib/bool_patch.dart
- _internal/vm_shared/lib/date_patch.dart
- _internal/wasm/lib/double_patch.dart
- _internal/vm_shared/lib/map_patch.dart
- _internal/vm_shared/lib/null_patch.dart
- _internal/wasm/lib/array_patch.dart
@@ -189,7 +197,11 @@ wasm_js_compatibility:
- _internal/wasm/lib/date_patch_patch.dart
- _internal/wasm/lib/int_common_patch.dart
- _internal/wasm/lib/int_patch.dart
- _internal/wasm/lib/regexp_patch.dart
- _internal/wasm/lib/stack_trace_patch.dart
- _internal/wasm/lib/stopwatch_patch.dart
- _internal/wasm/lib/sync_star_patch.dart
- _internal/wasm/lib/uri_patch.dart
- _internal/wasm/lib/weak_patch.dart
- _internal/wasm_js_compatibility/lib/string_buffer_patch.dart
- _internal/wasm_js_compatibility/lib/string_patch.dart
@@ -201,7 +213,7 @@ wasm_js_compatibility:
_boxed_int:
uri: _internal/wasm/lib/boxed_int.dart
patches:
_internal/wasm_js_compatibility/lib/boxed_int_to_string.dart
_internal/wasm_js_compatibility/lib/boxed_int_patch.dart
_string:
uri: _internal/wasm/lib/js_string.dart
_js_helper:
@@ -220,8 +232,6 @@ wasm_standalone:
patches:
- _internal/wasm/lib/async_patch.dart
- _internal/wasm_standalone/lib/timer_patch.dart
# Not yet migrated
core:
uri: core/core.dart
patches:
@@ -233,17 +243,26 @@ wasm_standalone:
- _internal/wasm/lib/array_patch.dart
- _internal/wasm/lib/bigint_patch_patch.dart
- _internal/wasm/lib/core_patch.dart
- _internal/wasm/lib/date_patch_patch.dart
- _internal/wasm/lib/double_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/date_patch_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/int_common_patch.dart
- _internal/wasm/lib/int_patch.dart
- _internal/wasm/lib/string_buffer_patch.dart
- _internal/wasm/lib/string_patch.dart
- _internal/wasm/lib/regexp_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/stack_trace_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/string_buffer_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/string_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/stopwatch_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/sync_star_patch.dart
- _internal/wasm/lib/weak_patch.dart
- _internal/wasm/lib/uri_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/weak_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
convert:
uri: convert/convert.dart
patches:
- _internal/wasm/lib/convert_patch.dart
- _internal/wasm/lib/convert_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
developer:
uri: developer/developer.dart
patches:
- _internal/js_runtime/lib/developer_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
typed_data:
uri: typed_data/typed_data.dart
patches:
@@ -252,25 +271,73 @@ wasm_standalone:
_boxed_int:
uri: _internal/wasm/lib/boxed_int.dart
patches:
_internal/wasm/lib/boxed_int_to_string.dart
_internal/wasm/lib/boxed_int_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
_boxed_double:
uri: _internal/wasm/lib/boxed_double.dart
patches:
- _internal/wasm/lib/boxed_double_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
_string:
uri: _internal/wasm/lib/js_string.dart
uri: _internal/wasm/lib/js_string.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
_typed_data:
uri: _internal/wasm/lib/typed_data.dart
_js_helper:
patches:
- _internal/wasm/lib/typed_data_copy_from_js.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
_js_helper: # TODO(53884): Remove once other wasm_standalone patches no longer reference this
uri: _internal/wasm/lib/js_helper.dart
patches:
- _internal/wasm/lib/js_helper_patch.dart
_internal:
uri: internal/internal.dart
patches:
- _internal/wasm/lib/internal_patch.dart
- _internal/wasm/lib/deferred_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/dynamic_module_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/internal_json_encode_patch.dart # Needs to be migrated
- _internal/wasm/lib/invoke_main_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
- _internal/wasm/lib/print_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
_wasm:
uri: _wasm/wasm_types.dart
patches: _internal/wasm/lib/wasm_types_patch.dart # TODO(53884): Remove once other wasm_standalone patches no longer reference this
math:
uri: math/math.dart
patches:
- _internal/wasm/lib/math_patch.dart
- _internal/wasm/lib/math_externs_patch.dart # TODO(53884): Rewrite without JS interop in _internal/wasm_standalone
wasm_js_common:
include:
- target: "wasm_common"
libraries:
_boxed_double:
uri: _internal/wasm/lib/boxed_double.dart
patches:
- _internal/wasm/lib/boxed_double_patch.dart
_internal:
uri: internal/internal.dart
patches:
- _internal/wasm/lib/internal_patch.dart
- _internal/wasm/lib/deferred_patch.dart
- _internal/wasm/lib/dynamic_module_patch.dart
- _internal/wasm/lib/internal_json_encode_patch.dart
- _internal/wasm/lib/invoke_main_patch.dart
- _internal/wasm/lib/print_patch.dart
_wasm:
uri: _wasm/wasm_types.dart
patches: _internal/wasm/lib/wasm_types_patch.dart
async:
uri: async/async.dart
patches:
- _internal/wasm/lib/async_patch.dart
- _internal/wasm/lib/timer_patch.dart
developer:
uri: developer/developer.dart
patches:
- _internal/js_runtime/lib/developer_patch.dart
math:
uri: math/math.dart
patches:
- _internal/wasm/lib/math_patch.dart
- _internal/wasm/lib/math_externs_patch.dart
wasm_common:
libraries:
@@ -282,8 +349,6 @@ wasm_common:
uri: _internal/wasm/lib/boxed_bool.dart
_boxed_int:
uri: _internal/wasm/lib/boxed_int.dart
_boxed_double:
uri: _internal/wasm/lib/boxed_double.dart
_compact_hash:
uri: _internal/wasm/lib/compact_hash.dart
_error_utils:
@@ -292,10 +357,6 @@ wasm_common:
uri: _http/http.dart
patches:
- _internal/js_shared/lib/http_patch.dart
_internal:
uri: internal/internal.dart
patches:
- _internal/wasm/lib/internal_patch.dart
_js_string_convert:
uri: _internal/wasm/lib/js_string_convert.dart
_js_types:
@@ -308,18 +369,11 @@ wasm_common:
uri: _internal/wasm/lib/simd.dart
_string_helper:
uri: _internal/wasm/lib/string_helper.dart
_wasm:
uri: _wasm/wasm_types.dart
patches: _internal/wasm/lib/wasm_types_patch.dart
collection:
uri: collection/collection.dart
patches:
- _internal/vm_shared/lib/collection_patch.dart
- _internal/wasm/lib/hash_factories.dart
developer:
uri: developer/developer.dart
patches:
- _internal/js_runtime/lib/developer_patch.dart
ffi:
uri: "ffi/ffi.dart"
patches:
@@ -345,9 +399,6 @@ wasm_common:
js_interop_unsafe:
uri: js_interop_unsafe/js_interop_unsafe.dart
patches: _internal/wasm/lib/js_interop_unsafe_patch.dart
math:
uri: math/math.dart
patches: _internal/wasm/lib/math_patch.dart
dart2js:
include:
+10 -10
View File
@@ -16,18 +16,18 @@ const List<(String?, int?, int?, String?)?> frameDetails = [
('source_map_simple_lib.dart', 14, 3, 'f'),
('source_map_simple_lib.dart', 43, 5, 'testMain'),
('source_map_simple_test.dart', 10, 7, 'main'),
('internal_patch.dart', 126, 13, '_invokeMainArg0'),
('invoke_main_patch.dart', 12, 13, '_invokeMainArg0'),
null,
('internal_patch.dart', 160, 5, '_invokeMain'),
('invoke_main_patch.dart', 46, 5, '_invokeMain'),
];
/*
at module0.Error._throwWithCurrentStackTrace <noInline> (wasm://wasm/module0-00110126:wasm-function[108]:0xfd1c)
at module0.g (wasm://wasm/module0-00110126:wasm-function[254]:0x11a8e)
at module0.f (wasm://wasm/module0-00110126:wasm-function[251]:0x11a64)
at module0.testMain (wasm://wasm/module0-00110126:wasm-function[249]:0x115d0)
at module0.main (wasm://wasm/module0-00110126:wasm-function[248]:0x1154b)
at module0._invokeMainArg0 (wasm://wasm/module0-00110126:wasm-function[247]:0x11541)
at module0._invokeMainInternal (wasm://wasm/module0-00110126:wasm-function[82]:0xf8b2)
at module0._invokeMain (wasm://wasm/module0-00110126:wasm-function[77]:0xf815)
at module0.Error._throwWithCurrentStackTrace <noInline> (wasm://wasm/module0-0010c51a:wasm-function[106]:0xf8c1)
at module0.g (wasm://wasm/module0-0010c51a:wasm-function[254]:0x11767)
at module0.f (wasm://wasm/module0-0010c51a:wasm-function[251]:0x1173d)
at module0.testMain (wasm://wasm/module0-0010c51a:wasm-function[249]:0x112aa)
at module0.main (wasm://wasm/module0-0010c51a:wasm-function[248]:0x11226)
at module0._invokeMainArg0 (wasm://wasm/module0-0010c51a:wasm-function[247]:0x1121c)
at module0._invokeMainInternal (wasm://wasm/module0-0010c51a:wasm-function[81]:0xf50f)
at module0._invokeMain (wasm://wasm/module0-0010c51a:wasm-function[76]:0xf476)
*/