#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: no
test function name: test

---
snippet: "
  var test;
  (function() {
    class A {
      constructor(...args) { this.baseArgs = args; }
    }
    class B extends A {}
    test = new B(1, 2, 3).constructor;
  })();
"
frame size: 5
parameter count: 1
bytecode array length: 19
bytecodes: [
                B(CreateRestParameter),
                B(Star), R(2),
                B(Mov), R(closure), R(1),
  /*   93 E> */ B(StackCheck),
  /*   93 S> */ B(Ldar), R(1),
                B(GetSuperConstructor), R(4),
                B(Ldar), R(0),
  /*   93 E> */ B(ConstructWithSpread), R(4), R(2), U8(1), U8(0),
  /*   93 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var test;
  (function() {
    class A {
      constructor(...args) { this.baseArgs = args; }
    }
    class B extends A {
      constructor(...args) { super(1, ...args); }
    }
    test = new B(1, 2, 3).constructor;
  })();
"
frame size: 8
parameter count: 1
bytecode array length: 40
bytecodes: [
                B(CreateRestParameter),
                B(Star), R(2),
                B(Mov), R(closure), R(1),
  /*  128 E> */ B(StackCheck),
                B(Mov), R(2), R(3),
  /*  140 S> */ B(Ldar), R(closure),
                B(GetSuperConstructor), R(5),
                B(LdaSmi), I8(1),
                B(Star), R(6),
                B(Ldar), R(0),
                B(Mov), R(2), R(7),
  /*  140 E> */ B(ConstructWithSpread), R(5), R(6), U8(2), U8(0),
                B(Star), R(4),
                B(Ldar), R(this),
  /*  140 E> */ B(ThrowSuperAlreadyCalledIfNotHole),
                B(Mov), R(4), R(this),
                B(Ldar), R(this),
                B(ThrowSuperNotCalledIfHole),
  /*  159 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var test;
  (function() {
    class A {
      constructor(...args) { this.baseArgs = args; }
    }
    class B extends A {
      constructor(...args) { super(1, ...args, 1); }
    }
    test = new B(1, 2, 3).constructor;
  })();
"
frame size: 8
parameter count: 1
bytecode array length: 60
bytecodes: [
                B(CreateRestParameter),
                B(Star), R(2),
                B(Mov), R(closure), R(1),
  /*  128 E> */ B(StackCheck),
                B(Mov), R(2), R(3),
  /*  140 S> */ B(CallRuntime), U16(Runtime::k_GetSuperConstructor), R(closure), U8(1),
                B(Star), R(4),
                B(CreateArrayLiteral), U8(0), U8(0), U8(37),
                B(Star), R(5),
  /*  152 E> */ B(CallJSRuntime), U8(%spread_iterable), R(2), U8(1),
                B(Star), R(6),
                B(CreateArrayLiteral), U8(1), U8(1), U8(37),
                B(Star), R(7),
                B(CallJSRuntime), U8(%spread_arguments), R(5), U8(3),
                B(Star), R(5),
                B(Mov), R(0), R(6),
  /*  140 E> */ B(CallJSRuntime), U8(%reflect_construct), R(4), U8(3),
                B(Star), R(4),
                B(Ldar), R(this),
  /*  140 E> */ B(ThrowSuperAlreadyCalledIfNotHole),
                B(Mov), R(4), R(this),
                B(Ldar), R(this),
                B(ThrowSuperNotCalledIfHole),
  /*  162 S> */ B(Return),
]
constant pool: [
  TUPLE2_TYPE,
  TUPLE2_TYPE,
]
handlers: [
]

