Skip to content

Commit e7a88b9

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[vm] Tree shake stub targets
Stub target references for member signatures, forwarding stubs and mixin stubs should be removed when tree shaking. Otherwise we might end up with dangling references if the stub target was tree shaken. Closes #44716 TEST=existing tests Change-Id: I5fd67c0ab8db588ecbe5c40101bbea662e1ffb51 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/180141 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Alexander Markov <[email protected]>
1 parent 9866c06 commit e7a88b9

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,9 +1326,20 @@ class _TreeShakerPass2 extends Transformer {
13261326
_makeUnreachableBody(node.function);
13271327
}
13281328
node.function.asyncMarker = AsyncMarker.Sync;
1329-
if (node.concreteForwardingStubTarget != null ||
1330-
node.abstractForwardingStubTarget != null) {
1331-
node.stubTarget = null;
1329+
switch (node.stubKind) {
1330+
case ProcedureStubKind.Regular:
1331+
case ProcedureStubKind.NoSuchMethodForwarder:
1332+
break;
1333+
case ProcedureStubKind.MemberSignature:
1334+
case ProcedureStubKind.AbstractForwardingStub:
1335+
case ProcedureStubKind.ConcreteForwardingStub:
1336+
case ProcedureStubKind.AbstractMixinStub:
1337+
case ProcedureStubKind.ConcreteMixinStub:
1338+
// Make the stub look like a regular procedure so the stub target
1339+
// isn't expected to be non-null, for instance by the verifier.
1340+
node.stubKind = ProcedureStubKind.Regular;
1341+
node.stubTarget = null;
1342+
break;
13321343
}
13331344
Statistics.methodBodiesDropped++;
13341345
} else if (node is Field) {

pkg/vm/test/modular_kernel_plus_aot_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ class Foo {
157157
}
158158
class Mixin {
159159
void set mixinProperty(v) {}
160-
Foo get mixinProperty{}
161-
Foo mixinMethod(v) {}
160+
Foo get mixinProperty => new Foo();
161+
Foo mixinMethod(v) => new Foo();
162162
}
163163
class A1 extends Object with Mixin { }
164164
class A2 extends Object with Mixin { }

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ abstract class Stream extends core::Object {
2222
: super core::Object::•()
2323
;
2424
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] abstract method foobar() → self::StreamSubscription*;
25-
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
25+
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] abstract operator ==(dynamic other) → core::bool*;
2626
}
2727
abstract class _StreamImpl extends self::Stream {
2828
synthetic constructor •() → self::_StreamImpl*

0 commit comments

Comments
 (0)