#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: yes

---
snippet: "
  class Person {
    constructor(name) { this.name = name; }
    speak() { console.log(this.name + ' is speaking.'); }
  }
"
frame size: 7
parameter count: 1
bytecode array length: 38
bytecodes: [
  /*   30 E> */ B(StackCheck),
                B(LdaTheHole),
                B(Star), R(5),
                B(CreateClosure), U8(1), U8(0), U8(2),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Star), R(3),
                B(CreateClosure), U8(2), U8(1), U8(2),
                B(Star), R(6),
                B(Mov), R(2), R(4),
                B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4),
                B(Star), R(3),
                B(Mov), R(4), R(0),
                B(Mov), R(0), R(1),
                B(LdaUndefined),
  /*  149 S> */ B(Return),
]
constant pool: [
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

---
snippet: "
  class person {
    constructor(name) { this.name = name; }
    speak() { console.log(this.name + ' is speaking.'); }
  }
"
frame size: 7
parameter count: 1
bytecode array length: 38
bytecodes: [
  /*   30 E> */ B(StackCheck),
                B(LdaTheHole),
                B(Star), R(5),
                B(CreateClosure), U8(1), U8(0), U8(2),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Star), R(3),
                B(CreateClosure), U8(2), U8(1), U8(2),
                B(Star), R(6),
                B(Mov), R(2), R(4),
                B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4),
                B(Star), R(3),
                B(Mov), R(4), R(0),
                B(Mov), R(0), R(1),
                B(LdaUndefined),
  /*  149 S> */ B(Return),
]
constant pool: [
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

---
snippet: "
  var n0 = 'a';
  var n1 = 'b';
  class N {
    [n0]() { return n0; }
    static [n1]() { return n1; }
  }
"
frame size: 11
parameter count: 1
bytecode array length: 75
bytecodes: [
                B(CreateFunctionContext), U8(2),
                B(PushContext), R(2),
  /*   30 E> */ B(StackCheck),
  /*   43 S> */ B(LdaConstant), U8(0),
  /*   43 E> */ B(StaCurrentContextSlot), U8(4),
  /*   57 S> */ B(LdaConstant), U8(1),
  /*   57 E> */ B(StaCurrentContextSlot), U8(5),
                B(LdaTheHole),
                B(Star), R(6),
                B(CreateClosure), U8(3), U8(0), U8(2),
                B(Star), R(3),
                B(LdaConstant), U8(2),
                B(Star), R(4),
                B(LdaImmutableCurrentContextSlot), U8(4),
  /*   75 E> */ B(ToName), R(7),
                B(CreateClosure), U8(4), U8(1), U8(2),
                B(Star), R(8),
                B(LdaImmutableCurrentContextSlot), U8(5),
  /*  106 E> */ B(ToName), R(9),
                B(LdaConstant), U8(5),
                B(TestEqualStrictNoFeedback), R(9),
                B(Mov), R(3), R(5),
                B(JumpIfFalse), U8(7),
                B(CallRuntime), U16(Runtime::kThrowStaticPrototypeError), R(0), U8(0),
                B(CreateClosure), U8(6), U8(2), U8(2),
                B(Star), R(10),
                B(CallRuntime), U16(Runtime::kDefineClass), R(4), U8(7),
                B(Star), R(4),
                B(Mov), R(3), R(0),
                B(Mov), R(0), R(1),
                B(LdaUndefined),
  /*  129 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["a"],
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["b"],
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["prototype"],
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

---
snippet: "
  var count = 0;
  class C { constructor() { count++; }}
  return new C();
"
frame size: 7
parameter count: 1
bytecode array length: 45
bytecodes: [
                B(CreateFunctionContext), U8(1),
                B(PushContext), R(2),
  /*   30 E> */ B(StackCheck),
  /*   46 S> */ B(LdaZero),
  /*   46 E> */ B(StaCurrentContextSlot), U8(4),
                B(LdaTheHole),
                B(Star), R(6),
                B(CreateClosure), U8(1), U8(0), U8(2),
                B(Star), R(3),
                B(LdaConstant), U8(0),
                B(Star), R(4),
                B(Mov), R(3), R(5),
                B(CallRuntime), U16(Runtime::kDefineClass), R(4), U8(3),
                B(Star), R(4),
                B(Mov), R(5), R(0),
                B(Mov), R(0), R(1),
  /*   87 S> */ B(Ldar), R(1),
  /*   94 E> */ B(Construct), R(3), R(0), U8(0), U8(1),
  /*  102 S> */ B(Return),
]
constant pool: [
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

---
snippet: "
  (class {})
  class E { static name () {}}
"
frame size: 7
parameter count: 1
bytecode array length: 61
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   34 S> */ B(LdaTheHole),
                B(Star), R(5),
                B(CreateClosure), U8(1), U8(0), U8(2),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Star), R(3),
                B(Mov), R(2), R(4),
                B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(3),
                B(Star), R(3),
                B(LdaTheHole),
                B(Star), R(5),
                B(CreateClosure), U8(3), U8(1), U8(2),
                B(Star), R(2),
                B(LdaConstant), U8(2),
                B(Star), R(3),
                B(CreateClosure), U8(4), U8(2), U8(2),
                B(Star), R(6),
                B(Mov), R(2), R(4),
                B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4),
                B(Star), R(3),
                B(Mov), R(4), R(0),
                B(Mov), R(0), R(1),
                B(LdaUndefined),
  /*   74 S> */ B(Return),
]
constant pool: [
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

