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

Class '', script = '#lib'

Field 'c1', type = #lib::A, getter = 'get:c1', reflectable, static, const, final
    initializer
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const #lib::A {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}
}


Field 'c2', type = dart:core::String, reflectable, static, const, final
    value = 'hello!'

Field 'c3', type = dart:core::int, reflectable, static, const, final
    value = const 6

Field 'c4', type = #lib::C, getter = 'get:c4', reflectable, static, const, final
    initializer
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const #lib::C {#lib::C::j (field): const 3, #lib::B::i (field): const 15}
}


Field 'c5', type = #lib::D, getter = 'get:c5', reflectable, static, const, final
    initializer
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const #lib::D {#lib::D::x (field): const #lib::B {#lib::B::i (field): const 4}, #lib::D::y (field): null}
}


Field 'fieldWithDoubleLiteralInitializer', type = dart:core::double, reflectable, static
    value = const 1.0

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

Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  DirectCall           CP#1, 1
  Drop1
  PushConstant         CP#3
  DirectCall           CP#1, 1
  Drop1
  PushInt              6
  DirectCall           CP#1, 1
  Drop1
  PushConstant         CP#4
  DirectCall           CP#1, 1
  Drop1
  PushConstant         CP#5
  DirectCall           CP#1, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const #lib::A {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}
  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
  [3] = ObjectRef 'hello!'
  [4] = ObjectRef const #lib::C {#lib::C::j (field): const 3, #lib::B::i (field): const 15}
  [5] = ObjectRef const #lib::D {#lib::D::x (field): const #lib::B {#lib::B::i (field): const 4}, #lib::D::y (field): null}
}


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

Bytecode {
  Entry                0
  CheckStack           0
  PushInt              42
  DirectCall           CP#0, 1
  Drop1
  PushConstant         CP#2
  DirectCall           CP#0, 1
  Drop1
  PushConstant         CP#3
  DirectCall           CP#0, 1
  Drop1
  PushConstant         CP#4
  DirectCall           CP#0, 1
  Drop1
  PushConstant         CP#5
  DirectCall           CP#0, 1
  Drop1
  PushConstant         CP#6
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
  [2] = ObjectRef 'foo'
  [3] = ObjectRef const #lib::A {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}
  [4] = ObjectRef const <dart:core::Object> [const 42, 'foo', dart:core::int]
  [5] = ObjectRef const dart:core::_ImmutableMap < dart:core::String, #lib::A > {dart:core::_ImmutableMap::_kvPairs (field): const <dynamic> ['E2', const #lib::A {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}, 'E4', const #lib::A {#lib::A::index (field): const 3, #lib::A::_name (field): 'A.elem4'}]}
  [6] = ObjectRef const #lib::D {#lib::D::x (field): const #lib::C {#lib::C::j (field): const 9, #lib::B::i (field): const 30}, #lib::D::y (field): const dart:core::_ImmutableMap < dart:core::String, dart:core::Object > {dart:core::_ImmutableMap::_kvPairs (field): const <dynamic> ['foo', const 42, 'bar', const #lib::B {#lib::B::i (field): const 6}]}}
}


Function 'test_list_literal', static, reflectable, debuggable
    parameters [dart:core::int 'a'] (required: 1)
    return-type void

Bytecode {
  Entry                1
  CheckStack           0
  PushConstant         CP#0
  StoreLocal           r0
  Push                 r0
  PushInt              3
  CreateArrayTOS
  StoreLocal           r0
  Push                 r0
  PushInt              0
  PushInt              1
  StoreIndexedTOS
  Push                 r0
  PushInt              1
  Push                 FP[-5]
  StoreIndexedTOS
  Push                 r0
  PushInt              2
  PushInt              3
  StoreIndexedTOS
  DirectCall           CP#1, 2
  DirectCall           CP#3, 1
  Drop1
  PushConstant         CP#5
  StoreLocal           r0
  Push                 r0
  PushInt              3
  CreateArrayTOS
  StoreLocal           r0
  Push                 r0
  PushInt              0
  PushConstant         CP#6
  StoreIndexedTOS
  Push                 r0
  PushInt              1
  Push                 FP[-5]
  InterfaceCall        CP#7, 1
  StoreIndexedTOS
  Push                 r0
  PushInt              2
  PushConstant         CP#9
  StoreIndexedTOS
  DirectCall           CP#1, 2
  DirectCall           CP#3, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef < dart:core::int >
  [1] = DirectCall 'dart:core::List::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
  [2] = Reserved
  [3] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [4] = Reserved
  [5] = ObjectRef < dart:core::String >
  [6] = ObjectRef 'a'
  [7] = InterfaceCall 'dart:core::int::toString', ArgDesc num-args 1, num-type-args 0, names []
  [8] = Reserved
  [9] = ObjectRef 'b'
}


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

