From 9c190c5e001640238e61ae9511a0dd4b2d94228b Mon Sep 17 00:00:00 2001 From: Alexander Markov Date: Mon, 28 Jun 2021 18:33:43 +0000 Subject: [PATCH] [vm/aot/tfa] Tree-shake instance fields with initializers In order to simplify removal of instance fields with initializers which may have side effects, such field initializers are moved to constructor initializer lists before type flow analysis. In case of multiple generative non-redirecting constructors AST of field initializers is cloned. Moving and cloning of initializers is performed before the analysis to avoid maintaining and spreading inferred TFA information attached to AST nodes. TEST=pkg/vm/testcases/transformations/type_flow/transformer/instance_fields_with_initializers_nnbd.dart Fixes https://github.com/dart-lang/sdk/issues/46402 Change-Id: I4dc9c44c441ece5792f0748789ece117a2814581 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/204943 Commit-Queue: Alexander Markov Reviewed-by: Martin Kustermann --- .../type_flow/transformer.dart | 74 +++++++++++++++++++ .../class_generics_case1.dart.expect | 4 +- ...nstance_fields_with_initializers_nnbd.dart | 41 ++++++++++ ..._fields_with_initializers_nnbd.dart.expect | 30 ++++++++ ...invalidation_field_initializer.dart.expect | 4 +- .../invalidation_set_field.dart.expect | 6 +- .../type_flow/transformer/lists.dart.expect | 36 ++++----- .../transformer/lists_nnbd.dart.expect | 32 ++++---- .../regress_41452_nnbd_strong.dart.expect | 6 +- .../regress_flutter16182.dart.expect | 16 ++-- .../transformer/write_only_field.dart.expect | 4 +- .../transformer/write_only_field2.dart.expect | 21 +++--- 12 files changed, 209 insertions(+), 65 deletions(-) create mode 100644 pkg/vm/testcases/transformations/type_flow/transformer/instance_fields_with_initializers_nnbd.dart create mode 100644 pkg/vm/testcases/transformations/type_flow/transformer/instance_fields_with_initializers_nnbd.dart.expect diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart index 399d39a03c9..47cce1b4adb 100644 --- a/pkg/vm/lib/transformations/type_flow/transformer.dart +++ b/pkg/vm/lib/transformations/type_flow/transformer.dart @@ -9,6 +9,7 @@ import 'dart:core' hide Type; import 'package:kernel/target/targets.dart'; import 'package:kernel/ast.dart' hide Statement, StatementVisitor; +import 'package:kernel/clone.dart' show CloneVisitorNotMembers; import 'package:kernel/core_types.dart' show CoreTypes; import 'package:kernel/class_hierarchy.dart' show ClassHierarchy; import 'package:kernel/library_index.dart' show LibraryIndex; @@ -56,6 +57,8 @@ Component transformComponent( Statistics.reset(); final analysisStopWatch = new Stopwatch()..start(); + MoveFieldInitializers().transformComponent(component); + final typeFlowAnalysis = new TypeFlowAnalysis( target, component, @@ -121,6 +124,77 @@ Component transformComponent( return component; } +// Move instance field initializers with possible side-effects +// into constructors. This makes fields self-contained and +// simplifies tree-shaking of fields. +class MoveFieldInitializers { + void transformComponent(Component component) { + for (Library library in component.libraries) { + for (Class cls in library.classes) { + transformClass(cls); + } + } + } + + void transformClass(Class cls) { + if (cls.fields.isEmpty) return; + + // Collect instance fields with non-trivial initializers. + // Those will be moved into constructors. + final List fields = [ + for (Field f in cls.fields) + if (!f.isStatic && + !f.isLate && + f.initializer != null && + mayHaveSideEffects(f.initializer)) + f + ]; + if (fields.isEmpty) return; + + // Collect non-redirecting constructors. + final List constructors = [ + for (Constructor c in cls.constructors) + if (!_isRedirectingConstructor(c)) c + ]; + + assert(constructors.isNotEmpty); + + // Move field initializers to constructors. + // Clone AST for all constructors except the first. + bool isFirst = true; + for (Constructor c in constructors) { + // Avoid duplicate FieldInitializers in the constructor initializer list. + final Set initializedFields = { + for (Initializer init in c.initializers) + if (init is FieldInitializer) init.field + }; + final List newInitializers = []; + for (Field f in fields) { + Expression initExpr = f.initializer; + if (!isFirst) { + initExpr = CloneVisitorNotMembers().clone(initExpr); + } + final Initializer newInit = initializedFields.contains(f) + ? LocalInitializer(VariableDeclaration(null, initializer: initExpr)) + : FieldInitializer(f, initExpr); + newInit.parent = c; + newInitializers.add(newInit); + } + newInitializers.addAll(c.initializers); + c.initializers = newInitializers; + isFirst = false; + } + + // Cleanup field initializers. + for (Field f in fields) { + f.initializer = null; + } + } + + bool _isRedirectingConstructor(Constructor c) => + c.initializers.last is RedirectingInitializer; +} + // Pass which removes all annotations except @ExternalName and @pragma // on variables, members, classes and libraries. // May also keep @TagNumber which is used by protobuf handler. diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect index e0e9ca7da7b..ca4d73ccfba 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect @@ -10,9 +10,9 @@ class Element extends core::Object { ; } class InheritedElement extends self::Element { -[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] final field core::Map* _dependents = {}; +[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] final field core::Map* _dependents; synthetic constructor •() → self::InheritedElement* - : super self::Element::•() + : self::InheritedElement::_dependents = {}, super self::Element::•() ; [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3] method setDependencies([@vm.inferred-type.metadata=!] self::Element* dependent, [@vm.inferred-type.metadata=dart.core::_Smi?] core::Object* value) → void { [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element*, dart.core::Object*>*] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin.[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement._dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] this.{self::InheritedElement::_dependents}{core::Map*}.{core::Map::[]=}(dependent, value){(self::Element*, core::Object*) →* void}; diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/instance_fields_with_initializers_nnbd.dart b/pkg/vm/testcases/transformations/type_flow/transformer/instance_fields_with_initializers_nnbd.dart new file mode 100644 index 00000000000..bb66a2bb64b --- /dev/null +++ b/pkg/vm/testcases/transformations/type_flow/transformer/instance_fields_with_initializers_nnbd.dart @@ -0,0 +1,41 @@ +// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// Test for tree shaking of instance fields with initializers. + +// @dart = 2.12 + +int sideEffect(int x) { + print(x); + return x; +} + +class A { + int f1 = sideEffect(1); + int f2 = sideEffect(2); + int f3 = 3; + static int f4 = sideEffect(40); // Not evaluated in constructor. + late int f5 = sideEffect(50); // Not evaluated in constructor. + late final int f6 = sideEffect(60); // Not evaluated in constructor. + int f7 = sideEffect(7); // Used/retained. + int f8 = sideEffect(8); + + A(this.f8) + : f1 = sideEffect(100), + f2 = sideEffect(200); + + A.foo() : this(800); + A.bar(this.f1) : f8 = sideEffect(801); +} + +main() { + // Use all constructors. + A(-8); + A.foo(); + A.bar(-1); + + // Use f4, f5, f6, f7. + A obj = A.foo(); + print(A.f4 + obj.f5 + obj.f6 + obj.f7); +} diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/instance_fields_with_initializers_nnbd.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/instance_fields_with_initializers_nnbd.dart.expect new file mode 100644 index 00000000000..ea029df54c7 --- /dev/null +++ b/pkg/vm/testcases/transformations/type_flow/transformer/instance_fields_with_initializers_nnbd.dart.expect @@ -0,0 +1,30 @@ +library #lib /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class A extends core::Object { +[@vm.inferred-type.metadata=dart.core::_Smi?] static field core::int f4 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 40)] self::sideEffect(40); +[@vm.inferred-type.metadata=dart.core::_Smi (value: 50)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i)->i] late field core::int f5 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 50)] self::sideEffect(50); +[@vm.inferred-type.metadata=dart.core::_Smi (value: 60)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] [@vm.unboxing-info.metadata=()->i] late final field core::int f6 = [@vm.inferred-type.metadata=dart.core::_Smi (value: 60)] self::sideEffect(60); +[@vm.inferred-type.metadata=dart.core::_Smi (value: 7)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=(i)->i] field core::int f7; + constructor •() → self::A + : 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::•() + ; + constructor foo() → self::A + : this self::A::•() + ; + constructor bar() → self::A + : 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::•() + ; +} +[@vm.unboxing-info.metadata=(i)->i]static method sideEffect([@vm.inferred-type.metadata=dart.core::_Smi] core::int x) → core::int { + core::print(x); + return x; +} +static method main() → dynamic { + let final core::int #t10 = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.unary-] [@vm.inferred-type.metadata=int (skip check)] 8.{core::int::unary-}(){() → core::int} in new self::A::•(); + new self::A::foo(); + let final core::int #t11 = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.unary-] [@vm.inferred-type.metadata=int (skip check)] 1.{core::int::unary-}(){() → core::int} in new self::A::bar(); + self::A obj = new self::A::foo(); + core::print([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] [@vm.inferred-type.metadata=dart.core::_Smi?] self::A::f4.{core::num::+}([@vm.direct-call.metadata=#lib::A.f5] [@vm.inferred-type.metadata=dart.core::_Smi (value: 50)] obj.{self::A::f5}{core::int}){(core::num) → core::int}.{core::num::+}([@vm.direct-call.metadata=#lib::A.f6] [@vm.inferred-type.metadata=dart.core::_Smi (value: 60)] obj.{self::A::f6}{core::int}){(core::num) → core::int}.{core::num::+}([@vm.direct-call.metadata=#lib::A.f7] [@vm.inferred-type.metadata=dart.core::_Smi (value: 7)] obj.{self::A::f7}{core::int}){(core::num) → core::int}); +} diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect index 9549477198f..43bee1fd15e 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect @@ -43,9 +43,9 @@ class DeepCaller1 extends core::Object { return self::field1; } class D extends core::Object { -[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] field core::Object* field2 = [@vm.inferred-type.metadata=!] self::getValue(); +[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] field core::Object* field2; synthetic constructor •() → self::D* - : super core::Object::•() + : self::D::field2 = [@vm.inferred-type.metadata=!] self::getValue(), super core::Object::•() ; } class DeepCaller2 extends core::Object { diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect index 85add1bbc03..8a434a873bc 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect @@ -13,10 +13,10 @@ class T2 extends core::Object { ; } class A extends core::Object { -[@vm.inferred-type.metadata=#lib::T1] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] field dynamic field1 = new self::T1::•(); -[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] field dynamic field2 = new self::T1::•(); +[@vm.inferred-type.metadata=#lib::T1] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] field dynamic field1; +[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] field dynamic field2; synthetic constructor •() → self::A* - : super core::Object::•() + : self::A::field1 = new self::T1::•(), self::A::field2 = new self::T1::•(), super core::Object::•() ; } class DeepCaller1 extends core::Object { diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect index d772a4455f0..7381c7466d3 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect @@ -4,27 +4,27 @@ import "dart:core" as core; import "dart:_internal" as _in; class A extends core::Object { -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] final field core::List* literal1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] final field core::List* literal2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal3(1, 2, 3); +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] final field core::List* literal1; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] final field core::List* literal2; [@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const [])] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] final field core::List* constLiteral1 = #C1; [@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const [1, 2])] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4] final field core::List* constLiteral2 = #C4; -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5] final field core::List* defaultConstructor1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:6] final field core::List* defaultConstructor2 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(3); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:7] final field core::List* filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:8] final field core::List* filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::filled(); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:9] final field core::List* filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0); -[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:10] final field core::List* filledFactory4 = let final core::bool #t1 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, 0, #t1); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11] final field core::List* filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:12] final field core::List* filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(2); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:13] final field core::List* filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2); -[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:14] final field core::List* filledFactory8 = let final core::bool #t2 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, null, #t2); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:15] final field core::List* generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, (core::int* i) → core::int* => i); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:16] final field core::List* generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, (core::int* i) → core::int* => i); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:17] final field core::List* generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::generate((core::int* i) → core::int* => i); -[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:18] final field core::List* generateFactory4 = let final (core::int*) →* core::int* #t3 = (core::int* i) → core::int* => i in let final core::bool #t4 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate(#t3, #t4); -[@vm.inferred-type.metadata=dart.core::_GrowableList*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:19] final field core::List*>* generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList*>] core::_GrowableList::generate*>(2, (core::int* _) → core::List* => core::_GrowableList::•(0)); +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5] final field core::List* defaultConstructor1; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:6] final field core::List* defaultConstructor2; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:7] final field core::List* filledFactory1; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:8] final field core::List* filledFactory2; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:9] final field core::List* filledFactory3; +[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:10] final field core::List* filledFactory4; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11] final field core::List* filledFactory5; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:12] final field core::List* filledFactory6; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:13] final field core::List* filledFactory7; +[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:14] final field core::List* filledFactory8; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:15] final field core::List* generateFactory1; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:16] final field core::List* generateFactory2; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:17] final field core::List* generateFactory3; +[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:18] final field core::List* generateFactory4; +[@vm.inferred-type.metadata=dart.core::_GrowableList*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:19] final field core::List*>* generateFactory5; synthetic constructor •() → self::A* - : super core::Object::•() + : self::A::literal1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0), self::A::literal2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal3(1, 2, 3), self::A::defaultConstructor1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0), self::A::defaultConstructor2 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(3), self::A::filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0), self::A::filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::filled(), self::A::filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0), self::A::filledFactory4 = let final core::bool #t1 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, 0, #t1), self::A::filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2), self::A::filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(2), self::A::filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2), self::A::filledFactory8 = let final core::bool #t2 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, null, #t2), self::A::generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, (core::int* i) → core::int* => i), self::A::generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, (core::int* i) → core::int* => i), self::A::generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::generate((core::int* i) → core::int* => i), self::A::generateFactory4 = let final (core::int*) →* core::int* #t3 = (core::int* i) → core::int* => i in let final core::bool #t4 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate(#t3, #t4), self::A::generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList*>] core::_GrowableList::generate*>(2, (core::int* _) → core::List* => core::_GrowableList::•(0)), super core::Object::•() ; } static method nonConstant() → dynamic diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/lists_nnbd.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/lists_nnbd.dart.expect index 893475aece9..3d34f1bf14e 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/lists_nnbd.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/lists_nnbd.dart.expect @@ -4,25 +4,25 @@ import "dart:core" as core; import "dart:_internal" as _in; class A extends core::Object { -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] final field core::List literal1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] final field core::List literal2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal3(1, 2, 3); +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] final field core::List literal1; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] final field core::List literal2; [@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const [])] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] final field core::List constLiteral1 = #C1; [@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const [1, 2])] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4] final field core::List constLiteral2 = #C4; -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5] final field core::List filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:6] final field core::List filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::filled(); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:7] final field core::List filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0); -[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:8] final field core::List filledFactory4 = let final core::bool #t1 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, 0, #t1); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:9] final field core::List filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:10] final field core::List filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(2); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11] final field core::List filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2); -[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:12] final field core::List filledFactory8 = let final core::bool #t2 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, null, #t2); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:13] final field core::List generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, (core::int i) → core::int => i); -[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:14] final field core::List generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, (core::int i) → core::int => i); -[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:15] final field core::List generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::generate((core::int i) → core::int => i); -[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:16] final field core::List generateFactory4 = let final (core::int) → core::int #t3 = (core::int i) → core::int => i in let final core::bool #t4 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate(#t3, #t4); -[@vm.inferred-type.metadata=dart.core::_GrowableList>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:17] final field core::List> generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList>] core::_GrowableList::generate>(2, (core::int _) → core::List => core::_GrowableList::•(0)); +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5] final field core::List filledFactory1; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:6] final field core::List filledFactory2; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:7] final field core::List filledFactory3; +[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:8] final field core::List filledFactory4; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:9] final field core::List filledFactory5; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:10] final field core::List filledFactory6; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11] final field core::List filledFactory7; +[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:12] final field core::List filledFactory8; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:13] final field core::List generateFactory1; +[@vm.inferred-type.metadata=dart.core::_GrowableList] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:14] final field core::List generateFactory2; +[@vm.inferred-type.metadata=dart.core::_List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:15] final field core::List generateFactory3; +[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:16] final field core::List generateFactory4; +[@vm.inferred-type.metadata=dart.core::_GrowableList>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:17] final field core::List> generateFactory5; synthetic constructor •() → self::A - : super core::Object::•() + : self::A::literal1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(0), self::A::literal2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::_literal3(1, 2, 3), self::A::filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0), self::A::filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::filled(), self::A::filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::filled(2, 0), self::A::filledFactory4 = let final core::bool #t1 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, 0, #t1), self::A::filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2), self::A::filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::•(2), self::A::filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::•(2), self::A::filledFactory8 = let final core::bool #t2 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled(2, null, #t2), self::A::generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, (core::int i) → core::int => i), self::A::generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList] core::_GrowableList::generate(2, (core::int i) → core::int => i), self::A::generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List] core::_List::generate((core::int i) → core::int => i), self::A::generateFactory4 = let final (core::int) → core::int #t3 = (core::int i) → core::int => i in let final core::bool #t4 = _in::unsafeCast([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate(#t3, #t4), self::A::generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList>] core::_GrowableList::generate>(2, (core::int _) → core::List => core::_GrowableList::•(0)), super core::Object::•() ; } static method nonConstant() → dynamic diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_41452_nnbd_strong.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_41452_nnbd_strong.dart.expect index 5baaf9c8b09..89b2f4fbdea 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_41452_nnbd_strong.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_41452_nnbd_strong.dart.expect @@ -18,7 +18,7 @@ abstract class _SplayTree] this.{self::_SplayTree::_root}{self::_SplayTree::Node?}; if(false) return; core::print([@vm.direct-call.metadata=#lib::_SplayTreeNode.left] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] root{self::_SplayTree::Node}.{self::_SplayTreeNode::left}{self::_SplayTree::Node?}); @@ -26,9 +26,9 @@ abstract class _SplayTree extends self::_SplayTree> { -[@vm.inferred-type.metadata=#lib::_SplayTreeMapNode] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:5] generic-covariant-impl field self::_SplayTreeMapNode? _root = new self::_SplayTreeMapNode::•(); +[@vm.inferred-type.metadata=#lib::_SplayTreeMapNode] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:5] generic-covariant-impl field self::_SplayTreeMapNode? _root; synthetic constructor •() → self::SplayTreeMap - : super self::_SplayTree::•() + : self::SplayTreeMap::_root = new self::_SplayTreeMapNode::•(), super self::_SplayTree::•() ; } static method main() → void { diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect index 7937844ab1e..15a6a840080 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect @@ -24,9 +24,9 @@ class A1 extends core::Object { } } class B1 extends core::Object { -[@vm.inferred-type.metadata=#lib::A1] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] field self::A1* aa1 = new self::A1::•(); +[@vm.inferred-type.metadata=#lib::A1] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] field self::A1* aa1; synthetic constructor •() → self::B1* - : super core::Object::•() + : self::B1::aa1 = new self::A1::•(), super core::Object::•() ; } class T2 extends core::Object { @@ -47,9 +47,9 @@ class A2 extends core::Object { } } abstract class B2Base extends core::Object { -[@vm.inferred-type.metadata=#lib::A2] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16] field dynamic _aa = new self::A2::•(); +[@vm.inferred-type.metadata=#lib::A2] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16] field dynamic _aa; synthetic constructor •() → self::B2Base* - : super core::Object::•() + : self::B2Base::_aa = new self::A2::•(), super core::Object::•() ; [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:17] get aa2() → dynamic return [@vm.direct-call.metadata=#lib::B2Base._aa] [@vm.inferred-type.metadata=#lib::A2] this.{self::B2Base::_aa}{dynamic}; @@ -80,9 +80,9 @@ class A3 extends core::Object { } } class B3 extends core::Object { -[@vm.inferred-type.metadata=#lib::A3] [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:26,getterSelectorId:27] field self::A3* aa3 = new self::A3::•(); +[@vm.inferred-type.metadata=#lib::A3] [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:26,getterSelectorId:27] field self::A3* aa3; synthetic constructor •() → self::B3* - : super core::Object::•() + : self::B3::aa3 = new self::A3::•(), super core::Object::•() ; } class T4 extends core::Object { @@ -103,9 +103,9 @@ class A4 extends core::Object { } } class B4 extends core::Object { -[@vm.inferred-type.metadata=#lib::A4] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:34,getterSelectorId:35] field dynamic _aa = new self::A4::•(); +[@vm.inferred-type.metadata=#lib::A4] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:34,getterSelectorId:35] field dynamic _aa; synthetic constructor •() → self::B4* - : super core::Object::•() + : self::B4::_aa = new self::A4::•(), super core::Object::•() ; [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false,getterSelectorId:36] get aa4() → dynamic return [@vm.direct-call.metadata=#lib::B4._aa] [@vm.inferred-type.metadata=#lib::A4] this.{self::B4::_aa}{dynamic}; diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect index 0fdf157905a..cc689dc0348 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect @@ -9,10 +9,10 @@ class B extends core::Object { } } class C extends core::Object { -[@vm.inferred-type.metadata=#lib::B?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] field self::B* instanceField = new self::B::•(); synthetic constructor •() → self::C* - : super core::Object::•() + : dynamic #t1 = new self::B::•(), super core::Object::•() ; +[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1] set instanceField(self::B* value) → void; } static method main() → void { null; diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect index 9fe5d89f7ba..6e40a3c4b62 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect @@ -6,49 +6,48 @@ import "package:expect/expect.dart" as exp; import "package:expect/expect.dart"; class A extends core::Object { -[@vm.inferred-type.metadata=dart.core::Null? (value: null)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] field dynamic unused3 = [@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::foo(); synthetic constructor •() → self::A* - : super core::Object::•() + : dynamic #t1 = [@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::foo(), super core::Object::•() ; } class B extends core::Object { constructor •() → self::B* - : dynamic #t1 = [@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::foo(), super core::Object::•() + : dynamic #t2 = [@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::foo(), super core::Object::•() ; } abstract class C extends core::Object { -[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] abstract set bar(generic-covariant-impl self::C::T* value) → void; +[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1] abstract set bar(generic-covariant-impl self::C::T* value) → void; } class D extends core::Object implements self::C { synthetic constructor •() → self::D* : super core::Object::•() ; -[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] set bar(generic-covariant-impl core::int* value) → void; +[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1] set bar(generic-covariant-impl core::int* value) → void; } abstract class E extends core::Object { -[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i] abstract get bar() → core::int*; +[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] [@vm.unboxing-info.metadata=()->i] abstract get bar() → core::int*; } class F extends core::Object implements self::E { synthetic constructor •() → self::F* : super core::Object::•() ; -[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i] get bar() → core::int* +[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] [@vm.unboxing-info.metadata=()->i] get bar() → core::int* return 42; } class G extends core::Object /*hasConstConstructor*/ { -[@vm.inferred-type.metadata=dart.core::_Smi] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5] [@vm.unboxing-info.metadata=()->i] final field core::int* bazz; +[@vm.inferred-type.metadata=dart.core::_Smi] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] [@vm.unboxing-info.metadata=()->i] final field core::int* bazz; } abstract class H extends core::Object { synthetic constructor •() → self::H* : super core::Object::•() ; -[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6] set unused6(core::int* value) → void; +[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4] set unused6(core::int* value) → void; } class I extends self::H { synthetic constructor •() → self::I* : super self::H::•() ; -[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method foo() → dynamic { +[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method foo() → dynamic { super.{self::H::unused6} = 3; } } @@ -61,7 +60,7 @@ static method main() → void { [@vm.call-site-attributes.metadata=receiverType:#lib::C*] [@vm.direct-call.metadata=#lib::D.bar] c.{self::C::bar} = 3.14; }); self::E* e = new self::F::•(); - let final core::int* #t2 = [@vm.direct-call.metadata=#lib::F.bar] [@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] e.{self::E::bar}{core::int*} in exp::Expect::equals(); + let final core::int* #t3 = [@vm.direct-call.metadata=#lib::F.bar] [@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] e.{self::E::bar}{core::int*} in exp::Expect::equals(); exp::Expect::isTrue(![@vm.inferred-type.metadata=dart.core::bool] core::identical(#C2, #C4)); [@vm.direct-call.metadata=#lib::I.foo] [@vm.inferred-type.metadata=!? (skip check)] new self::I::•().{self::I::foo}(){() →* dynamic}; 5;