[vm/tfa] Infer concrete class of int literals in TFA
Teach TFA that small integer literals, which fit into Smi on all
platforms have a concrete class _Smi.
Change-Id: I4aec5389fc0a83f36077c1f1c0c9a5e59ff4b260
Reviewed-on: https://dart-review.googlesource.com/76302
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 3a1ae91..0346f89 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -201,6 +201,7 @@
Class concreteMapLiteralClass(CoreTypes coreTypes) => null;
Class concreteConstMapLiteralClass(CoreTypes coreTypes) => null;
+ Class concreteIntLiteralClass(CoreTypes coreTypes, int value) => null;
Class concreteStringLiteralClass(CoreTypes coreTypes, String value) => null;
}
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index a62c3c5..251be65 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -26,6 +26,7 @@
Class _immutableMap;
Class _oneByteString;
Class _twoByteString;
+ Class _smi;
VmTarget(this.flags);
@@ -325,6 +326,20 @@
}
@override
+ Class concreteIntLiteralClass(CoreTypes coreTypes, int value) {
+ const int bitsPerInt32 = 32;
+ const int smiBits32 = bitsPerInt32 - 2;
+ const int smiMin32 = -(1 << smiBits32);
+ const int smiMax32 = (1 << smiBits32) - 1;
+ if ((smiMin32 <= value) && (value <= smiMax32)) {
+ // Value fits into Smi on all platforms.
+ return _smi ??= coreTypes.index.getClass('dart:core', '_Smi');
+ }
+ // Otherwise, class could be either _Smi or _Mint depending on a platform.
+ return null;
+ }
+
+ @override
Class concreteStringLiteralClass(CoreTypes coreTypes, String value) {
const int maxLatin1 = 0xff;
for (int i = 0; i < value.length; ++i) {
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 72b616b..c4a8931 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -554,6 +554,14 @@
Class get _superclass => _environment.thisType.classNode.superclass;
+ Type _intLiteralType(int value) {
+ Class concreteClass =
+ target.concreteIntLiteralClass(_environment.coreTypes, value);
+ return concreteClass != null
+ ? _entryPointsListener.addAllocatedClass(concreteClass)
+ : _intType;
+ }
+
Type _stringLiteralType(String value) {
Class concreteClass =
target.concreteStringLiteralClass(_environment.coreTypes, value);
@@ -597,7 +605,7 @@
@override
TypeExpr visitIntLiteral(IntLiteral node) {
- return _intType;
+ return _intLiteralType(node.value);
}
@override
@@ -1242,7 +1250,7 @@
@override
Type visitIntConstant(IntConstant constant) {
- return summaryCollector._intType;
+ return summaryCollector._intLiteralType(constant.value);
}
@override
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
index b36ef8c..d4deb68 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
@@ -7,9 +7,9 @@
------------ #lib::bool_expressions ------------
t0* = _Call direct [#lib::foo] ()
t1* = _Call direct [#lib::bar] ()
-t2* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::int)+)
-i = _Join [dart.core::int] (_T (dart.core::int)+, t2)
-t4* = _Call [dart.core::num::<] (i, _T (dart.core::int)+)
+t2* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
+i = _Join [dart.core::int] (_T (dart.core::_Smi), t2)
+t4* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi))
t5* = _Call direct [#lib::bar] ()
x = _Join [dart.core::bool] (t5, _T (dart.core::bool)+)
t7* = _Call direct [#lib::foo] ()
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect
index 1f8da63..9a3e510 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect
@@ -19,7 +19,7 @@
RESULT: _T (#lib::T)
------------ #lib::return2 ------------
%i = _Parameter #0 [_T (dart.core::int)+?]
-t1* = _Call [dart.core::num::-] (%i, _T (dart.core::int)+)
+t1* = _Call [dart.core::num::-] (%i, _T (dart.core::_Smi))
t2* = _Call direct [#lib::return2] (t1)
RESULT: t2
------------ #lib::return3 ------------
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
index 2cad426..8fa3835 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
@@ -12,7 +12,7 @@
t2* = _Call direct get [#lib::someStatic] ()
t3 = _Call direct [#lib::A::] (_T (#lib::A))
a1 = _Join [dart.core::Object] (%a1, _T (#lib::A), _T (#lib::B))
-t5 = _Call direct [#lib::bar] (a1, _T (dart.core::int)+)
+t5 = _Call direct [#lib::bar] (a1, _T (dart.core::_Smi))
t6 = _Call direct [#lib::B::] (_T (#lib::B))
t7* = _Call [dart.core::Object::==] (a1, %a2)
t8 = _Join [dart.core::Object] (a1, %a2)
@@ -23,8 +23,8 @@
%a2 = _Parameter #1 [_T (dart.core::int)+?]
t2 = _Narrow (%a1 to _T (dart.core::int)+)
t3* = _Call [dart.core::num::+] (t2, %a2)
-t4* = _Call [dart.core::num::*] (t3, _T (dart.core::int)+)
-t5* = _Call [dart.core::int::unary-] (_T (dart.core::int)+)
+t4* = _Call [dart.core::num::*] (t3, _T (dart.core::_Smi))
+t5* = _Call [dart.core::int::unary-] (_T (dart.core::_Smi))
%result = _Join [dart.core::int] (t4, t5)
RESULT: %result
------------ #lib::loop1 ------------
@@ -35,10 +35,10 @@
RESULT: x
------------ #lib::loop2 ------------
%x = _Parameter #0 [_T (dart.core::int)+?]
-t1* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::int)+)
-i = _Join [dart.core::int] (_T (dart.core::int)+, t1)
-t3* = _Call [dart.core::num::<] (i, _T (dart.core::int)+)
-t4* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::int)+)
+t1* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
+i = _Join [dart.core::int] (_T (dart.core::_Smi), t1)
+t3* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi))
+t4* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
x = _Join [dart.core::int] (%x, t4)
RESULT: x
------------ #lib::main ------------
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
index 46769b4..8347032 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
@@ -11,7 +11,7 @@
}
return true;
}
-static method nThPrimeNumber([@vm.inferred-type.metadata=int] core::int n) → core::int {
+static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi] core::int n) → core::int {
core::int counter = 0;
for (core::int i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1)) {
if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index e25e859..5831363 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -4,20 +4,20 @@
import "dart:typed_data" as typ;
class _Vector extends core::Object {
-[@vm.inferred-type.metadata=int] final field core::int _offset;
-[@vm.inferred-type.metadata=int] final field core::int _length;
+[@vm.inferred-type.metadata=dart.core::_Smi] final field core::int _offset;
+[@vm.inferred-type.metadata=dart.core::_Smi] final field core::int _length;
[@vm.inferred-type.metadata=dart.typed_data::_Float64List] final field core::List<core::double> _elements;
- constructor •([@vm.inferred-type.metadata=int] core::int size) → void
+ constructor •([@vm.inferred-type.metadata=dart.core::_Smi] core::int size) → void
: 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::•()
;
operator [](core::int i) → core::double
- return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double] [@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?] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=int] this.{self::_Vector::_offset}));
+ return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double] [@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?] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset}));
operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int i, core::double value) → void {
- 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=int] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
+ 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] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
}
operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
core::double result = 0.0;
- for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=int] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1))
+ for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1))
result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::_Vector::[]}(i)));
return result;
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index 64585aa..d265afa 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -51,7 +51,7 @@
return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:bar", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
no-such-method-forwarder method foo() → dynamic
return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
- no-such-method-forwarder method bazz([@vm.inferred-type.metadata=int] dynamic a1, [@vm.inferred-type.metadata=int] dynamic a2, [@vm.inferred-type.metadata=int] dynamic a3, [[@vm.inferred-type.metadata=int] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
+ no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("bazz", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
}
abstract class C extends core::Object {
@@ -70,7 +70,7 @@
return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:bar", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
no-such-method-forwarder method foo() → dynamic
return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
- no-such-method-forwarder method bazz([@vm.inferred-type.metadata=int] dynamic a1, [@vm.inferred-type.metadata=int] dynamic a2, [@vm.inferred-type.metadata=int] dynamic a3, [[@vm.inferred-type.metadata=int] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
+ no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("bazz", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
}
class E extends core::Object implements self::A {
@@ -103,7 +103,7 @@
synthetic constructor •() → void
: super core::Object::•()
;
- method foo({[@vm.inferred-type.metadata=int] dynamic left = null, [@vm.inferred-type.metadata=int] dynamic right = null}) → dynamic
+ method foo({[@vm.inferred-type.metadata=dart.core::_Smi] dynamic left = null, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic right = null}) → dynamic
return new self::T6::•();
method noSuchMethod(core::Invocation invocation) → dynamic {
return new self::T7::•();
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 8ef426f..6c49846 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
@@ -16,7 +16,7 @@
synthetic constructor •() → void
: super core::Object::•()
;
- method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=int?] dynamic a4 = null, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = null]) → void {
+ method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = null]) → void {
[@vm.direct-call.metadata=#lib::A1::foo] this.{self::A1::foo} = a5 as{TypeError} self::T1;
}
}
@@ -39,7 +39,7 @@
synthetic constructor •() → void
: super core::Object::•()
;
- method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=int?] dynamic a4 = null, [@vm.inferred-type.metadata=int?] dynamic a5 = null, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = null]) → void {
+ method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = null]) → void {
[@vm.direct-call.metadata=#lib::A2::foo] this.{self::A2::foo} = a6;
}
}
@@ -72,7 +72,7 @@
synthetic constructor •() → void
: super core::Object::•()
;
- method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=int?] dynamic a4 = null, [@vm.inferred-type.metadata=int?] dynamic a5 = null, [@vm.inferred-type.metadata=int?] dynamic a6 = null, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = null]) → void {
+ method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = null]) → void {
[@vm.direct-call.metadata=#lib::A3::foo] this.{self::A3::foo} = a7;
}
}
@@ -95,7 +95,7 @@
synthetic constructor •() → void
: super core::Object::•()
;
- method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=int?] dynamic a4 = null, [@vm.inferred-type.metadata=int?] dynamic a5 = null, [@vm.inferred-type.metadata=int?] dynamic a6 = null, [@vm.inferred-type.metadata=int?] dynamic a7 = null, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = null]) → void {
+ method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = null, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = null]) → void {
[@vm.direct-call.metadata=#lib::A4::foo] this.{self::A4::foo} = a8;
}
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
index 4cf2073..1b2f0e8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
@@ -13,7 +13,7 @@
: super self::A::•()
;
method foo() → core::int
- return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::bar] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar() as{TypeError} core::num) as{TypeError} core::int;
+ return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::bar] [@vm.inferred-type.metadata=dart.core::_Smi] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar() as{TypeError} core::num) as{TypeError} core::int;
method bar() → core::int
return 3;
}