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