Skip to content

Commit 022b362

Browse files
askeksacommit-bot@chromium.org
authored andcommitted
[vm/aot/tfa] Add missing visitor methods for call site instrumentation.
Some visitor methods were missing in the TFA transformation, causing some call sites (such as PropertySet) to not be instrumented with metadata communicating the analysis results. Visiting all instance call sites (including PropertySet) is also needed by table dispatch to collect correct summary information on selectors. Change-Id: I488d5cd10700666dab05bd5c5304010aa90b1943 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/135319 Reviewed-by: Samir Jindel <sjindel@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>
1 parent e75c919 commit 022b362

6 files changed

Lines changed: 38 additions & 8 deletions

File tree

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,12 @@ class _DirectInvocation extends _Invocation {
162162
if (selector.member.function != null) {
163163
typeChecksNeeded = selector.member.function.typeParameters
164164
.any((t) => t.isGenericCovariantImpl);
165+
} else {
166+
Field field = selector.member;
167+
if (selector.callKind == CallKind.PropertySet) {
168+
// TODO(dartbug.com/40615): Use TFA results to improve this criterion.
169+
typeChecksNeeded = field.isGenericCovariantImpl;
170+
}
165171
}
166172
}
167173

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,12 @@ class AnnotateKernel extends RecursiveVisitor<Null> {
340340
super.visitPropertyGet(node);
341341
}
342342

343+
@override
344+
visitPropertySet(PropertySet node) {
345+
_annotateCallSite(node, node.interfaceTarget);
346+
super.visitPropertySet(node);
347+
}
348+
343349
@override
344350
visitDirectMethodInvocation(DirectMethodInvocation node) {
345351
_annotateCallSite(node, node.target);
@@ -352,6 +358,12 @@ class AnnotateKernel extends RecursiveVisitor<Null> {
352358
super.visitDirectPropertyGet(node);
353359
}
354360

361+
@override
362+
visitDirectPropertySet(DirectPropertySet node) {
363+
_annotateCallSite(node, node.target);
364+
super.visitDirectPropertySet(node);
365+
}
366+
355367
@override
356368
visitSuperMethodInvocation(SuperMethodInvocation node) {
357369
_annotateCallSite(node, node.interfaceTarget);
@@ -364,6 +376,12 @@ class AnnotateKernel extends RecursiveVisitor<Null> {
364376
super.visitSuperPropertyGet(node);
365377
}
366378

379+
@override
380+
visitSuperPropertySet(SuperPropertySet node) {
381+
_annotateCallSite(node, node.interfaceTarget);
382+
super.visitSuperPropertySet(node);
383+
}
384+
367385
@override
368386
visitStaticInvocation(StaticInvocation node) {
369387
_annotateCallSite(node, node.target);
@@ -375,6 +393,12 @@ class AnnotateKernel extends RecursiveVisitor<Null> {
375393
_annotateCallSite(node, node.target);
376394
super.visitStaticGet(node);
377395
}
396+
397+
@override
398+
visitStaticSet(StaticSet node) {
399+
_annotateCallSite(node, node.target);
400+
super.visitStaticSet(node);
401+
}
378402
}
379403

380404
/// Tree shaking based on results of type flow analysis (TFA).

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCall
5353
static method getDynamic() → dynamic
5454
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
5555
static method setField2([@vm.inferred-type.metadata=#lib::A] self::A* aa, [@vm.inferred-type.metadata=#lib::T2] dynamic value) → void {
56-
[@vm.direct-call.metadata=#lib::A::field2] aa.{self::A::field2} = value;
56+
[@vm.direct-call.metadata=#lib::A::field2] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::field2} = value;
5757
}
5858
static method main(core::List<core::String*>* args) → dynamic {
5959
new self::A::•();

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class A1 extends core::Object {
2020
: super core::Object::•()
2121
;
2222
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = #C1]) → void {
23-
[@vm.direct-call.metadata=#lib::A1::foo] this.{self::A1::foo} = _in::unsafeCast<self::T1*>(a5);
23+
[@vm.direct-call.metadata=#lib::A1::foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A1::foo} = _in::unsafeCast<self::T1*>(a5);
2424
}
2525
}
2626
class B1 extends core::Object {
@@ -43,7 +43,7 @@ class A2 extends core::Object {
4343
: super core::Object::•()
4444
;
4545
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = #C1]) → void {
46-
[@vm.direct-call.metadata=#lib::A2::foo] this.{self::A2::foo} = a6;
46+
[@vm.direct-call.metadata=#lib::A2::foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A2::foo} = a6;
4747
}
4848
}
4949
abstract class B2Base extends core::Object {
@@ -76,7 +76,7 @@ class A3 extends core::Object {
7676
: super core::Object::•()
7777
;
7878
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = #C1]) → void {
79-
[@vm.direct-call.metadata=#lib::A3::foo] this.{self::A3::foo} = a7;
79+
[@vm.direct-call.metadata=#lib::A3::foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A3::foo} = a7;
8080
}
8181
}
8282
class B3 extends core::Object {
@@ -99,7 +99,7 @@ class A4 extends core::Object {
9999
: super core::Object::•()
100100
;
101101
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = #C1, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = #C1]) → void {
102-
[@vm.direct-call.metadata=#lib::A4::foo] this.{self::A4::foo} = a8;
102+
[@vm.direct-call.metadata=#lib::A4::foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A4::foo} = a8;
103103
}
104104
}
105105
class B4 extends core::Object {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ class C extends core::Object {
1616
}
1717
static method main() → void {
1818
null;
19-
[@vm.direct-call.metadata=#lib::C::instanceField] new self::C::•().{self::C::instanceField} = null;
19+
[@vm.direct-call.metadata=#lib::C::instanceField] [@vm.inferred-type.metadata=!? (skip check)] new self::C::•().{self::C::instanceField} = null;
2020
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class A extends core::Object {
99
: super core::Object::•()
1010
;
1111
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method use() → dynamic {
12-
[@vm.direct-call.metadata=#lib::A::x] this.{self::A::x} = 3;
12+
[@vm.direct-call.metadata=#lib::A::x] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A::x} = 3;
1313
}
1414
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] set /*isNullableByDefault*/ x(core::int value) → void;
1515
}
@@ -19,7 +19,7 @@ class B extends core::Object {
1919
: super core::Object::•()
2020
;
2121
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method use() → dynamic {
22-
this.{self::B::x} = 3;
22+
[@vm.inferred-type.metadata=!? (skip check)] this.{self::B::x} = 3;
2323
}
2424
}
2525
[@vm.inferred-type.metadata=dart.core::_Smi?]late static final field core::int staticLateB;

0 commit comments

Comments
 (0)