From 58afe07b7d68f3c27af65d8f06c6aa44c1369ecc Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Wed, 13 Mar 2024 14:28:03 +0100 Subject: [PATCH 1/7] [web] Avoid using `js_util.{jsify,dartify}()` in dart2wasm for converting to JS wrappers The `js_util.jsify()` related code shows up in CPU profile of wonderous. => Any `SkwasmObjectWrapper` object invokes this logic in the constructor and dispose method. This PR * makes `DomFinalizationRegistryExtension` accept JSAny types instead of Dart types and internally converting => Callsites can call more precise `<>.toJS*` extension methods => Avoids extra type checks on the objects * avoids making `toJSAnyShallow` delegate to `toJSAnyDeep` in wasm => `toJSAnyDeep` uses `js_util.jsify()` which is slow => We cannot use `Object.toJSBox` due to it being slower to create JS boxes as it semantically does something different atm (see issue below) => Instead use conditional import of `dart:_wasm` which provides the necessary primitives => Similar for going from JS to Dart. * Avoid calling converting from Dart object to JSAny more than needed (we did the operation twice for each registration and once for unregistration) Issue https://github.com/dart-lang/sdk/issues/55183 change condition move --- .../src/engine/canvaskit/native_memory.dart | 2 +- lib/web_ui/lib/src/engine/dom.dart | 46 ++++++++----------- .../lib/src/engine/skwasm/skwasm_impl.dart | 1 + .../skwasm_impl/dart_js_conversion.dart | 16 +++++++ .../src/engine/skwasm/skwasm_impl/memory.dart | 7 ++- .../lib/src/engine/skwasm/skwasm_stub.dart | 1 + .../skwasm_stub/dart_js_conversion.dart | 13 ++++++ 7 files changed, 56 insertions(+), 30 deletions(-) create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/dart_js_conversion.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_stub/dart_js_conversion.dart diff --git a/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart b/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart index 4b5c85dff526d..27367cc921751 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart @@ -34,7 +34,7 @@ NativeMemoryFinalizationRegistry nativeMemoryFinalizationRegistry = NativeMemory class NativeMemoryFinalizationRegistry { void register(Object owner, UniqueRef ref) { if (browserSupportsFinalizationRegistry) { - _finalizationRegistry.register(owner, ref.toJSBox); + _finalizationRegistry.register(owner.toJSAnyShallow, ref.toJSBox); } } } diff --git a/lib/web_ui/lib/src/engine/dom.dart b/lib/web_ui/lib/src/engine/dom.dart index 386666d6797ae..29eb1c27eac86 100644 --- a/lib/web_ui/lib/src/engine/dom.dart +++ b/lib/web_ui/lib/src/engine/dom.dart @@ -7,6 +7,7 @@ import 'dart:js_interop'; import 'dart:math' as math; import 'dart:typed_data'; +import 'package:ui/src/engine/skwasm/skwasm_stub.dart' if (dart.library.ffi) 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'package:js/js_util.dart' as js_util; import 'package:meta/meta.dart'; @@ -36,27 +37,27 @@ import 'browser_detection.dart'; /// are currently represented across web backends, these extensions should be /// used carefully and only on types that are known to not contains `JSNull` and /// `JSUndefined`. -extension ObjectToJSAnyExtension on Object { - JSAny get toJSAnyShallow { - if (isWasm) { - return toJSAnyDeep; - } else { - return this as JSAny; - } - } +extension ObjectToJSAnyExtension on Object { + // Once `Object.toJSBox` is faster (see + // https://github.com/dart-lang/sdk/issues/55183) we can remove this + // backend-specific workaround. + @pragma('wasm:prefer-inline') + @pragma('dart2js:tryInline') + JSAny get toJSAnyShallow => dartToJsWrapper(this); + + @pragma('wasm:prefer-inline') + @pragma('dart2js:tryInline') JSAny get toJSAnyDeep => js_util.jsify(this) as JSAny; } extension JSAnyToObjectExtension on JSAny { - Object get toObjectShallow { - if (isWasm) { - return toObjectDeep; - } else { - return this; - } - } + @pragma('wasm:prefer-inline') + @pragma('dart2js:tryInline') + Object get toObjectShallow => jsWrapperToDart(this); + @pragma('wasm:prefer-inline') + @pragma('dart2js:tryInline') Object get toObjectDeep => js_util.dartify(this)!; } @@ -3662,22 +3663,13 @@ DomFinalizationRegistry createDomFinalizationRegistry(JSFunction cleanup) => extension DomFinalizationRegistryExtension on DomFinalizationRegistry { @JS('register') - external JSVoid _register1(JSAny target, JSAny value); + external JSVoid register(JSAny target, JSAny value); @JS('register') - external JSVoid _register2(JSAny target, JSAny value, JSAny token); - void register(Object target, Object value, [Object? token]) { - if (token != null) { - _register2( - target.toJSAnyShallow, value.toJSAnyShallow, token.toJSAnyShallow); - } else { - _register1(target.toJSAnyShallow, value.toJSAnyShallow); - } - } + external JSVoid registerWithToken(JSAny target, JSAny value, JSAny token); @JS('unregister') - external JSVoid _unregister(JSAny token); - void unregister(Object token) => _unregister(token.toJSAnyShallow); + external JSVoid unregister(JSAny token); } /// Whether the current browser supports `FinalizationRegistry`. diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart index fd370c7a0fb18..e36e4359c67bc 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart @@ -11,6 +11,7 @@ import 'dart:ffi'; export 'skwasm_impl/canvas.dart'; export 'skwasm_impl/codecs.dart'; +export 'skwasm_impl/dart_js_conversion.dart'; export 'skwasm_impl/filters.dart'; export 'skwasm_impl/font_collection.dart'; export 'skwasm_impl/image.dart'; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/dart_js_conversion.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/dart_js_conversion.dart new file mode 100644 index 0000000000000..dbde1bee5cd5d --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/dart_js_conversion.dart @@ -0,0 +1,16 @@ +// Copyright 2013 The Flutter Authors. 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:_wasm'; +import 'dart:js_interop'; + +@pragma('wasm:prefer-inline') +@pragma('dart2js:tryInline') +JSAny dartToJsWrapper(Object object) => + WasmAnyRef.fromObject(object).externalize().toJS; + +@pragma('wasm:prefer-inline') +@pragma('dart2js:tryInline') +Object jsWrapperToDart(JSAny jsWrapper) => + externRefForJSAny(jsWrapper).internalize()!.toObject(); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart index 030122c83f5e3..95c19dc9cfde7 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart @@ -36,11 +36,14 @@ class SkwasmFinalizationRegistry { final DisposeFunction dispose; void register(SkwasmObjectWrapper wrapper) { - registry.register(wrapper, wrapper.handle.address, wrapper); + final JSAny jsWrapper = wrapper.toJSAnyShallow; + registry.registerWithToken( + jsWrapper, wrapper.handle.address.toJS, jsWrapper); } void evict(SkwasmObjectWrapper wrapper) { - registry.unregister(wrapper); + final JSAny jsWrapper = wrapper.toJSAnyShallow; + registry.unregister(jsWrapper); dispose(wrapper.handle); } } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart index 382d34840e9f6..50c1791aecc2e 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart @@ -6,4 +6,5 @@ // ignore: unnecessary_library_directive library skwasm_stub; +export 'skwasm_stub/dart_js_conversion.dart'; export 'skwasm_stub/renderer.dart'; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/dart_js_conversion.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/dart_js_conversion.dart new file mode 100644 index 0000000000000..b05af5dcff599 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/dart_js_conversion.dart @@ -0,0 +1,13 @@ +// Copyright 2013 The Flutter Authors. 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'; + +@pragma('wasm:prefer-inline') +@pragma('dart2js:tryInline') +JSAny dartToJsWrapper(Object object) => object as JSAny; + +@pragma('wasm:prefer-inline') +@pragma('dart2js:tryInline') +Object jsWrapperToDart(JSAny jsWrapper) => jsWrapper; From e698a6d7d62fe6cc0e6358f87a38e861d7f8ca78 Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Thu, 14 Mar 2024 14:40:40 +0100 Subject: [PATCH 2/7] address lints & fix test --- lib/web_ui/lib/src/engine/dom.dart | 2 +- lib/web_ui/test/canvaskit/canvaskit_api_test.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/lib/src/engine/dom.dart b/lib/web_ui/lib/src/engine/dom.dart index 29eb1c27eac86..281a3ef95d738 100644 --- a/lib/web_ui/lib/src/engine/dom.dart +++ b/lib/web_ui/lib/src/engine/dom.dart @@ -7,9 +7,9 @@ import 'dart:js_interop'; import 'dart:math' as math; import 'dart:typed_data'; -import 'package:ui/src/engine/skwasm/skwasm_stub.dart' if (dart.library.ffi) 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'package:js/js_util.dart' as js_util; import 'package:meta/meta.dart'; +import 'package:ui/src/engine/skwasm/skwasm_stub.dart' if (dart.library.ffi) 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'browser_detection.dart'; diff --git a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart index 6a1fea063ef34..cecbd2c5c6796 100644 --- a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart +++ b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart @@ -1929,7 +1929,7 @@ void _paragraphTests() { // So the test simply tests that a FinalizationRegistry can be constructed // and its `register` method can be called. final DomFinalizationRegistry registry = createDomFinalizationRegistry((String arg) {}.toJS); - registry.register(Object(), Object()); + registry.register(Object().toJSAnyShallow, Object().toJSAnyShallow); }); } From ddb46823af45c06168611ea8bfd7018c8f82ab3a Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Thu, 14 Mar 2024 15:21:38 +0100 Subject: [PATCH 3/7] Revert 41e9b4f8e8e21204807ee1281cfd29ca28551c2f --- .../lib/src/engine/canvaskit/native_memory.dart | 2 +- lib/web_ui/lib/src/engine/dom.dart | 17 ++++++----------- .../test/canvaskit/canvaskit_api_test.dart | 2 +- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart b/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart index 27367cc921751..89b30933b5412 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart @@ -20,7 +20,7 @@ import 'package:ui/src/engine.dart'; /// 4. GC decides to perform a GC cycle and collects CkPaint. /// 5. The finalizer function is called with the SkPaint as the sole argument. /// 6. We call `delete` on SkPaint. -DomFinalizationRegistry _finalizationRegistry = createDomFinalizationRegistry( +DomFinalizationRegistry _finalizationRegistry = DomFinalizationRegistry( (JSBoxedDartObject boxedUniq) { final UniqueRef uniq = boxedUniq.toDart as UniqueRef; uniq.collect(); diff --git a/lib/web_ui/lib/src/engine/dom.dart b/lib/web_ui/lib/src/engine/dom.dart index 281a3ef95d738..c6c63c445a481 100644 --- a/lib/web_ui/lib/src/engine/dom.dart +++ b/lib/web_ui/lib/src/engine/dom.dart @@ -3649,17 +3649,9 @@ extension DomTextDecoderExtension on DomTextDecoder { @JS('window.FinalizationRegistry') @staticInterop -class DomFinalizationRegistry {} - -@JS('window.FinalizationRegistry') -external JSAny? get _finalizationRegistryConstructor; - -// Note: We don't use a factory constructor here because there is an issue in -// dart2js that causes a crash in the Google3 build if we do use a factory -// constructor. See b/284478971 -DomFinalizationRegistry createDomFinalizationRegistry(JSFunction cleanup) => - js_util.callConstructor( - _finalizationRegistryConstructor!.toObjectShallow, [cleanup]); +class DomFinalizationRegistry { + external factory DomFinalizationRegistry(JSFunction cleanup); +} extension DomFinalizationRegistryExtension on DomFinalizationRegistry { @JS('register') @@ -3672,6 +3664,9 @@ extension DomFinalizationRegistryExtension on DomFinalizationRegistry { external JSVoid unregister(JSAny token); } +@JS('window.FinalizationRegistry') +external JSAny? get _finalizationRegistryConstructor; + /// Whether the current browser supports `FinalizationRegistry`. bool browserSupportsFinalizationRegistry = _finalizationRegistryConstructor != null; diff --git a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart index cecbd2c5c6796..888eb0406f3b8 100644 --- a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart +++ b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart @@ -1928,7 +1928,7 @@ void _paragraphTests() { // FinalizationRegistry because it depends on GC, which cannot be controlled, // So the test simply tests that a FinalizationRegistry can be constructed // and its `register` method can be called. - final DomFinalizationRegistry registry = createDomFinalizationRegistry((String arg) {}.toJS); + final DomFinalizationRegistry registry = DomFinalizationRegistry((String arg) {}.toJS); registry.register(Object().toJSAnyShallow, Object().toJSAnyShallow); }); } From 32458ca5e4f9d64271e5326c81f5ca8afb6edc97 Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Thu, 14 Mar 2024 15:27:14 +0100 Subject: [PATCH 4/7] update licenses --- ci/licenses_golden/licenses_flutter | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 477bd20564f91..a6644dfc5fc9b 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -40598,6 +40598,7 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/shadow.dart + ../../../flutte ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/codecs.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/dart_js_conversion.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/filters.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/font_collection.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart + ../../../flutter/LICENSE @@ -40634,6 +40635,7 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/shaders.da ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/dart_js_conversion.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/svg.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/test_embedding.dart + ../../../flutter/LICENSE @@ -43471,6 +43473,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/shadow.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/codecs.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/dart_js_conversion.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/filters.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/font_collection.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart @@ -43507,6 +43510,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/shaders.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/dart_js_conversion.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/svg.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/test_embedding.dart From 702929d26cd8370127acb03fcf6ef0ee1c57439e Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Thu, 14 Mar 2024 15:31:26 +0100 Subject: [PATCH 5/7] update one more place --- lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart index 95c19dc9cfde7..91b0857c6c2c9 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart @@ -28,7 +28,7 @@ typedef DisposeFunction = void Function(Pointer); class SkwasmFinalizationRegistry { SkwasmFinalizationRegistry(this.dispose) - : registry = createDomFinalizationRegistry(((JSNumber address) => + : registry = DomFinalizationRegistry(((JSNumber address) => dispose(Pointer.fromAddress(address.toDartDouble.toInt())) ).toJS); From 097e63eba6fde8534ed61da3da603adc8335724a Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Mon, 18 Mar 2024 08:57:41 +0100 Subject: [PATCH 6/7] Keep old toJSAnyShallow/toObjectShallow, make new toJSWrapper/fromJSWrapper & use only in finalization code --- .../src/engine/canvaskit/native_memory.dart | 4 +-- lib/web_ui/lib/src/engine/dom.dart | 28 ++++++++++++++++--- .../src/engine/skwasm/skwasm_impl/memory.dart | 4 +-- .../test/canvaskit/canvaskit_api_test.dart | 2 +- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart b/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart index 89b30933b5412..0ef83b4b9810e 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart @@ -22,7 +22,7 @@ import 'package:ui/src/engine.dart'; /// 6. We call `delete` on SkPaint. DomFinalizationRegistry _finalizationRegistry = DomFinalizationRegistry( (JSBoxedDartObject boxedUniq) { - final UniqueRef uniq = boxedUniq.toDart as UniqueRef; + final UniqueRef uniq = boxedUniq.fromJSWrapper as UniqueRef; uniq.collect(); }.toJS ); @@ -34,7 +34,7 @@ NativeMemoryFinalizationRegistry nativeMemoryFinalizationRegistry = NativeMemory class NativeMemoryFinalizationRegistry { void register(Object owner, UniqueRef ref) { if (browserSupportsFinalizationRegistry) { - _finalizationRegistry.register(owner.toJSAnyShallow, ref.toJSBox); + _finalizationRegistry.register(owner.toJSWrapper, ref.toJSWrapper); } } } diff --git a/lib/web_ui/lib/src/engine/dom.dart b/lib/web_ui/lib/src/engine/dom.dart index c6c63c445a481..9c7223cc43acd 100644 --- a/lib/web_ui/lib/src/engine/dom.dart +++ b/lib/web_ui/lib/src/engine/dom.dart @@ -9,7 +9,8 @@ import 'dart:typed_data'; import 'package:js/js_util.dart' as js_util; import 'package:meta/meta.dart'; -import 'package:ui/src/engine/skwasm/skwasm_stub.dart' if (dart.library.ffi) 'package:ui/src/engine/skwasm/skwasm_impl.dart'; +import 'package:ui/src/engine/skwasm/skwasm_stub.dart' + if (dart.library.ffi) 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'browser_detection.dart'; @@ -37,14 +38,23 @@ import 'browser_detection.dart'; /// are currently represented across web backends, these extensions should be /// used carefully and only on types that are known to not contains `JSNull` and /// `JSUndefined`. - extension ObjectToJSAnyExtension on Object { // Once `Object.toJSBox` is faster (see // https://github.com/dart-lang/sdk/issues/55183) we can remove this // backend-specific workaround. @pragma('wasm:prefer-inline') @pragma('dart2js:tryInline') - JSAny get toJSAnyShallow => dartToJsWrapper(this); + JSAny get toJSWrapper => dartToJsWrapper(this); + + @pragma('wasm:prefer-inline') + @pragma('dart2js:tryInline') + JSAny get toJSAnyShallow { + if (isWasm) { + return toJSAnyDeep; + } else { + return this as JSAny; + } + } @pragma('wasm:prefer-inline') @pragma('dart2js:tryInline') @@ -54,7 +64,17 @@ extension ObjectToJSAnyExtension on Object { extension JSAnyToObjectExtension on JSAny { @pragma('wasm:prefer-inline') @pragma('dart2js:tryInline') - Object get toObjectShallow => jsWrapperToDart(this); + Object get fromJSWrapper => jsWrapperToDart(this); + + @pragma('wasm:prefer-inline') + @pragma('dart2js:tryInline') + Object get toObjectShallow { + if (isWasm) { + return toObjectDeep; + } else { + return this; + } + } @pragma('wasm:prefer-inline') @pragma('dart2js:tryInline') diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart index 91b0857c6c2c9..c0f9a8470b3ba 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart @@ -36,13 +36,13 @@ class SkwasmFinalizationRegistry { final DisposeFunction dispose; void register(SkwasmObjectWrapper wrapper) { - final JSAny jsWrapper = wrapper.toJSAnyShallow; + final JSAny jsWrapper = wrapper.toJSWrapper; registry.registerWithToken( jsWrapper, wrapper.handle.address.toJS, jsWrapper); } void evict(SkwasmObjectWrapper wrapper) { - final JSAny jsWrapper = wrapper.toJSAnyShallow; + final JSAny jsWrapper = wrapper.toJSWrapper; registry.unregister(jsWrapper); dispose(wrapper.handle); } diff --git a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart index 888eb0406f3b8..69d9f6bf85967 100644 --- a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart +++ b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart @@ -1929,7 +1929,7 @@ void _paragraphTests() { // So the test simply tests that a FinalizationRegistry can be constructed // and its `register` method can be called. final DomFinalizationRegistry registry = DomFinalizationRegistry((String arg) {}.toJS); - registry.register(Object().toJSAnyShallow, Object().toJSAnyShallow); + registry.register(Object().toJSWrapper, Object().toJSWrapper); }); } From 525432b6f61b5419f633e50193e58183facb4453 Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Mon, 18 Mar 2024 12:33:47 +0100 Subject: [PATCH 7/7] hand-format import line --- lib/web_ui/lib/src/engine/dom.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/web_ui/lib/src/engine/dom.dart b/lib/web_ui/lib/src/engine/dom.dart index 9c7223cc43acd..8dfa57b2a9420 100644 --- a/lib/web_ui/lib/src/engine/dom.dart +++ b/lib/web_ui/lib/src/engine/dom.dart @@ -9,8 +9,7 @@ import 'dart:typed_data'; import 'package:js/js_util.dart' as js_util; import 'package:meta/meta.dart'; -import 'package:ui/src/engine/skwasm/skwasm_stub.dart' - if (dart.library.ffi) 'package:ui/src/engine/skwasm/skwasm_impl.dart'; +import 'package:ui/src/engine/skwasm/skwasm_stub.dart' if (dart.library.ffi) 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'browser_detection.dart';