main = #lib::main;
 [@vm.bytecode=
BytecodeMetadata {
Bytecode (version: stable)
Main library: #lib
Library '#lib'
    name '#lib'
    script '#lib'

Class '', script = '#lib'

Field 'globalVar', type = dart:core::List < dart:core::Iterable null >, reflectable, static
    value = null

Function 'foo1', static, reflectable, debuggable
    parameters [dynamic 'x'] (required: 1)
    return-type dynamic

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#0
  InterfaceCall        CP#1, 2
  JumpIfFalse          L1
  PushConstant         CP#3
  DirectCall           CP#4, 1
  Drop1
L1:
  Push                 FP[-5]
  PushNull
  PushNull
  PushConstant         CP#6
  InterfaceCall        CP#7, 4
  JumpIfFalse          L2
  PushConstant         CP#9
  DirectCall           CP#4, 1
  Drop1
L2:
  Push                 FP[-5]
  PushConstant         CP#10
  PushNull
  PushNull
  PushConstant         CP#11
  AssertAssignable     0, CP#12
  ReturnTOS
}
ConstantPool {
  [0] = Type #lib::B < dart:core::String >
  [1] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
  [2] = Reserved
  [3] = ObjectRef '11'
  [4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [5] = Reserved
  [6] = Type #lib::C < dart:core::String, dart:core::int, dart:core::Object, dynamic >
  [7] = InterfaceCall 'dart:core::Object::_instanceOf', ArgDesc num-args 4, num-type-args 0, names []
  [8] = Reserved
  [9] = ObjectRef '12'
  [10] = Type #lib::A < dart:core::int >
  [11] = ObjectRef ' in type cast'
  [12] = SubtypeTestCache
}


Function 'foo5', static, reflectable, debuggable
    parameters [dynamic 'x'] (required: 1)
    return-type void

Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#0
  PushNull
  PushNull
  PushConstant         CP#1
  AssertAssignable     0, CP#2
  StoreStaticTOS       CP#3
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = Type dart:core::List < dart:core::Iterable null >
  [1] = ObjectRef ''
  [2] = SubtypeTestCache
  [3] = StaticField #lib::globalVar (field)
}


Function 'main', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}

Class 'A', script = '#lib'
    type-params <dart:core::Object T> (args: 1)
    extends dart:core::Object


Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::A < #lib::A::TypeParam/0 >

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function 'get:_identityHashCode', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Function '_instanceOf', abstract, debuggable
    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
    return-type dart:core::bool

Function '_simpleInstanceOf', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '_simpleInstanceOfTrue', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '_simpleInstanceOfFalse', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '==', abstract, debuggable
    parameters [dynamic 'other'] (required: 1)
    return-type dart:core::bool

Function 'get:hashCode', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Function 'toString', abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::String

Function 'noSuchMethod', abstract, debuggable
    parameters [dart:core::Invocation 'invocation'] (required: 1)
    return-type dynamic

Function 'get:runtimeType', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::Type
Class 'B', script = '#lib'
    extends #lib::A < dart:core::String >


Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::B < dart:core::String >

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::A:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}

Class 'C', script = '#lib'
    type-params <dart:core::Object T1, dart:core::Object T2, dart:core::Object T3> (args: 4)
    extends #lib::B < dart:core::String >


Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::C < dart:core::String, #lib::C::TypeParam/0, #lib::C::TypeParam/1, #lib::C::TypeParam/2 >

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::B:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}

Class 'D', script = '#lib'
    type-params <dart:core::Object P, dart:core::Object Q> (args: 5)
    extends #lib::C < dart:core::String, dart:core::int, #lib::D::TypeParam/1, #lib::D::TypeParam/0 >

Field 'foo', type = dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >, getter = 'get:foo', setter = 'set:foo', reflectable
    value = null

Function '', constructor, reflectable, debuggable
    parameters [dynamic 'tt'] (required: 1)
    return-type #lib::D < dart:core::String, dart:core::int, #lib::D::TypeParam/1, #lib::D::TypeParam/0, #lib::D::TypeParam/1 >

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-6]
  Push                 FP[-5]
  PushConstant         CP#0
  Push                 FP[-6]
  LoadTypeArgumentsField CP#1
  PushNull
  PushConstant         CP#2
  AssertAssignable     0, CP#3
  StoreFieldTOS        CP#4
  Push                 FP[-6]
  DirectCall           CP#6, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = Type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >
  [1] = TypeArgumentsField #lib::D
  [2] = ObjectRef ''
  [3] = SubtypeTestCache
  [4] = InstanceField #lib::D::foo (field)
  [5] = Reserved
  [6] = DirectCall '#lib::C:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [7] = Reserved
}


