library #lib; import self as self; import "dart:core" as core; import "dart:_internal" as _in; class Base extends core::Object { generic-covariant-impl field self::Base::T1 t1 = null; generic-covariant-impl field self::Base::T2 t2 = null; [@vm.bytecode= Bytecode { Entry 1 CheckStack 0 Push FP[-5] DirectCall 1, CP#0 Drop1 PushNull PushInt 4 CreateArrayTOS StoreLocal r0 Push r0 PushInt 0 PushConstant CP#2 StoreIndexedTOS Push r0 PushInt 1 Push FP[-5] LoadTypeArgumentsField CP#4 PushNull InstantiateType CP#3 StoreIndexedTOS Push r0 PushInt 2 PushConstant CP#5 StoreIndexedTOS Push r0 PushInt 3 Push FP[-5] LoadTypeArgumentsField CP#4 PushNull InstantiateType CP#6 StoreIndexedTOS DirectCall 1, CP#7 DirectCall 1, CP#9 Drop1 PushNull ReturnTOS } Nullable fields: [#lib::Base::t1 (field), #lib::Base::t2 (field)]} ConstantPool { [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved [2] = ObjectRef 'Base: ' [3] = Type #lib::Base::TypeParam/0 [4] = TypeArgumentsField #lib::Base [5] = ObjectRef ', ' [6] = Type #lib::Base::TypeParam/1 [7] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names [] [8] = Reserved [9] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names [] [10] = Reserved } ] constructor •() → self::Base : super core::Object::•() { core::print("Base: ${self::Base::T1}, ${self::Base::T2}"); } } class A extends self::Base { [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-6] DirectCall 1, CP#0 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall '#lib::Base:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved } ] constructor •(core::String s) → self::A : super self::Base::•() ; } class B extends self::Base, core::String> { [@vm.bytecode= Bytecode { Entry 1 CheckStack 0 Push FP[-5] DirectCall 1, CP#0 Drop1 PushNull PushInt 2 CreateArrayTOS StoreLocal r0 Push r0 PushInt 0 PushConstant CP#2 StoreIndexedTOS Push r0 PushInt 1 Push FP[-5] LoadTypeArgumentsField CP#4 PushNull InstantiateType CP#3 StoreIndexedTOS DirectCall 1, CP#5 DirectCall 1, CP#7 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall '#lib::Base:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved [2] = ObjectRef 'B: ' [3] = Type #lib::B::TypeParam/0 [4] = TypeArgumentsField #lib::B [5] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names [] [6] = Reserved [7] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names [] [8] = Reserved } ] constructor •() → self::B : super self::Base::•() { core::print("B: ${self::B::T}"); } } class C extends core::Object { [@vm.bytecode= Bytecode { Entry 1 CheckStack 0 Push FP[-6] DirectCall 1, CP#0 Drop1 PushNull PushInt 2 CreateArrayTOS StoreLocal r0 Push r0 PushInt 0 PushConstant CP#2 StoreIndexedTOS Push r0 PushInt 1 Push FP[-5] StoreIndexedTOS DirectCall 1, CP#3 DirectCall 1, CP#5 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved [2] = ObjectRef 'C: ' [3] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names [] [4] = Reserved [5] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names [] [6] = Reserved } ] constructor •(core::String s) → self::C : super core::Object::•() { core::print("C: ${s}"); } } class E extends core::Object { [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-5] DirectCall 1, CP#0 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved } ] synthetic constructor •() → self::E : super core::Object::•() ; [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-5] LoadTypeArgumentsField CP#0 DirectCall 1, CP#1 ReturnTOS } ConstantPool { [0] = TypeArgumentsField #lib::E [1] = DirectCall 'dart:core::Map:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [2] = Reserved } ] method test_reuse1() → dynamic return core::Map::•(); } class F extends self::E> { [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-5] DirectCall 1, CP#0 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall '#lib::E:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved } ] synthetic constructor •() → self::F : super self::E::•() ; [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-5] LoadTypeArgumentsField CP#0 DirectCall 1, CP#1 ReturnTOS } ConstantPool { [0] = TypeArgumentsField #lib::F [1] = DirectCall 'dart:core::Map:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [2] = Reserved } ] method test_reuse2() → dynamic return core::Map::•>(); } class G extends core::Object { [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-5] DirectCall 1, CP#0 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved } ] constructor •() → self::G : super core::Object::•() ; [@vm.bytecode= Bytecode { Entry 1 CheckStack 0 Push FP[-5] PushNull InstantiateTypeArgumentsTOS 0, CP#1 PushConstant CP#0 AllocateT StoreLocal r0 Push r0 DirectCall 1, CP#2 Drop1 ReturnTOS } ConstantPool { [0] = Class #lib::H [1] = ObjectRef < #lib::G::test_factory (constructor)::TypeParam/0, #lib::G::test_factory (constructor)::TypeParam/1, dart:core::String, #lib::G::test_factory (constructor)::TypeParam/0, #lib::G::test_factory (constructor)::TypeParam/1 > [2] = DirectCall '#lib::H:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [3] = Reserved } ] static factory test_factory() → self::G return new self::H::•(); } class H extends self::G { [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-5] DirectCall 1, CP#0 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall '#lib::G:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved } ] synthetic constructor •() → self::H : super self::G::•() ; } class I extends core::Object { [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-6] DirectCall 1, CP#0 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved } ] constructor •(dynamic param) → self::I : super core::Object::•() ; [@vm.bytecode= Bytecode { EntryOptional 1, 0, 1 LoadConstant r1, CP#0 LoadConstant r1, CP#1 Frame 1 CheckStack 0 Allocate CP#2 StoreLocal r2 Push r2 Push r1 DirectCall 2, CP#3 Drop1 ReturnTOS } ConstantPool { [0] = ObjectRef 'param' [1] = ObjectRef null [2] = Class #lib::I [3] = DirectCall '#lib::I:: (constructor)', ArgDesc num-args 2, num-type-args 0, names [] [4] = Reserved } ] static factory test_factory2({dynamic param = null}) → self::I return new self::I::•(param); } class J extends core::Object { [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-5] NativeCall CP#0 ReturnTOS } ConstantPool { [0] = NativeEntry agent_J } ] @_in::ExternalName::•("agent_J") external static factory •() → self::J; } abstract class K extends core::Object { [@vm.bytecode= Bytecode { Entry 1 CheckStack 0 Push FP[-5] PushConstant CP#0 AllocateT StoreLocal r0 Push r0 DirectCall 1, CP#1 Drop1 ReturnTOS } ConstantPool { [0] = Class #lib::TestTypeArgReuse [1] = DirectCall '#lib::TestTypeArgReuse:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [2] = Reserved } ] static factory •() → self::K return new self::TestTypeArgReuse::•(); } class TestTypeArgReuse

