Skip to content

Commit 4474e81

Browse files
mkustermannCommit Queue
authored andcommitted
[tfa] Use field type as type of temporary variable when removing fields in TFA
When a field gets never read TFA may remove the field entirely. The initializer of the field may still need to be executed as it may have side-effects. The initializer is then moved to a `LocalInitializer` with a unused variable. Currently this variable is typed `dynamic` but could be strenghtened to be the type of the field, which this CL does. The usage of `dynamic` can have problems for some backends that have types that aren't part of the Dart object hierarchy (e.g. a `WasmArray`). Those types cannot flow into top types as they are not real Dart objects. By typing the `LocalInitializer` variable the same as the field type, we avoid assigning such foreign, no-Dart objects to variables of Dart top-type. TEST=pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect Change-Id: Idd4bf944afad83ceb1850f478e7a9d9cd47bf00d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/415201 Commit-Queue: Martin Kustermann <[email protected]> Reviewed-by: Alexander Markov <[email protected]>
1 parent f5b0cea commit 4474e81

File tree

3 files changed

+4
-3
lines changed

3 files changed

+4
-3
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1850,6 +1850,7 @@ class _TreeShakerPass1 extends RemovingTransformer {
18501850
null,
18511851
initializer: node.value,
18521852
isSynthesized: true,
1853+
type: field.type,
18531854
),
18541855
);
18551856
} else {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ class A extends core::Object {
2323
[@vm.unboxing-info.metadata=(i)->i]
2424
field core::int f7;
2525
constructor •() → self::A
26-
: dynamic #t1 = self::sideEffect(1), dynamic #t2 = self::sideEffect(2), self::A::f7 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 7)] self::sideEffect(7), dynamic #t3 = self::sideEffect(8), dynamic #t4 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 100)] self::sideEffect(100), dynamic #t5 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 200)] self::sideEffect(200), super core::Object::•()
26+
: dynamic #t1 = self::sideEffect(1), dynamic #t2 = self::sideEffect(2), self::A::f7 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 7)] self::sideEffect(7), dynamic #t3 = self::sideEffect(8), core::int #t4 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 100)] self::sideEffect(100), core::int #t5 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 200)] self::sideEffect(200), super core::Object::•()
2727
;
2828
constructor foo() → self::A
2929
: this self::A::•()
3030
;
3131
constructor bar() → self::A
32-
: dynamic #t6 = self::sideEffect(1), dynamic #t7 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] self::sideEffect(2), self::A::f7 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 7)] self::sideEffect(7), dynamic #t8 = self::sideEffect(8), dynamic #t9 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 801)] self::sideEffect(801), super core::Object::•()
32+
: dynamic #t6 = self::sideEffect(1), core::int #t7 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] self::sideEffect(2), self::A::f7 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 7)] self::sideEffect(7), dynamic #t8 = self::sideEffect(8), core::int #t9 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 801)] self::sideEffect(801), super core::Object::•()
3333
;
3434
}
3535

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
@@ -12,7 +12,7 @@ class B extends core::Object {
1212
}
1313
class C extends core::Object {
1414
synthetic constructor •() → self::C
15-
: dynamic #t1 = new self::B::•(), super core::Object::•()
15+
: self::B? #t1 = new self::B::•(), super core::Object::•()
1616
;
1717

1818
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1]

0 commit comments

Comments
 (0)