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 (version: stable) {
  Entry                0
  CheckStack
  Push                 FP[-6]
  PushInt              42
  StoreFieldTOS        CP#0
  Push                 FP[-6]
  PushInt              43
  StoreFieldTOS        CP#2
  Push                 FP[-6]
  Push                 FP[-5]
  StoreFieldTOS        CP#4
  Push                 FP[-6]
  PushInt              44
  StoreFieldTOS        CP#2
  Push                 FP[-6]
  PushConstant         CP#7
  IndirectStaticCall   1, CP#6
  Drop1
  PushNull
  ReturnTOS
}
Nullable fields: [#lib::A::foo1, #lib::A::foo2]
ConstantPool {
  [0] = InstanceField #lib::A::foo3
  [1] = Reserved
  [2] = InstanceField #lib::A::foo5
  [3] = Reserved
  [4] = InstanceField #lib::A::foo4
  [5] = Reserved
  [6] = ArgDesc num-args 1, num-type-args 0, names []
  [7] = StaticICData target 'dart.core::Object::', arg-desc CP#6
}
]  constructor •(core::int foo4) → self::A
    : self::A::foo1 = null, self::A::foo4 = foo4, self::A::foo5 = 44, super core::Object::•()
    ;
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  Push                 FP[-7]
  PushInt              42
  StoreFieldTOS        CP#0
  Push                 FP[-7]
  PushInt              43
  StoreFieldTOS        CP#2
  Push                 FP[-7]
  Push                 FP[-6]
  StoreFieldTOS        CP#4
  Push                 FP[-7]
  Push                 FP[-5]
  PushInt              1
  AddInt
  StoreFieldTOS        CP#2
  Push                 FP[-7]
  PushConstant         CP#7
  IndirectStaticCall   1, CP#6
  Drop1
  PushNull
  ReturnTOS
}
Nullable fields: [#lib::A::foo2, #lib::A::foo4]
ConstantPool {
  [0] = InstanceField #lib::A::foo3
  [1] = Reserved
  [2] = InstanceField #lib::A::foo5
  [3] = Reserved
  [4] = InstanceField #lib::A::foo1
  [5] = Reserved
  [6] = ArgDesc num-args 1, num-type-args 0, names []
  [7] = StaticICData target 'dart.core::Object::', arg-desc CP#6
}
]  constructor constr2(core::int x, core::int y) → self::A
    : self::A::foo4 = null, self::A::foo1 = x, self::A::foo5 = y.{core::num::+}(1), super core::Object::•()
    ;
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  Push                 FP[-5]
  PushInt              45
  PushConstant         CP#1
  IndirectStaticCall   2, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 2, num-type-args 0, names []
  [1] = StaticICData target '#lib::A::', arg-desc CP#0
}
]  constructor redirecting1() → self::A
    : this self::A::•(45)
    ;
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  Push                 FP[-8]
  Push                 FP[-7]
  Push                 FP[-6]
  Push                 FP[-5]
  MulInt
  PushConstant         CP#1
  IndirectStaticCall   3, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 3, num-type-args 0, names []
  [1] = StaticICData target '#lib::A::constr2', arg-desc CP#0
}
]  constructor redirecting2(core::int a, core::int b, core::int c) → self::A
    : 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 (version: stable) {
  Entry                0
  CheckStack
  Push                 FP[-5]
  PushInt              46
  StoreFieldTOS        CP#0
  Push                 FP[-5]
  PushInt              49
  PushConstant         CP#3
  IndirectStaticCall   2, CP#2
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = InstanceField #lib::B::foo6
  [1] = Reserved
  [2] = ArgDesc num-args 2, num-type-args 0, names []
  [3] = StaticICData target '#lib::A::', arg-desc CP#2
}
]  constructor •() → self::B
    : super self::A::•(49)
    ;
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  Push                 FP[-7]
  PushInt              46
  StoreFieldTOS        CP#0
  Push                 FP[-7]
  PushInt              50
  StoreFieldTOS        CP#0
  Push                 FP[-7]
  Push                 FP[-6]
  Push                 FP[-5]
  PushInt              51
  PushConstant         CP#3
  IndirectStaticCall   4, CP#2
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = InstanceField #lib::B::foo6
  [1] = Reserved
  [2] = ArgDesc num-args 4, num-type-args 0, names []
  [3] = StaticICData target '#lib::A::redirecting2', arg-desc CP#2
}
]  constructor c2(core::int i, core::int j) → self::B
    : self::B::foo6 = 50, super self::A::redirecting2(i, j, 51)
    ;
}
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  PushNull
  ReturnTOS
}
ConstantPool {
}
]static method main() → dynamic {}
