From d0a26566115e593c46686c66a8bcdf0a99b60b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Thu, 2 Nov 2023 12:21:24 +0000 Subject: [PATCH] [dart2wasm] Use the same Dart object when to{Upper,Lower}Case returns the argument MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes `identical` checks when the input doesn't need case mapping. This change was originally made in [1], but I'm trying to split it into smaller CLs as it currently has a lot of conflicts with the main branch. [1]: https://dart-review.googlesource.com/c/sdk/+/316628 Change-Id: I88da52a3a73c9d587acefe2b14fd39edaf01c966 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/332200 Reviewed-by: Aske Simon Christensen Commit-Queue: Ömer Ağacan --- sdk/lib/_internal/wasm/lib/js_string.dart | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/sdk/lib/_internal/wasm/lib/js_string.dart b/sdk/lib/_internal/wasm/lib/js_string.dart index 59834a8c00f..e500265d9c5 100644 --- a/sdk/lib/_internal/wasm/lib/js_string.dart +++ b/sdk/lib/_internal/wasm/lib/js_string.dart @@ -319,14 +319,20 @@ final class JSStringImpl implements String { @override String toLowerCase() { - return JSStringImpl( - js.JS('s => s.toLowerCase()', toExternRef)); + final thisRef = toExternRef; + final lowerCaseRef = js.JS('s => s.toLowerCase()', thisRef); + return _jsIdentical(thisRef, lowerCaseRef) + ? this + : JSStringImpl(lowerCaseRef); } @override String toUpperCase() { - return JSStringImpl( - js.JS('s => s.toUpperCase()', toExternRef)); + final thisRef = toExternRef; + final upperCaseRef = js.JS('s => s.toUpperCase()', thisRef); + return _jsIdentical(thisRef, upperCaseRef) + ? this + : JSStringImpl(upperCaseRef); } // Characters with Whitespace property (Unicode 6.3). @@ -679,3 +685,6 @@ JSStringImpl _jsStringToJSStringImpl(WasmExternRef? string) => @pragma("wasm:export", "\$jsStringFromJSStringImpl") WasmExternRef? _jsStringFromJSStringImpl(JSStringImpl string) => string.toExternRef; + +bool _jsIdentical(WasmExternRef? ref1, WasmExternRef? ref2) => + js.JS('Object.is', ref1, ref2);