#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: no
test function name: test

---
snippet: "
  var test;
  (function() {
    class A {
      method() { return 2; }
    }
    class B extends A {
      method() { return super.method() + 1; }
    }
    test = new B().method;
    test();
  })();
"
frame size: 6
parameter count: 1
bytecode array length: 34
bytecodes: [
                B(Mov), R(closure), R(0),
  /*   99 E> */ B(StackCheck),
  /*  104 S> */ B(LdaConstant), U8(0),
  /*  111 E> */ B(LdaKeyedProperty), R(closure), U8(1),
                B(Star), R(4),
                B(LdaConstant), U8(1),
                B(Star), R(5),
                B(Mov), R(this), R(3),
  /*  117 E> */ B(CallRuntime), U16(Runtime::kLoadFromSuper), R(3), U8(3),
                B(Star), R(1),
  /*  117 E> */ B(CallAnyReceiver), R(1), R(this), U8(1), U8(3),
  /*  126 E> */ B(AddSmi), I8(1), U8(0),
  /*  130 S> */ B(Return),
]
constant pool: [
  SYMBOL_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["method"],
]
handlers: [
]

---
snippet: "
  var test;
  (function() {
    class A {
      get x() { return 1; }
      set x(val) { return; }
    }
    class B extends A {
      method() { super.x = 2; return super.x; }
    }
    test = new B().method;
    test();
  })();
"
frame size: 5
parameter count: 1
bytecode array length: 47
bytecodes: [
                B(Mov), R(closure), R(0),
  /*  125 E> */ B(StackCheck),
  /*  130 S> */ B(LdaConstant), U8(0),
  /*  130 E> */ B(LdaKeyedProperty), R(closure), U8(0),
                B(Star), R(2),
                B(LdaConstant), U8(1),
                B(Star), R(3),
                B(LdaSmi), I8(2),
                B(Star), R(4),
                B(Mov), R(this), R(1),
  /*  138 E> */ B(CallRuntime), U16(Runtime::kStoreToSuper_Strict), R(1), U8(4),
  /*  143 S> */ B(LdaConstant), U8(0),
  /*  150 E> */ B(LdaKeyedProperty), R(closure), U8(2),
                B(Star), R(2),
                B(LdaConstant), U8(1),
                B(Star), R(3),
                B(Mov), R(this), R(1),
  /*  156 E> */ B(CallRuntime), U16(Runtime::kLoadFromSuper), R(1), U8(3),
  /*  158 S> */ B(Return),
]
constant pool: [
  SYMBOL_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["x"],
]
handlers: [
]

---
snippet: "
  var test;
  (function() {
    class A {
      constructor(x) { this.x_ = x; }
    }
    class B extends A {
      constructor() { super(1); this.y_ = 2; }
    }
    test = new B().constructor;
  })();
"
frame size: 5
parameter count: 1
bytecode array length: 40
bytecodes: [
                B(Mov), R(closure), R(1),
  /*  113 E> */ B(StackCheck),
  /*  118 S> */ B(Ldar), R(1),
                B(GetSuperConstructor), R(3),
                B(LdaSmi), I8(1),
                B(Star), R(4),
                B(Ldar), R(0),
  /*  118 E> */ B(Construct), R(3), R(4), U8(1), U8(0),
                B(Star), R(2),
                B(Ldar), R(this),
  /*  118 E> */ B(ThrowSuperAlreadyCalledIfNotHole),
                B(Mov), R(2), R(this),
  /*  128 S> */ B(Ldar), R(this),
                B(ThrowSuperNotCalledIfHole),
                B(LdaSmi), I8(2),
  /*  136 E> */ B(StaNamedProperty), R(2), U8(0), U8(2),
                B(Ldar), R(this),
                B(ThrowSuperNotCalledIfHole),
  /*  141 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["y_"],
]
handlers: [
]

---
snippet: "
  var test;
  (function() {
    class A {
      constructor() { this.x_ = 1; }
    }
    class B extends A {
      constructor() { super(); this.y_ = 2; }
    }
    test = new B().constructor;
  })();
"
frame size: 4
parameter count: 1
bytecode array length: 36
bytecodes: [
                B(Mov), R(closure), R(1),
  /*  112 E> */ B(StackCheck),
  /*  117 S> */ B(Ldar), R(1),
                B(GetSuperConstructor), R(3),
                B(Ldar), R(0),
  /*  117 E> */ B(Construct), R(3), R(0), U8(0), U8(0),
                B(Star), R(2),
                B(Ldar), R(this),
  /*  117 E> */ B(ThrowSuperAlreadyCalledIfNotHole),
                B(Mov), R(2), R(this),
  /*  126 S> */ B(Ldar), R(this),
                B(ThrowSuperNotCalledIfHole),
                B(LdaSmi), I8(2),
  /*  134 E> */ B(StaNamedProperty), R(2), U8(0), U8(2),
                B(Ldar), R(this),
                B(ThrowSuperNotCalledIfHole),
  /*  139 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["y_"],
]
handlers: [
]