Function 'foo2', reflectable, debuggable
    parameters [dynamic 'y'] (required: 1)
    return-type dynamic

Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#1
  InterfaceCall        CP#2, 4
  JumpIfFalse          L1
  PushConstant         CP#4
  DirectCall           CP#5, 1
  Drop1
L1:
  Push                 FP[-5]
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#7
  InterfaceCall        CP#2, 4
  JumpIfFalse          L2
  PushConstant         CP#8
  DirectCall           CP#5, 1
  Drop1
L2:
  Push                 FP[-6]
  Push                 FP[-5]
  PushConstant         CP#9
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#10
  AssertAssignable     0, CP#11
  UncheckedInterfaceCall CP#12, 2
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = TypeArgumentsField #lib::D
  [1] = Type #lib::A < #lib::D::TypeParam/0 >
  [2] = InterfaceCall 'dart:core::Object::_instanceOf', ArgDesc num-args 4, num-type-args 0, names []
  [3] = Reserved
  [4] = ObjectRef '21'
  [5] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [6] = Reserved
  [7] = Type #lib::C < dart:core::String, dynamic, #lib::D::TypeParam/1, dart:core::List < #lib::D::TypeParam/0 > >
  [8] = ObjectRef '22'
  [9] = Type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >
  [10] = ObjectRef ''
  [11] = SubtypeTestCache
  [12] = InterfaceCall '#lib::D::set:foo', ArgDesc num-args 2, num-type-args 0, names []
  [13] = Reserved
}


Function 'foo3', reflectable, debuggable
    type-params <dart:core::Object T1, dart:core::Object T2>
    parameters [dynamic 'z'] (required: 1)
    return-type dynamic

Bytecode {
  Entry                1
  CheckFunctionTypeArgs 2, r0
  CheckStack           0
  Push                 FP[-5]
  PushNull
  Push                 r0
  PushConstant         CP#0
  InterfaceCall        CP#1, 4
  JumpIfFalse          L1
  PushConstant         CP#3
  DirectCall           CP#4, 1
  Drop1
L1:
  Push                 FP[-5]
  Push                 FP[-6]
  LoadTypeArgumentsField CP#6
  Push                 r0
  PushConstant         CP#7
  InterfaceCall        CP#1, 4
  JumpIfFalse          L2
  PushConstant         CP#8
  DirectCall           CP#4, 1
  Drop1
L2:
  Push                 FP[-5]
  PushConstant         CP#9
  Push                 FP[-6]
  LoadTypeArgumentsField CP#6
  Push                 r0
  PushConstant         CP#10
  AssertAssignable     0, CP#11
  InterfaceCall        CP#12, 1
  ReturnTOS
}
ConstantPool {
  [0] = Type #lib::A < #lib::D::foo3::TypeParam/0 >
  [1] = InterfaceCall 'dart:core::Object::_instanceOf', ArgDesc num-args 4, num-type-args 0, names []
  [2] = Reserved
  [3] = ObjectRef '31'
  [4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [5] = Reserved
  [6] = TypeArgumentsField #lib::D
  [7] = Type #lib::C < dart:core::String, dart:core::Map < #lib::D::foo3::TypeParam/0, #lib::D::TypeParam/0 >, dart:core::List < #lib::D::foo3::TypeParam/1 >, #lib::D::TypeParam/1 >
  [8] = ObjectRef '32'
  [9] = Type dart:core::Map < #lib::D::foo3::TypeParam/1, #lib::D::TypeParam/1 >
  [10] = ObjectRef ' in type cast'
  [11] = SubtypeTestCache
  [12] = InterfaceCall 'dart:core::Map::get:values', ArgDesc num-args 1, num-type-args 0, names []
  [13] = Reserved
}


Function 'foo4', reflectable, debuggable
    parameters [dynamic 'w'] (required: 1)
    return-type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >

Bytecode {
  Entry                2
  CheckStack           0
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  InstantiateTypeArgumentsTOS 0, CP#1
  StoreLocal           r1
  Push                 r1
  PushInt              1
  CreateArrayTOS
  StoreLocal           r1
  Push                 r1
  PushInt              0
  Push                 FP[-5]
  PushConstant         CP#2
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#3
  AssertAssignable     0, CP#4
  StoreIndexedTOS
  DirectCall           CP#5, 2
  PopLocal             r0
  Push                 FP[-5]
  PushConstant         CP#2
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#3
  AssertAssignable     0, CP#7
  ReturnTOS
}
ConstantPool {
  [0] = TypeArgumentsField #lib::D
  [1] = ObjectRef < dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 > >
  [2] = Type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >
  [3] = ObjectRef ''
  [4] = SubtypeTestCache
  [5] = DirectCall 'dart:core::List::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
  [6] = Reserved
  [7] = SubtypeTestCache
}

Class 'E', script = '#lib'
    type-params <dart:core::String P> (args: 1)
    extends dart:core::Object


Function '', factory, static, reflectable, debuggable
    type-params <dart:core::String P>
    parameters [] (required: 0)
    return-type #lib::E < #lib::E:: (constructor)::TypeParam/0 >

Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}