Bytecode {
  Entry                2
  CheckFunctionTypeArgs 1, r0
  CheckStack           0
  PushConstant         CP#0
  PushConstant         CP#1
  PushInt              4
  CreateArrayTOS
  StoreLocal           r1
  Push                 r1
  PushInt              0
  PushInt              1
  StoreIndexedTOS
  Push                 r1
  PushInt              1
  Push                 FP[-7]
  StoreIndexedTOS
  Push                 r1
  PushInt              2
  Push                 FP[-6]
  StoreIndexedTOS
  Push                 r1
  PushInt              3
  PushInt              2
  StoreIndexedTOS
  DirectCall           CP#2, 2
  DirectCall           CP#4, 1
  Drop1
  PushConstant         CP#6
  PushConstant         CP#1
  PushInt              4
  CreateArrayTOS
  StoreLocal           r1
  Push                 r1
  PushInt              0
  PushConstant         CP#7
  StoreIndexedTOS
  Push                 r1
  PushInt              1
  Push                 FP[-7]
  StoreIndexedTOS
  Push                 r1
  PushInt              2
  Push                 FP[-6]
  InterfaceCall        CP#8, 1
  StoreIndexedTOS
  Push                 r1
  PushInt              3
  PushInt              3
  StoreIndexedTOS
  DirectCall           CP#2, 2
  DirectCall           CP#4, 1
  Drop1
  PushNull
  Push                 r0
  InstantiateTypeArgumentsTOS 0, CP#10
  PushConstant         CP#11
  DirectCall           CP#2, 2
  DirectCall           CP#4, 1
  Drop1
  PushNull
  Push                 r0
  InstantiateTypeArgumentsTOS 0, CP#12
  PushConstant         CP#1
  PushInt              2
  CreateArrayTOS
  StoreLocal           r1
  Push                 r1
  PushInt              0
  Push                 FP[-5]
  StoreIndexedTOS
  Push                 r1
  PushInt              1
  PushInt              4
  StoreIndexedTOS
  DirectCall           CP#2, 2
  DirectCall           CP#4, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef < dart:core::int, dart:core::int >
  [1] = ObjectRef < dynamic >
  [2] = DirectCall 'dart:core::Map::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
  [3] = Reserved
  [4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [5] = Reserved
  [6] = ObjectRef < dart:core::String, dart:core::int >
  [7] = ObjectRef 'foo'
  [8] = InterfaceCall 'dart:core::int::toString', ArgDesc num-args 1, num-type-args 0, names []
  [9] = Reserved
  [10] = ObjectRef < dart:core::String, #lib::test_map_literal::TypeParam/0 >
  [11] = ObjectRef const <dynamic> []
  [12] = ObjectRef < #lib::test_map_literal::TypeParam/0, dart:core::int >
}


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

Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  DirectCall           CP#1, 1
  Drop1
  PushConstant         CP#3
  DirectCall           CP#1, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const 'test_symbol'
  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
  [3] = ObjectRef const '_private_symbol'
}


Function 'test_type_literal', static, reflectable, debuggable
    type-params <dart:core::Object T>
    parameters [] (required: 0)
    return-type void

Bytecode {
  Entry                1
  CheckFunctionTypeArgs 1, r0
  CheckStack           0
  PushConstant         CP#0
  DirectCall           CP#1, 1
  Drop1
  PushNull
  Push                 r0
  InstantiateType      CP#3
  DirectCall           CP#1, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = Type dart:core::String
  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
  [3] = Type #lib::test_type_literal::TypeParam/0
}


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

Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const #lib::F < dart:core::Map < dart:core::int, dart:core::String >, dart:core::int, dart:core::String > {}
}


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

Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = Type FunctionType <dart:core::Object X> (null::TypeParam/0) -> null::TypeParam/0
}


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

Bytecode {
  Entry                0
  CheckStack           0
  LoadStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::fieldWithDoubleLiteralInitializer (field)
}


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

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

Class 'A', script = '#lib', enum
    extends dart:core::Object

Field 'index', type = dart:core::int, getter = 'get:index', reflectable, final
    value = null

Field '_name', type = dart:core::String, getter = 'get:_name', reflectable, final
    value = null

Field 'values', type = dart:core::List < #lib::A >, getter = 'get:values', reflectable, static, const, final
    initializer
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const <#lib::A> [const #lib::A {#lib::A::index (field): const 0, #lib::A::_name (field): 'A.elem1'}, const #lib::A {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}, const #lib::A {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}, const #lib::A {#lib::A::index (field): const 3, #lib::A::_name (field): 'A.elem4'}]
}


Field 'elem1', type = #lib::A, getter = 'get:elem1', reflectable, static, const, final
    initializer
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const #lib::A {#lib::A::index (field): const 0, #lib::A::_name (field): 'A.elem1'}
}


