Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit c83c9b4

Browse files
mkustermanncommit-bot@chromium.org
authored andcommitted
[vm] Implement toString() for unboxing metadata, only write unboxing metadata if not fully boxed (which is default)
Change-Id: Idf9911551609e063b6ad22f58cc3e3d18ef24ed9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138806 Auto-Submit: Martin Kustermann <[email protected]> Commit-Queue: Martin Kustermann <[email protected]> Reviewed-by: Alexander Markov <[email protected]>
1 parent 7ac2294 commit c83c9b4

33 files changed

+393
-351
lines changed

pkg/vm/lib/metadata/unboxing_info.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,53 @@ class UnboxingInfoMetadata {
2727
growable: true),
2828
returnInfo = source.readByte();
2929

30+
// Returns `true` if all arguments as well as the return value have to be
31+
// boxed.
32+
//
33+
// We don't have to write out metadata for fully boxed methods, because this
34+
// is the default.
35+
bool get isFullyBoxed {
36+
if (returnInfo != kBoxed) return false;
37+
for (int argInfo in unboxedArgsInfo) {
38+
if (argInfo != kBoxed) return false;
39+
}
40+
return true;
41+
}
42+
3043
void writeToBinary(BinarySink sink) {
3144
sink.writeUInt30(unboxedArgsInfo.length);
3245
for (int val in unboxedArgsInfo) {
3346
sink.writeByte(val);
3447
}
3548
sink.writeByte(returnInfo);
3649
}
50+
51+
@override
52+
String toString() {
53+
final sb = StringBuffer();
54+
sb.write('(');
55+
for (int i = 0; i < unboxedArgsInfo.length; ++i) {
56+
final argInfo = unboxedArgsInfo[i];
57+
sb.write(_stringifyUnboxingInfo(argInfo));
58+
if (i != (unboxedArgsInfo.length - 1)) {
59+
sb.write(',');
60+
}
61+
}
62+
sb.write(')');
63+
sb.write('->');
64+
sb.write(_stringifyUnboxingInfo(returnInfo));
65+
return sb.toString();
66+
}
67+
68+
static String _stringifyUnboxingInfo(int info) {
69+
if (info == UnboxingInfoMetadata.kUnboxedIntCandidate) {
70+
return 'i';
71+
} else if (info == UnboxingInfoMetadata.kUnboxedDoubleCandidate) {
72+
return 'd';
73+
}
74+
assert(info == 0);
75+
return 'b';
76+
}
3777
}
3878

3979
class UnboxingInfoMetadataRepository

pkg/vm/lib/transformations/type_flow/transformer.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,8 @@ class AnnotateKernel extends RecursiveVisitor<Null> {
315315

316316
final unboxingInfoMetadata =
317317
_unboxingInfo.getUnboxingInfoOfMember(member);
318-
319-
if (unboxingInfoMetadata != null) {
318+
if (unboxingInfoMetadata != null &&
319+
!unboxingInfoMetadata.isFullyBoxed) {
320320
_unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
321321
}
322322

@@ -340,7 +340,9 @@ class AnnotateKernel extends RecursiveVisitor<Null> {
340340
UnboxingInfoMetadata.kBoxed;
341341
}
342342
}
343-
_unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
343+
if (!unboxingInfoMetadata.isFullyBoxed) {
344+
_unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
345+
}
344346
}
345347
}
346348

pkg/vm/testcases/transformations/type_flow/transformer/abstract_class_entry_point.dart.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ import "dart:core" as core;
55
@#C3
66
abstract class AbstractEmptyClass extends core::Object {
77
}
8-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → dynamic {}
8+
static method main() → dynamic {}

pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,21 @@ abstract class ParametrizedAnnotation<T extends core::Object* = dynamic> extends
1818
[@vm.unreachable.metadata=] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] final field self::ParametrizedAnnotation::T* foo;
1919
}
2020
abstract class A extends core::Object {
21-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata'] static method staticMethod() → void {}
21+
static method staticMethod() → void {}
2222
}
2323
@#C6
2424
class B extends core::Object {
25-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata'] synthetic constructor •() → self::B*
25+
synthetic constructor •() → self::B*
2626
: super core::Object::•()
2727
;
28-
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata'] @#C8
28+
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] @#C8
2929
method instanceMethod() → void {}
3030
}
31-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (core::List<core::int*>*) →* void a) → core::int* {
31+
[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (core::List<core::int*>*) →* void a) → core::int* {
3232
@#C9 core::int* x = 2;
3333
return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] x.{core::num::+}(2);
3434
}
35-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']@#C11
35+
@#C11
3636
static method main(core::List<core::String*>* args) → dynamic {
3737
self::A::staticMethod();
3838
[@vm.direct-call.metadata=#lib::B::instanceMethod] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::instanceMethod}();

pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import self as self;
33
import "dart:core" as core;
44
import "dart:_internal" as _in;
55

6-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method isPrime([@vm.inferred-type.metadata=int] dynamic n) → core::bool* {
6+
[@vm.unboxing-info.metadata=(i)->b]static method isPrime([@vm.inferred-type.metadata=int] dynamic n) → core::bool* {
77
if(_in::unsafeCast<core::bool*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool] n.<(2)))
88
return false;
99
for (core::int* i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<=] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::*] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::*}(i).{core::num::<=}(_in::unsafeCast<core::num*>(n)); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
@@ -12,7 +12,7 @@ import "dart:_internal" as _in;
1212
}
1313
return true;
1414
}
15-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi (value: 50000)] core::int* n) → core::int* {
15+
[@vm.unboxing-info.metadata=(i)->b]static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi (value: 50000)] core::int* n) → core::int* {
1616
core::int* counter = 0;
1717
for (core::int* i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
1818
if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
@@ -22,14 +22,14 @@ import "dart:_internal" as _in;
2222
}
2323
}
2424
}
25-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method run() → void {
25+
static method run() → void {
2626
core::int* e = 611953;
2727
core::int* p = [@vm.inferred-type.metadata=int?] self::nThPrimeNumber(50000);
2828
if(![@vm.inferred-type.metadata=dart.core::bool] p.{core::num::==}(e)) {
2929
throw core::Exception::•("Unexpected result: ${p} != ${e}");
3030
}
3131
}
32-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
32+
static method main(core::List<core::String*>* args) → dynamic {
3333
core::Stopwatch* timer = let final core::Stopwatch* #t1 = new core::Stopwatch::•() in let final void #t2 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}() in #t1;
3434
for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
3535
self::run();

pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ class _Vector extends core::Object {
99
[@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] final field core::int* _offset;
1010
[@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7] final field core::int* _length;
1111
[@vm.inferred-type.metadata=dart.typed_data::_Float64List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:8,getterSelectorId:9] final field core::List<core::double*>* _elements;
12-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata'] constructor •([@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] core::int* size) → self::_Vector*
12+
[@vm.unboxing-info.metadata=(i)->b] constructor •([@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] core::int* size) → self::_Vector*
1313
: self::_Vector::_offset = 0, self::_Vector::_length = size, self::_Vector::_elements = [@vm.inferred-type.metadata=dart.typed_data::_Float64List] typ::Float64List::•(size), super core::Object::•()
1414
;
15-
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata'] operator []([@vm.inferred-type.metadata=!] core::int* i) → core::double*
15+
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1] [@vm.unboxing-info.metadata=(b)->d] operator []([@vm.inferred-type.metadata=!] core::int* i) → core::double*
1616
return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}));
17-
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata'] operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int* i, core::double* value) → void {
17+
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2] operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int* i, core::double* value) → void {
1818
let dynamic #t1 = [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements} in let dynamic #t2 = i in let dynamic #t3 = [@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
1919
}
20-
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata'] operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector* a) → core::double* {
20+
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] [@vm.unboxing-info.metadata=(b)->d] operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector* a) → core::double* {
2121
core::double* result = 0.0;
2222
for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1))
2323
result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i)));
@@ -26,7 +26,7 @@ class _Vector extends core::Object {
2626
}
2727
[@vm.inferred-type.metadata=#lib::_Vector?]static field self::_Vector* v = new self::_Vector::•(10);
2828
[@vm.inferred-type.metadata=dart.core::_Double?]static field core::double* x = 0.0;
29-
[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
29+
static method main(core::List<core::String*>* args) → dynamic {
3030
core::Stopwatch* timer = let final core::Stopwatch* #t4 = new core::Stopwatch::•() in let final void #t5 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t4.{core::Stopwatch::start}() in #t4;
3131
for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
3232
self::x = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector::*??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));

0 commit comments

Comments
 (0)