Skip to content

Commit 55bacbf

Browse files
rakudramaCommit Queue
authored andcommitted
[js_runtime] Add JsObject.safeToString via registered hook
Change-Id: Ic3f67e61f5f77b343082bb42c52b0c2b6d14eddc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/423962 Commit-Queue: Stephen Adams <[email protected]> Reviewed-by: Srujan Gaddam <[email protected]>
1 parent e43a6b2 commit 55bacbf

File tree

8 files changed

+366
-66
lines changed

8 files changed

+366
-66
lines changed

pkg/compiler/test/rti/data/generic_methods_dynamic_05.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import 'package:compiler/src/util/testing.dart';
66

77
// Test derived from language/generic_methods_dynamic_test/05
88

9-
/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
10-
/*prod.class: global#JSArray:deps=[List],implicit=[JSArray.E],needsArgs,test*/
9+
/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
10+
/*prod.class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],needsArgs,test*/
1111

12-
/*spec.class: global#List:deps=[C.bar,JSArray.markFixedList],explicit=[List,List<B>,List<Object>,List<Object?>,List<String>?,List<markFixedList.T>],needsArgs,test*/
12+
/*spec.class: global#List:deps=[C.bar,JSArray.markFixedList],explicit=[List,List<B>,List<Object>,List<Object?>,List<SafeToStringHook>,List<String>?,List<markFixedList.T>],needsArgs,test*/
1313
/*prod.class: global#List:deps=[C.bar],explicit=[List,List<B>],needsArgs,test*/
1414

1515
class A {}

pkg/compiler/test/rti/data/list_literal.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
/*spec.class: global#List:deps=[Class.m,JSArray.markFixedList],explicit=[List,List<Object>,List<Object?>,List<String>?,List<markFixedList.T>],needsArgs,test*/
5+
/*spec.class: global#List:deps=[Class.m,JSArray.markFixedList],explicit=[List,List<Object>,List<Object?>,List<SafeToStringHook>,List<String>?,List<markFixedList.T>],needsArgs,test*/
66
/*prod.class: global#List:deps=[Class.m],explicit=[List],needsArgs,test*/
77

8-
/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
9-
/*prod.class: global#JSArray:deps=[List],implicit=[JSArray.E],needsArgs,test*/
8+
/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
9+
/*prod.class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],needsArgs,test*/
1010

1111
main() {
1212
var c = Class();

pkg/compiler/test/rti/data/list_to_set.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
/*spec.class: global#List:deps=[Class,JSArray.markFixedList],explicit=[List,List<Object>,List<Object?>,List<String>?,List<markFixedList.T>],needsArgs,test*/
5+
/*spec.class: global#List:deps=[Class,JSArray.markFixedList],explicit=[List,List<Object>,List<Object?>,List<SafeToStringHook>,List<String>?,List<markFixedList.T>],needsArgs,test*/
66
/*prod.class: global#List:deps=[Class],explicit=[List],needsArgs,test*/
77

8-
/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
9-
/*prod.class: global#JSArray:deps=[List],implicit=[JSArray.E],needsArgs,test*/
8+
/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
9+
/*prod.class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],needsArgs,test*/
1010

1111
main() {
1212
var c = Class<int>();

pkg/compiler/test/rti/data/local_function_list_literal.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
import 'package:compiler/src/util/testing.dart';
66

7-
/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
8-
/*prod.class: global#JSArray:deps=[List],implicit=[JSArray.E],needsArgs,test*/
7+
/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
8+
/*prod.class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],needsArgs,test*/
99

1010
@pragma('dart2js:noInline')
1111
/*member: method:implicit=[method.T],needsArgs,test*/

sdk/lib/_internal/js_runtime/lib/interceptors.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import 'dart:_js_helper'
5151
lookupAndCacheInterceptor,
5252
StringMatch,
5353
firstMatchAfter,
54+
SafeToStringHook,
5455
TrustedGetRuntimeType;
5556

5657
import 'dart:_foreign_helper'

sdk/lib/_internal/js_runtime/lib/js_array.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,26 @@ class JSArray<E> extends JavaScriptObject implements List<E>, JSIndexable<E> {
855855
Type get runtimeType => getRuntimeTypeOfArray(this);
856856
}
857857

858+
class JSArraySafeToStringHook extends SafeToStringHook {
859+
const JSArraySafeToStringHook();
860+
String? tryFormat(Object? array) {
861+
if (array is! JSArray) return null;
862+
863+
final int flags = HArrayFlagsGet(array);
864+
String info = '';
865+
if (flags & ArrayFlags.constantCheck != 0) {
866+
info = 'const, ';
867+
} else if (flags & ArrayFlags.unmodifiableCheck != 0) {
868+
info = 'unmodifiable, ';
869+
} else if (flags & ArrayFlags.fixedLengthCheck != 0) {
870+
info = 'fixed, ';
871+
}
872+
final base = Primitives.objectToHumanReadableString(array);
873+
if (info == '') return base;
874+
return '$base (${info}length: ${array.length})';
875+
}
876+
}
877+
858878
/// Dummy subclasses that allow the backend to track more precise
859879
/// information about arrays through their type. The CPA type inference
860880
/// relies on the fact that these classes do not override [] nor []=.

0 commit comments

Comments
 (0)