Field 'elem2', type = #lib::A, getter = 'get:elem2', reflectable, static, const, final
    initializer
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const #lib::A {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}
}


Field 'elem3', type = #lib::A, getter = 'get:elem3', reflectable, static, const, final
    initializer
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const #lib::A {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}
}


Field 'elem4', type = #lib::A, getter = 'get:elem4', reflectable, static, const, final
    initializer
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const #lib::A {#lib::A::index (field): const 3, #lib::A::_name (field): 'A.elem4'}
}


Function '', constructor, const, reflectable, debuggable
    parameters [dart:core::int 'index', dart:core::String '_name'] (required: 2)
    return-type #lib::A

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-7]
  Push                 FP[-6]
  StoreFieldTOS        CP#0
  Push                 FP[-7]
  Push                 FP[-5]
  StoreFieldTOS        CP#2
  Push                 FP[-7]
  DirectCall           CP#4, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = InstanceField #lib::A::index (field)
  [1] = Reserved
  [2] = InstanceField #lib::A::_name (field)
  [3] = Reserved
  [4] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [5] = Reserved
}


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

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

Class 'B', script = '#lib'
    extends dart:core::Object

Field 'i', type = dart:core::int, getter = 'get:i', reflectable, final
    value = null

Function '', constructor, const, reflectable, debuggable
    parameters [dart:core::int 'i'] (required: 1)
    return-type #lib::B

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

Class 'C', script = '#lib'
    extends #lib::B

Field 'j', type = dart:core::int, getter = 'get:j', reflectable, final
    value = null

Function '', constructor, const, reflectable, debuggable
    parameters [dart:core::int 'a', dart:core::int 'b', dart:core::int 'c'] (required: 3)
    return-type #lib::C

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-8]
  Push                 FP[-7]
  Push                 FP[-6]
  AddInt
  StoreFieldTOS        CP#0
  Push                 FP[-8]
  Push                 FP[-5]
  PushInt              5
  MulInt
  DirectCall           CP#2, 2
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = InstanceField #lib::C::j (field)
  [1] = Reserved
  [2] = DirectCall '#lib::B:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
  [3] = Reserved
}

Class 'D', script = '#lib'
    extends dart:core::Object

Field 'x', type = dynamic, getter = 'get:x', reflectable, final
    value = null

Field 'y', type = dynamic, getter = 'get:y', reflectable, final
    value = null

Function '', constructor, const, has-optional-positional-params, reflectable, debuggable
    parameters [dynamic 'x', dynamic 'y'] (required: 1)
    return-type #lib::D

Bytecode {
  EntryOptional        2, 1, 0
  LoadConstant         r2, CP#0
  Frame                0
  CheckStack           0
  Push                 r0
  Push                 r1
  StoreFieldTOS        CP#1
  Push                 r0
  Push                 r2
  StoreFieldTOS        CP#3
  Push                 r0
  DirectCall           CP#5, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef null
  [1] = InstanceField #lib::D::x (field)
  [2] = Reserved
  [3] = InstanceField #lib::D::y (field)
  [4] = Reserved
  [5] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [6] = Reserved
}

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


Function '', constructor, const, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::E < #lib::E::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
}

Class 'F', script = '#lib'
    type-params <dart:core::Object P, dart:core::Object Q> (args: 3)
    extends #lib::E < dart:core::Map < #lib::F::TypeParam/0, #lib::F::TypeParam/1 > >


