main = #lib::main;
 [@vm.bytecode=
ComponentBytecodeMetadata {

Bytecode (version: stable)
Main library: #lib

}
] [@vm.bytecode=
MembersBytecodeMetadata {

Members {
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           1, CP#1
  Drop1
  PushConstant         CP#3
  DirectCall           1, CP#1
  Drop1
  PushInt              6
  DirectCall           1, CP#1
  Drop1
  PushConstant         CP#4
  DirectCall           1, CP#1
  Drop1
  PushConstant         CP#5
  DirectCall           1, CP#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           1, CP#0
  Drop1
  PushConstant         CP#2
  DirectCall           1, CP#0
  Drop1
  PushConstant         CP#3
  DirectCall           1, CP#0
  Drop1
  PushConstant         CP#4
  DirectCall           1, CP#0
  Drop1
  PushConstant         CP#5
  DirectCall           1, CP#0
  Drop1
  PushConstant         CP#6
  DirectCall           1, CP#0
  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           2, CP#1
  DirectCall           1, CP#3
  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        1, CP#7
  StoreIndexedTOS
  Push                 r0
  PushInt              2
  PushConstant         CP#9
  StoreIndexedTOS
  DirectCall           2, CP#1
  DirectCall           1, CP#3
  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
  CheckStack           0
  CheckFunctionTypeArgs 1, r0
  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           2, CP#2
  DirectCall           1, CP#4
  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        1, CP#8
  StoreIndexedTOS
  Push                 r1
  PushInt              3
  PushInt              3
  StoreIndexedTOS
  DirectCall           2, CP#2
  DirectCall           1, CP#4
  Drop1
  PushNull
  Push                 r0
  InstantiateTypeArgumentsTOS 0, CP#10
  PushConstant         CP#11
  DirectCall           2, CP#2
  DirectCall           1, CP#4
  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           2, CP#2
  DirectCall           1, CP#4
  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           1, CP#1
  Drop1
  PushConstant         CP#3
  DirectCall           1, CP#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
  CheckStack           0
  CheckFunctionTypeArgs 1, r0
  PushConstant         CP#0
  DirectCall           1, CP#1
  Drop1
  PushNull
  Push                 r0
  InstantiateType      CP#3
  DirectCall           1, CP#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
  PushConstant         CP#0
  PushStatic           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 {
}

}

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

  typedef GenericFunctionType = <X extends dart.core::Object = dynamic>(X) → X;
[@vm.bytecode=
MembersBytecodeMetadata {

Members {
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           1, CP#4
  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           1, CP#0
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::A::get:_name', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}

}

}
]  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};
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {
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           1, CP#2
  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 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::•()
      ;
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {
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           2, CP#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 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))
      ;
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {
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           1, CP#5
  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 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::•()
      ;
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {

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           1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}

}

}
]  class E<T extends dart.core::Object = dynamic> extends dart.core::Object {
    const constructor •() → #lib::E<#lib::E::T>
      : super dart.core::Object::•()
      ;
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {

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           1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::E:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}

}

}
]  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, #lib::_name: #C2}
  #C4 = 1
  #C5 = "A.elem2"
  #C6 = #lib::A {index: #C4, #lib::_name: #C5}
  #C7 = 2
  #C8 = "A.elem3"
  #C9 = #lib::A {index: #C7, #lib::_name: #C8}
  #C10 = 3
  #C11 = "A.elem4"
  #C12 = #lib::A {index: #C10, #lib::_name: #C11}
  #C13 = ListConstant<#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 = ListConstant<dart.core::Object>(#C22, #C23, #C24)
  #C26 = "E2"
  #C27 = "E4"
  #C28 = ListConstant<dynamic>(#C26, #C6, #C27, #C12)
  #C29 = dart.core::_ImmutableMap<dart.core::String, #lib::A> {dart.core::_kvPairs: #C28}
  #C30 = 9
  #C31 = 30
  #C32 = #lib::C {j: #C30, i: #C31}
  #C33 = "bar"
  #C34 = #lib::B {i: #C16}
  #C35 = ListConstant<dynamic>(#C23, #C22, #C33, #C34)
  #C36 = dart.core::_ImmutableMap<dart.core::String, dart.core::Object> {dart.core::_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> {}
}
