#
# Autogenerated by generate-bytecode-expectations.
#

---
pool type: mixed
execute: yes
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: 7
parameter count: 1
bytecode array length: 53
bytecodes: [
                B(Mov), R(closure), R(0),
  /*   99 E> */ B(StackCheck),
  /*  104 S> */ B(Mov), R(this), R(3),
                B(Ldar), R(closure),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(0),
                B(Star), R(6),
  /*  111 E> */ B(CallRuntime), U16(Runtime::kThrowReferenceError), R(6), U8(1),
                B(Star), R(6),
                B(LdaConstant), U8(1),
  /*  111 E> */ B(LdrKeyedProperty), R(6), U8(3), R(4),
                B(LdaConstant), U8(2),
                B(Star), R(5),
                B(CallRuntime), U16(Runtime::kLoadFromSuper), R(3), U8(3),
                B(Mov), R(3), R(2),
                B(Star), R(1),
  /*  117 E> */ B(Call), R(1), R(2), U8(1), U8(1),
                B(Star), R(3),
                B(AddSmi), U8(1), R(3),
  /*  131 S> */ B(Return),
]
constant pool: [
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::SYMBOL_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
]
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: 6
parameter count: 1
bytecode array length: 75
bytecodes: [
                B(Mov), R(closure), R(0),
  /*  125 E> */ B(StackCheck),
  /*  130 S> */ B(Mov), R(this), R(1),
                B(Ldar), R(closure),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(0),
                B(Star), R(5),
  /*  130 E> */ B(CallRuntime), U16(Runtime::kThrowReferenceError), R(5), U8(1),
                B(Star), R(5),
                B(LdaConstant), U8(1),
  /*  130 E> */ B(LdrKeyedProperty), R(5), U8(1), R(2),
                B(LdaConstant), U8(2),
                B(Star), R(3),
                B(LdaSmi), U8(2),
                B(Star), R(4),
  /*  138 E> */ B(CallRuntime), U16(Runtime::kStoreToSuper_Strict), R(1), U8(4),
  /*  143 S> */ B(Mov), R(this), R(1),
                B(Ldar), R(0),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(0),
                B(Star), R(4),
  /*  150 E> */ B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1),
                B(Star), R(4),
                B(LdaConstant), U8(1),
  /*  150 E> */ B(LdrKeyedProperty), R(4), U8(3), R(2),
                B(LdaConstant), U8(2),
                B(Star), R(3),
                B(CallRuntime), U16(Runtime::kLoadFromSuper), R(1), U8(3),
  /*  159 S> */ B(Return),
]
constant pool: [
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::SYMBOL_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
]
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: 105
bytecodes: [
                B(Mov), R(closure), R(1),
                B(Mov), R(new_target), R(0),
  /*  113 E> */ B(StackCheck),
  /*  118 S> */ B(Ldar), R(closure),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(0),
                B(Star), R(3),
                B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1),
                B(Star), R(2),
                B(CallRuntime), U16(Runtime::k_GetSuperConstructor), R(2), U8(1),
                B(Star), R(2),
                B(LdaSmi), U8(1),
                B(Star), R(3),
                B(Ldar), R(0),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(1),
                B(Star), R(4),
  /*  118 E> */ B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1),
  /*  118 E> */ B(New), R(2), R(3), U8(1),
                B(Star), R(2),
                B(Ldar), R(this),
                B(JumpIfNotHole), U8(4),
                B(Jump), U8(11),
                B(LdaConstant), U8(2),
                B(Star), R(3),
  /*  118 E> */ B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1),
                B(Mov), R(2), R(this),
  /*  128 S> */ B(Ldar), R(this),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(2),
                B(Star), R(2),
                B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1),
                B(Star), R(2),
                B(LdaSmi), U8(2),
  /*  136 E> */ B(StaNamedPropertyStrict), R(2), U8(3), U8(4),
                B(Ldar), R(this),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(2),
                B(Star), R(2),
                B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1),
  /*  141 S> */ B(Return),
]
constant pool: [
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
]
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: 101
bytecodes: [
                B(Mov), R(closure), R(1),
                B(Mov), R(new_target), R(0),
  /*  112 E> */ B(StackCheck),
  /*  117 S> */ B(Ldar), R(closure),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(0),
                B(Star), R(3),
                B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1),
                B(Star), R(2),
                B(CallRuntime), U16(Runtime::k_GetSuperConstructor), R(2), U8(1),
                B(Star), R(2),
                B(Ldar), R(0),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(1),
                B(Star), R(3),
  /*  117 E> */ B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1),
  /*  117 E> */ B(New), R(2), R(0), U8(0),
                B(Star), R(2),
                B(Ldar), R(this),
                B(JumpIfNotHole), U8(4),
                B(Jump), U8(11),
                B(LdaConstant), U8(2),
                B(Star), R(3),
  /*  117 E> */ B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1),
                B(Mov), R(2), R(this),
  /*  126 S> */ B(Ldar), R(this),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(2),
                B(Star), R(2),
                B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1),
                B(Star), R(2),
                B(LdaSmi), U8(2),
  /*  134 E> */ B(StaNamedPropertyStrict), R(2), U8(3), U8(4),
                B(Ldar), R(this),
                B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(2),
                B(Star), R(2),
                B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1),
  /*  139 S> */ B(Return),
]
constant pool: [
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
]
handlers: [
]

