library #lib;
import self as self;
import "dart:core" as core;

class A extends core::Object {
  field core::int foo1;
  field core::int foo2 = null;
  field core::int foo3 = 42;
  field core::int foo4;
  field core::int foo5 = 43;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack
  Push                 FP[-6]
  PushConstant         CP#0
  StoreFieldTOS        CP#1
  Push                 FP[-6]
  Push                 FP[-5]
  StoreFieldTOS        CP#3
  Push                 FP[-6]
  PushConstant         CP#5
  StoreFieldTOS        CP#6
  Push                 FP[-6]
  PushConstant         CP#9
  IndirectStaticCall   1, CP#8
  Drop1
  PushConstant         CP#10
  ReturnTOS
}
ConstantPool {
  [0] = Int 42
  [1] = InstanceField #lib::A::foo3
  [2] = Reserved
  [3] = InstanceField #lib::A::foo4
  [4] = Reserved
  [5] = Int 44
  [6] = InstanceField #lib::A::foo5
  [7] = Reserved
  [8] = ArgDesc num-args 1, num-type-args 0, names []
  [9] = StaticICData target 'dart.core::Object::', arg-desc CP#8
  [10] = Null
}
]  constructor •(core::int foo4) → void
    : self::A::foo1 = null, self::A::foo4 = foo4, self::A::foo5 = 44, super core::Object::•()
    ;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack
  Push                 FP[-7]
  PushConstant         CP#0
  StoreFieldTOS        CP#1
  Push                 FP[-7]
  Push                 FP[-6]
  StoreFieldTOS        CP#3
  Push                 FP[-7]
  Push                 FP[-5]
  PushConstant         CP#5
  InstanceCall1        2, CP#7
  StoreFieldTOS        CP#8
  Push                 FP[-7]
  PushConstant         CP#11
  IndirectStaticCall   1, CP#10
  Drop1
  PushConstant         CP#12
  ReturnTOS
}
ConstantPool {
  [0] = Int 42
  [1] = InstanceField #lib::A::foo3
  [2] = Reserved
  [3] = InstanceField #lib::A::foo1
  [4] = Reserved
  [5] = Int 1
  [6] = ArgDesc num-args 2, num-type-args 0, names []
  [7] = ICData target-name '+', arg-desc CP#6
  [8] = InstanceField #lib::A::foo5
  [9] = Reserved
  [10] = ArgDesc num-args 1, num-type-args 0, names []
  [11] = StaticICData target 'dart.core::Object::', arg-desc CP#10
  [12] = Null
}
]  constructor constr2(core::int x, core::int y) → void
    : self::A::foo4 = null, self::A::foo1 = x, self::A::foo5 = y.{core::num::+}(1), super core::Object::•()
    ;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack
  Push                 FP[-5]
  PushConstant         CP#0
  PushConstant         CP#2
  IndirectStaticCall   2, CP#1
  Drop1
  PushConstant         CP#3
  ReturnTOS
}
ConstantPool {
  [0] = Int 45
  [1] = ArgDesc num-args 2, num-type-args 0, names []
  [2] = StaticICData target '#lib::A::', arg-desc CP#1
  [3] = Null
}
]  constructor redirecting1() → void
    : this self::A::•(45)
    ;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack
  Push                 FP[-8]
  Push                 FP[-7]
  Push                 FP[-6]
  Push                 FP[-5]
  InstanceCall1        2, CP#1
  PushConstant         CP#3
  IndirectStaticCall   3, CP#2
  Drop1
  PushConstant         CP#4
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 2, num-type-args 0, names []
  [1] = ICData target-name '*', arg-desc CP#0
  [2] = ArgDesc num-args 3, num-type-args 0, names []
  [3] = StaticICData target '#lib::A::constr2', arg-desc CP#2
  [4] = Null
}
]  constructor redirecting2(core::int a, core::int b, core::int c) → void
    : this self::A::constr2(a, b.{core::num::*}(c))
    ;
}
class B extends self::A {
  field core::int foo6 = 46;
  static field core::int foo7 = 47;
  static const field core::int foo8 = 48;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack
  Push                 FP[-5]
  PushConstant         CP#0
  StoreFieldTOS        CP#1
  Push                 FP[-5]
  PushConstant         CP#3
  PushConstant         CP#5
  IndirectStaticCall   2, CP#4
  Drop1
  PushConstant         CP#6
  ReturnTOS
}
ConstantPool {
  [0] = Int 46
  [1] = InstanceField #lib::B::foo6
  [2] = Reserved
  [3] = Int 49
  [4] = ArgDesc num-args 2, num-type-args 0, names []
  [5] = StaticICData target '#lib::A::', arg-desc CP#4
  [6] = Null
}
]  constructor •() → void
    : super self::A::•(49)
    ;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack
  Push                 FP[-7]
  PushConstant         CP#0
  StoreFieldTOS        CP#1
  Push                 FP[-7]
  Push                 FP[-6]
  Push                 FP[-5]
  PushConstant         CP#3
  PushConstant         CP#5
  IndirectStaticCall   4, CP#4
  Drop1
  PushConstant         CP#6
  ReturnTOS
}
ConstantPool {
  [0] = Int 50
  [1] = InstanceField #lib::B::foo6
  [2] = Reserved
  [3] = Int 51
  [4] = ArgDesc num-args 4, num-type-args 0, names []
  [5] = StaticICData target '#lib::A::redirecting2', arg-desc CP#4
  [6] = Null
}
]  constructor c2(core::int i, core::int j) → void
    : self::B::foo6 = 50, super self::A::redirecting2(i, j, 51)
    ;
}
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = Null
}
]static method main() → dynamic {}
