#
# 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), 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: 6
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(5),
                B(Ldar), R(this),
                B(ThrowSuperAlreadyCalledIfNotHole),
                B(Mov), R(5), R(this),
  /*  128 S> */ B(Ldar), R(this),
                B(ThrowSuperNotCalledIfHole),
                B(LdaSmi), I8(2),
  /*  136 E> */ B(StaNamedProperty), R(this), 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: 5
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(4),
                B(Ldar), R(this),
                B(ThrowSuperAlreadyCalledIfNotHole),
                B(Mov), R(4), R(this),
  /*  126 S> */ B(Ldar), R(this),
                B(ThrowSuperNotCalledIfHole),
                B(LdaSmi), I8(2),
  /*  134 E> */ B(StaNamedProperty), R(this), U8(0), U8(2),
                B(Ldar), R(this),
                B(ThrowSuperNotCalledIfHole),
  /*  139 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["y_"],
]
handlers: [
]