extends self::Base implements self::K { [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 Push FP[-5] DirectCall 1, CP#0 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall '#lib::Base:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved } ] synthetic constructor •() → self::TestTypeArgReuse : super self::Base::•() ; } [@vm.bytecode= Bytecode { Entry 1 CheckStack 0 Allocate CP#0 StoreLocal r0 Push r0 PushConstant CP#1 DirectCall 2, CP#2 Drop1 ReturnTOS } ConstantPool { [0] = Class #lib::C [1] = ObjectRef 'hello' [2] = DirectCall '#lib::C:: (constructor)', ArgDesc num-args 2, num-type-args 0, names [] [3] = Reserved } ]static method foo1() → dynamic return new self::C::•("hello"); [@vm.bytecode= Bytecode { Entry 1 CheckStack 0 PushConstant CP#1 PushConstant CP#0 AllocateT StoreLocal r0 Push r0 PushConstant CP#2 DirectCall 2, CP#3 Drop1 Drop1 PushConstant CP#6 PushConstant CP#5 AllocateT StoreLocal r0 Push r0 DirectCall 1, CP#7 Drop1 Drop1 PushNull ReturnTOS } ConstantPool { [0] = Class #lib::A [1] = ObjectRef < dart:core::int, dart:core::String > [2] = ObjectRef 'hi' [3] = DirectCall '#lib::A:: (constructor)', ArgDesc num-args 2, num-type-args 0, names [] [4] = Reserved [5] = Class #lib::B [6] = ObjectRef < dart:core::List < dart:core::int >, dart:core::String, dart:core::int > [7] = DirectCall '#lib::B:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [8] = Reserved } ]static method foo2() → void { new self::A::•("hi"); new self::B::•(); } [@vm.bytecode= Bytecode { Entry 2 CheckStack 0 CheckFunctionTypeArgs 1, r0 PushNull Push r0 InstantiateTypeArgumentsTOS 0, CP#1 PushConstant CP#0 AllocateT StoreLocal r1 Push r1 DirectCall 1, CP#2 Drop1 Drop1 PushNull ReturnTOS } ConstantPool { [0] = Class #lib::B [1] = ObjectRef < dart:core::List < dart:core::List < #lib::foo3::TypeParam/0 > >, dart:core::String, dart:core::List < #lib::foo3::TypeParam/0 > > [2] = DirectCall '#lib::B:: (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [3] = Reserved } ]static method foo3() → void { new self::B::•>(); } [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 PushConstant CP#0 DirectCall 1, CP#1 Drop1 PushNull ReturnTOS } ConstantPool { [0] = ObjectRef < dart:core::int, dart:core::List < dart:core::String > > [1] = DirectCall '#lib::G::test_factory (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [2] = Reserved } ]static method foo4() → void { self::G::test_factory>(); } [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 PushNull DirectCall 1, CP#0 Drop1 PushNull PushInt 42 DirectCall 2, CP#2 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall '#lib::I::test_factory2 (constructor)', ArgDesc num-args 1, num-type-args 0, names [] [1] = Reserved [2] = DirectCall '#lib::I::test_factory2 (constructor)', ArgDesc num-args 2, num-type-args 0, names ['param'] [3] = Reserved } ]static method foo5() → void { self::I::test_factory2(); self::I::test_factory2(param: 42); } [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 PushConstant CP#0 PushInt 0 DirectCall 2, CP#1 ReturnTOS } ConstantPool { [0] = ObjectRef < dart:core::String > [1] = DirectCall 'dart:core::_GrowableList:: (constructor)', ArgDesc num-args 2, num-type-args 0, names [] [2] = Reserved } ]static method foo6() → dynamic return core::_GrowableList::•(0); [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 PushConstant CP#0 Push FP[-5] DirectCall 2, CP#1 ReturnTOS } ConstantPool { [0] = ObjectRef < dart:core::int > [1] = DirectCall 'dart:core::_List:: (constructor)', ArgDesc num-args 2, num-type-args 0, names [] [2] = Reserved } ]static method foo7(core::int n) → dynamic return core::_List::•(n); [@vm.bytecode= Bytecode { Entry 0 CheckStack 0 DirectCall 0, CP#0 Drop1 DirectCall 0, CP#2 Drop1 PushConstant CP#4 DirectCall 1, CP#5 Drop1 PushNull ReturnTOS } ConstantPool { [0] = DirectCall '#lib::foo1', ArgDesc num-args 0, num-type-args 0, names [] [1] = Reserved [2] = DirectCall '#lib::foo2', ArgDesc num-args 0, num-type-args 0, names [] [3] = Reserved [4] = ObjectRef < dart:core::String > [5] = DirectCall '#lib::foo3', ArgDesc num-args 0, num-type-args 1, names [] [6] = Reserved } ]static method main() → dynamic { self::foo1(); self::foo2(); self::foo3(); }