Function '', constructor, const, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::F < dart:core::Map < #lib::F::TypeParam/0, #lib::F::TypeParam/1 >, #lib::F::TypeParam/0, #lib::F::TypeParam/1 >

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


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

  typedef GenericFunctionType = <X extends dart.core::Object* = dynamic>(X*) →* X*;
  class A extends dart.core::Object {
    final field dart.core::int* index;
    final field dart.core::String* _name;
    static const field dart.core::List<#lib::A*>* values = #C13;
    static const field #lib::A* elem1 = #C3;
    static const field #lib::A* elem2 = #C6;
    static const field #lib::A* elem3 = #C9;
    static const field #lib::A* elem4 = #C12;
    const constructor •(dart.core::int* index, dart.core::String* _name) → #lib::A*
      : #lib::A::index = index, #lib::A::_name = _name, super dart.core::Object::•()
      ;
    method toString() → dart.core::String*
      return this.{=#lib::A::_name};
  }
  class B extends dart.core::Object {
    final field dart.core::int* i;
    const constructor •(dart.core::int* i) → #lib::B*
      : #lib::B::i = i, super dart.core::Object::•()
      ;
  }
  class C extends #lib::B {
    final field dart.core::int* j;
    const constructor •(dart.core::int* a, dart.core::int* b, dart.core::int* c) → #lib::C*
      : #lib::C::j = a.{dart.core::num::+}(b), super #lib::B::•(c.{dart.core::num::*}(5))
      ;
  }
  class D extends dart.core::Object {
    final field dynamic x;
    final field dynamic y;
    const constructor •(dynamic x, [dynamic y = #C14]) → #lib::D*
      : #lib::D::x = x, #lib::D::y = y, super dart.core::Object::•()
      ;
  }
  class E<T extends dart.core::Object* = dynamic> extends dart.core::Object {
    const constructor •() → #lib::E<#lib::E::T*>*
      : super dart.core::Object::•()
      ;
  }
  class F<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic> extends #lib::E<dart.core::Map<#lib::F::P*, #lib::F::Q*>*> {
    const constructor •() → #lib::F<#lib::F::P*, #lib::F::Q*>*
      : super #lib::E::•()
      ;
  }
  static const field #lib::A* c1 = #C9;
  static const field dart.core::String* c2 = #C15;
  static const field dart.core::int* c3 = #C16;
  static const field #lib::C* c4 = #C18;
  static const field #lib::D* c5 = #C21;
  static field dart.core::double* fieldWithDoubleLiteralInitializer = 1.0;
  static method test_constants1() → void {
    dart.core::print(#C9);
    dart.core::print(#C15);
    dart.core::print(#C16);
    dart.core::print(#C18);
    dart.core::print(#C21);
  }
  static method test_constants2() → void {
    dart.core::print(42);
    dart.core::print("foo");
    dart.core::print(#C6);
    dart.core::print(#C25);
    dart.core::print(#C29);
    dart.core::print(#C37);
  }
  static method test_list_literal(dart.core::int* a) → void {
    dart.core::print(<dart.core::int*>[1, a, 3]);
    dart.core::print(<dart.core::String*>["a", a.{dart.core::int::toString}(), "b"]);
  }
  static method test_map_literal<T extends dart.core::Object* = dynamic>(dart.core::int* a, dart.core::int* b, #lib::test_map_literal::T* c) → void {
    dart.core::print(<dart.core::int*, dart.core::int*>{1: a, b: 2});
    dart.core::print(<dart.core::String*, dart.core::int*>{"foo": a, b.{dart.core::int::toString}(): 3});
    dart.core::print(<dart.core::String*, #lib::test_map_literal::T*>{});
    dart.core::print(<#lib::test_map_literal::T*, dart.core::int*>{c: 4});
  }
  static method test_symbol() → void {
    dart.core::print(#C38);
    dart.core::print(#C39);
  }
  static method test_type_literal<T extends dart.core::Object* = dynamic>() → void {
    dart.core::print(dart.core::String*);
    dart.core::print(#lib::test_type_literal::T*);
  }
  static method testGenericConstInstance() → dynamic
    return #C40;
  static method testGenericFunctionTypeLiteral() → dynamic
    return <X extends dart.core::Object* = dynamic>(X*) →* X*;
  static method testFieldWithDoubleLiteralInitializer() → dynamic
    return #lib::fieldWithDoubleLiteralInitializer;
  static method main() → dynamic {}
}
constants  {
  #C1 = 0
  #C2 = "A.elem1"
  #C3 = #lib::A {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "A.elem2"
  #C6 = #lib::A {index:#C4, _name:#C5}
  #C7 = 2
  #C8 = "A.elem3"
  #C9 = #lib::A {index:#C7, _name:#C8}
  #C10 = 3
  #C11 = "A.elem4"
  #C12 = #lib::A {index:#C10, _name:#C11}
  #C13 = <#lib::A*>[#C3, #C6, #C9, #C12]
  #C14 = null
  #C15 = "hello!"
  #C16 = 6
  #C17 = 15
  #C18 = #lib::C {j:#C10, i:#C17}
  #C19 = 4
  #C20 = #lib::B {i:#C19}
  #C21 = #lib::D {x:#C20, y:#C14}
  #C22 = 42
  #C23 = "foo"
  #C24 = TypeLiteralConstant(dart.core::int*)
  #C25 = <dart.core::Object*>[#C22, #C23, #C24]
  #C26 = "E2"
  #C27 = "E4"
  #C28 = <dynamic>[#C26, #C6, #C27, #C12]
  #C29 = dart.core::_ImmutableMap<dart.core::String*, #lib::A*> {_kvPairs:#C28}
  #C30 = 9
  #C31 = 30
  #C32 = #lib::C {j:#C30, i:#C31}
  #C33 = "bar"
  #C34 = #lib::B {i:#C16}
  #C35 = <dynamic>[#C23, #C22, #C33, #C34]
  #C36 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Object*> {_kvPairs:#C35}
  #C37 = #lib::D {x:#C32, y:#C36}
  #C38 = #test_symbol
  #C39 = ##lib::_private_symbol
  #C40 = #lib::F<dart.core::int*, dart.core::String*> {}
}