Function 'foo6', reflectable, debuggable
    type-params <#lib::E::TypeParam/0 T, dart:core::List < #lib::E::foo6::TypeParam/0 > U>
    parameters [dart:core::Map < #lib::E::foo6::TypeParam/0, #lib::E::foo6::TypeParam/1 > 'map'] (required: 1)
    return-type void

Bytecode {
  Entry                1
  CheckFunctionTypeArgs 2, r0
  JumpIfNotZeroTypeArgs L1
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  InstantiateTypeArgumentsTOS 0, CP#1
  PopLocal             r0
L1:
  CheckStack           0
  JumpIfUnchecked      L2
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  Push                 r0
  PushConstant         CP#2
  PushConstant         CP#3
  PushConstant         CP#4
  AssertSubtype
L2:
  PushNull
  ReturnTOS
}
Default function type arguments: CP#1
ConstantPool {
  [0] = TypeArgumentsField #lib::E
  [1] = ObjectRef < #lib::E::TypeParam/0, dart:core::List < #lib::E::TypeParam/0 > >
  [2] = Type #lib::E::foo6::TypeParam/0
  [3] = Type #lib::E::TypeParam/0
  [4] = ObjectRef 'T'
}


Function 'get:_identityHashCode', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Function '_instanceOf', abstract, debuggable
    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
    return-type dart:core::bool

Function '_simpleInstanceOf', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '_simpleInstanceOfTrue', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '_simpleInstanceOfFalse', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '==', abstract, debuggable
    parameters [dynamic 'other'] (required: 1)
    return-type dart:core::bool

Function 'get:hashCode', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Function 'toString', abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::String

Function 'noSuchMethod', abstract, debuggable
    parameters [dart:core::Invocation 'invocation'] (required: 1)
    return-type dynamic

Function 'get:runtimeType', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::Type
Class 'F', script = '#lib', abstract
    type-params <dart:core::Object T> (args: 1)
    extends dart:core::Object


Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::F < #lib::F::TypeParam/0 >

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function 'foo7', abstract, reflectable, debuggable
    type-params <#lib::F::TypeParam/0 Q>
    parameters [#lib::F::foo7::TypeParam/0 'a', dart:core::num 'b', #lib::F::TypeParam/0 'c'] (required: 3)
    return-type void

Function 'foo8', abstract, reflectable, debuggable
    type-params <#lib::F::TypeParam/0 Q>
    parameters [#lib::F::foo8::TypeParam/0 'a', dart:core::num 'b', #lib::F::TypeParam/0 'c'] (required: 3)
    return-type void

Function 'get:_identityHashCode', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Function '_instanceOf', abstract, debuggable
    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
    return-type dart:core::bool

Function '_simpleInstanceOf', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '_simpleInstanceOfTrue', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '_simpleInstanceOfFalse', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '==', abstract, debuggable
    parameters [dynamic 'other'] (required: 1)
    return-type dart:core::bool

Function 'get:hashCode', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Function 'toString', abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::String

Function 'noSuchMethod', abstract, debuggable
    parameters [dart:core::Invocation 'invocation'] (required: 1)
    return-type dynamic

Function 'get:runtimeType', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::Type
Class 'G', script = '#lib'
    type-params <dart:core::Object T> (args: 1)
    extends dart:core::Object


Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::G < #lib::G::TypeParam/0 >

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function 'foo7', reflectable, debuggable
    type-params <#lib::G::TypeParam/0 Q>
    parameters [#lib::G::foo7::TypeParam/0 'a', dart:core::int 'b', #lib::G::TypeParam/0 'c'] (required: 3)
    return-type void

Bytecode {
  Entry                1
  CheckFunctionTypeArgs 1, r0
  JumpIfNotZeroTypeArgs L1
  Push                 FP[-8]
  LoadTypeArgumentsField CP#0
  PopLocal             r0
L1:
  CheckStack           0
  JumpIfUnchecked      L2
  Push                 FP[-8]
  LoadTypeArgumentsField CP#0
  Push                 r0
  PushConstant         CP#1
  PushConstant         CP#2
  PushConstant         CP#3
  AssertSubtype
  Push                 FP[-5]
  PushConstant         CP#2
  Push                 FP[-8]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#4
  AssertAssignable     0, CP#5
  Drop1
L2:
  PushNull
  ReturnTOS
}
Parameter flags: [0, 0, 2]
Default function type arguments: CP#6
ConstantPool {
  [0] = TypeArgumentsField #lib::G
  [1] = Type #lib::G::foo7::TypeParam/0
  [2] = Type #lib::G::TypeParam/0
  [3] = ObjectRef 'Q'
  [4] = ObjectRef 'c'
  [5] = SubtypeTestCache
  [6] = ObjectRef < #lib::G::TypeParam/0 >
}


Function 'get:_identityHashCode', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Function '_instanceOf', abstract, debuggable
    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
    return-type dart:core::bool

Function '_simpleInstanceOf', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '_simpleInstanceOfTrue', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '_simpleInstanceOfFalse', abstract, debuggable
    parameters [dynamic 'type'] (required: 1)
    return-type dart:core::bool

Function '==', abstract, debuggable
    parameters [dynamic 'other'] (required: 1)
    return-type dart:core::bool

Function 'get:hashCode', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Function 'toString', abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::String

Function 'noSuchMethod', abstract, debuggable
    parameters [dart:core::Invocation 'invocation'] (required: 1)
    return-type dynamic

Function 'get:runtimeType', getter, abstract, debuggable
    parameters [] (required: 0)
    return-type dart:core::Type
Class 'H', script = '#lib'
    type-params <dart:core::Object T> (args: 1)
    extends #lib::G < #lib::H::TypeParam/0 >
    implements [#lib::F < #lib::H::TypeParam/0 >]


Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::H < #lib::H::TypeParam/0 >

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::G:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function 'foo8', reflectable, debuggable
    type-params <#lib::H::TypeParam/0 Q>
    parameters [#lib::H::foo8::TypeParam/0 'a', dart:core::int 'b', #lib::H::TypeParam/0 'c'] (required: 3)
    return-type void

Bytecode {
  Entry                1
  CheckFunctionTypeArgs 1, r0
  JumpIfNotZeroTypeArgs L1
  Push                 FP[-8]
  LoadTypeArgumentsField CP#0
  PopLocal             r0
L1:
  CheckStack           0
  JumpIfUnchecked      L2
  Push                 FP[-8]
  LoadTypeArgumentsField CP#0
  Push                 r0
  PushConstant         CP#1
  PushConstant         CP#2
  PushConstant         CP#3
  AssertSubtype
  Push                 FP[-5]
  PushConstant         CP#2
  Push                 FP[-8]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#4
  AssertAssignable     0, CP#5
  Drop1
L2:
  Push                 FP[-6]
  PushConstant         CP#6
  PushNull
  PushNull
  PushConstant         CP#7
  AssertAssignable     1, CP#8
  Drop1
  PushNull
  ReturnTOS
}
Parameter flags: [0, 1, 2]
Default function type arguments: CP#9
ConstantPool {
  [0] = TypeArgumentsField #lib::H
  [1] = Type #lib::H::foo8::TypeParam/0
  [2] = Type #lib::H::TypeParam/0
  [3] = ObjectRef 'Q'
  [4] = ObjectRef 'c'
  [5] = SubtypeTestCache
  [6] = Type dart:core::int
  [7] = ObjectRef 'b'
  [8] = SubtypeTestCache
  [9] = ObjectRef < #lib::H::TypeParam/0 >
}


Function 'foo7', reflectable, debuggable, forwarding-stub
    type-params <#lib::H::TypeParam/0 Q>
    parameters [#lib::H::foo7::TypeParam/0 'a', dart:core::num 'b', #lib::H::TypeParam/0 'c'] (required: 3)
    return-type void

Bytecode {
  Entry                2
  CheckFunctionTypeArgs 1, r0
  JumpIfNotZeroTypeArgs L1
  Push                 FP[-8]
  LoadTypeArgumentsField CP#0
  PopLocal             r0
L1:
  CheckStack           0
  JumpIfUnchecked      L2
  Push                 FP[-8]
  LoadTypeArgumentsField CP#0
  Push                 r0
  PushConstant         CP#1
  PushConstant         CP#2
  PushConstant         CP#3
  AssertSubtype
  Push                 FP[-5]
  PushConstant         CP#2
  Push                 FP[-8]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#4
  AssertAssignable     0, CP#5
  Drop1
L2:
  Push                 FP[-6]
  PushConstant         CP#6
  PushNull
  PushNull
  PushConstant         CP#7
  AssertAssignable     1, CP#8
  Drop1
  Push                 r0
  Push                 FP[-8]
  Push                 FP[-7]
  Push                 FP[-6]
  Push                 FP[-5]
  UncheckedDirectCall  CP#9, 5
  ReturnTOS
}
Parameter flags: [0, 1, 2]
Forwarding stub target: CP#11
Default function type arguments: CP#12
ConstantPool {
  [0] = TypeArgumentsField #lib::H
  [1] = Type #lib::H::foo7::TypeParam/0
  [2] = Type #lib::H::TypeParam/0
  [3] = ObjectRef 'Q'
  [4] = ObjectRef 'c'
  [5] = SubtypeTestCache
  [6] = Type dart:core::int
  [7] = ObjectRef 'b'
  [8] = SubtypeTestCache
  [9] = DirectCall '#lib::G::foo7', ArgDesc num-args 4, num-type-args 1, names []
  [10] = Reserved
  [11] = ObjectRef #lib::G::foo7
  [12] = ObjectRef < #lib::H::TypeParam/0 >
}


}
]library #lib from "#lib" as #lib {

  class A<T extends dart.core::Object* = dynamic> extends dart.core::Object {
    synthetic constructor •() → #lib::A<#lib::A::T*>*
      : super dart.core::Object::•()
      ;
    abstract member-signature get _identityHashCode() → dart.core::int*;
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*;
    abstract member-signature operator ==(dynamic other) → dart.core::bool*;
    abstract member-signature get hashCode() → dart.core::int*;
    abstract member-signature method toString() → dart.core::String*;
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic;
    abstract member-signature get runtimeType() → dart.core::Type*;
  }
  class B extends #lib::A<dart.core::String*> {
    synthetic constructor •() → #lib::B*
      : super #lib::A::•()
      ;
  }
  class C<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic, T3 extends dart.core::Object* = dynamic> extends #lib::B {
    synthetic constructor •() → #lib::C<#lib::C::T1*, #lib::C::T2*, #lib::C::T3*>*
      : super #lib::B::•()
      ;
  }
  class D<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic> extends #lib::C<dart.core::int*, #lib::D::Q*, #lib::D::P*> {
    generic-covariant-impl field dart.core::Map<#lib::D::P*, #lib::D::Q*>* foo;
    constructor •(dynamic tt) → #lib::D<#lib::D::P*, #lib::D::Q*>*
      : #lib::D::foo = tt as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*, super #lib::C::•()
      ;
    method foo2(dynamic y) → dynamic {
      if(y is #lib::A<#lib::D::P*>*) {
        dart.core::print("21");
      }
      if(y is #lib::C<dynamic, #lib::D::Q*, dart.core::List<#lib::D::P*>*>*) {
        dart.core::print("22");
      }
      [@vm.call-site-attributes.metadata=receiverType:InterfaceType(D<D::P*, D::Q*>*)] this.{#lib::D::foo} = y as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
    }
    method foo3<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic>(dynamic z) → dynamic {
      if(z is #lib::A<#lib::D::foo3::T1*>*) {
        dart.core::print("31");
      }
      if(z is #lib::C<dart.core::Map<#lib::D::foo3::T1*, #lib::D::P*>*, dart.core::List<#lib::D::foo3::T2*>*, #lib::D::Q*>*) {
        dart.core::print("32");
      }
      return (z as dart.core::Map<#lib::D::foo3::T2*, #lib::D::Q*>*).{dart.core::Map::values};
    }
    method foo4(dynamic w) → dart.core::Map<#lib::D::P*, #lib::D::Q*>* {
      dart.core::List<dart.core::Map<#lib::D::P*, #lib::D::Q*>*>* list = <dart.core::Map<#lib::D::P*, #lib::D::Q*>*>[w as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*];
      return w as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
    }
  }
  class E<P extends dart.core::String* = dart.core::String*> extends dart.core::Object {
    static factory •<P extends dart.core::String* = dynamic>() → #lib::E<#lib::E::•::P*>*
      return null;
    method foo6<generic-covariant-impl T extends #lib::E::P* = #lib::E::P*, U extends dart.core::List<#lib::E::foo6::T*>* = dart.core::List<#lib::E::P*>*>(dart.core::Map<#lib::E::foo6::T*, #lib::E::foo6::U*>* map) → void {}
    abstract member-signature get _identityHashCode() → dart.core::int*;
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*;
    abstract member-signature operator ==(dynamic other) → dart.core::bool*;
    abstract member-signature get hashCode() → dart.core::int*;
    abstract member-signature method toString() → dart.core::String*;
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic;
    abstract member-signature get runtimeType() → dart.core::Type*;
  }
  abstract class F<T extends dart.core::Object* = dynamic> extends dart.core::Object {
    synthetic constructor •() → #lib::F<#lib::F::T*>*
      : super dart.core::Object::•()
      ;
    abstract method foo7<generic-covariant-impl Q extends #lib::F::T* = #lib::F::T*>(#lib::F::foo7::Q* a, covariant dart.core::num* b, generic-covariant-impl #lib::F::T* c) → void;
    abstract method foo8<generic-covariant-impl Q extends #lib::F::T* = #lib::F::T*>(#lib::F::foo8::Q* a, covariant dart.core::num* b, generic-covariant-impl #lib::F::T* c) → void;
    abstract member-signature get _identityHashCode() → dart.core::int*;
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*;
    abstract member-signature operator ==(dynamic other) → dart.core::bool*;
    abstract member-signature get hashCode() → dart.core::int*;
    abstract member-signature method toString() → dart.core::String*;
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic;
    abstract member-signature get runtimeType() → dart.core::Type*;
  }
  class G<T extends dart.core::Object* = dynamic> extends dart.core::Object {
    synthetic constructor •() → #lib::G<#lib::G::T*>*
      : super dart.core::Object::•()
      ;
    method foo7<generic-covariant-impl Q extends #lib::G::T* = #lib::G::T*>(#lib::G::foo7::Q* a, dart.core::int* b, generic-covariant-impl #lib::G::T* c) → void {}
    abstract member-signature get _identityHashCode() → dart.core::int*;
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*;
    abstract member-signature operator ==(dynamic other) → dart.core::bool*;
    abstract member-signature get hashCode() → dart.core::int*;
    abstract member-signature method toString() → dart.core::String*;
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic;
    abstract member-signature get runtimeType() → dart.core::Type*;
  }
  class H<T extends dart.core::Object* = dynamic> extends #lib::G<#lib::H::T*> implements #lib::F<#lib::H::T*> {
    synthetic constructor •() → #lib::H<#lib::H::T*>*
      : super #lib::G::•()
      ;
    method foo8<generic-covariant-impl Q extends #lib::H::T* = #lib::H::T*>(#lib::H::foo8::Q* a, covariant dart.core::int* b, generic-covariant-impl #lib::H::T* c) → void {}
    forwarding-stub method foo7<generic-covariant-impl Q extends #lib::H::T* = #lib::H::T*>(#lib::H::foo7::Q* a, covariant dart.core::num* b, generic-covariant-impl #lib::H::T* c) → void
      return super.{#lib::G::foo7}<#lib::H::foo7::Q*>(a, b, c);
  }
  static field dart.core::List<dart.core::Iterable<dynamic>*>* globalVar;
  static method foo1(dynamic x) → dynamic {
    if(x is #lib::B*) {
      dart.core::print("11");
    }
    if(x is #lib::C<dart.core::int*, dart.core::Object*, dynamic>*) {
      dart.core::print("12");
    }
    return x as #lib::A<dart.core::int*>*;
  }
  static method foo5(dynamic x) → void {
    #lib::globalVar = x as{TypeError,ForDynamic} dart.core::List<dart.core::Iterable<dynamic>*>*;
  }
  static method main() → dynamic {}
}
