#
# Autogenerated by generate-bytecode-expectations.
#

---
pool type: mixed
execute: yes
wrap: yes

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

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

---
snippet: "
  var n0 = 'a';
  var n1 = 'b';
  class N {
    [n0]() { return n0; }
    static [n1]() { return n1; }
  }
"
frame size: 10
parameter count: 1
bytecode array length: 126
bytecodes: [
                B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), U8(1),
                B(PushContext), R(2),
                B(LdaTheHole),
                B(Star), R(1),
  /*   30 E> */ B(StackCheck),
  /*   43 S> */ B(LdaConstant), U8(0),
  /*   43 E> */ B(StaContextSlot), R(context), U8(4),
  /*   57 S> */ B(LdaConstant), U8(1),
  /*   57 E> */ B(StaContextSlot), R(context), U8(5),
                B(LdaTheHole),
                B(Star), R(0),
                B(LdaTheHole),
                B(Star), R(3),
                B(CreateClosure), U8(2), U8(2),
                B(Star), R(4),
                B(LdaSmi), U8(62),
                B(Star), R(5),
                B(Wide), B(LdaSmi), U16(128),
                B(Star), R(6),
                B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4),
                B(Star), R(3),
                B(LdrNamedProperty), R(3), U8(3), U8(1), R(4),
  /*   75 E> */ B(LdaContextSlot), R(context), U8(4),
                B(ToName),
                B(Star), R(6),
                B(CreateClosure), U8(4), U8(2),
                B(Star), R(7),
                B(LdaSmi), U8(2),
                B(Star), R(8),
                B(LdaSmi), U8(1),
                B(Star), R(9),
                B(Mov), R(4), R(5),
                B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(5), U8(5),
  /*  106 E> */ B(LdaContextSlot), R(context), U8(5),
                B(ToName),
                B(Star), R(6),
                B(LdaConstant), U8(3),
                B(TestEqualStrict), R(6),
                B(Mov), R(3), R(5),
                B(JumpIfToBooleanFalse), U8(7),
                B(CallRuntime), U16(Runtime::kThrowStaticPrototypeError), R(0), U8(0),
                B(CreateClosure), U8(5), U8(2),
                B(Star), R(7),
                B(LdaSmi), U8(1),
                B(Star), R(9),
                B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(5), U8(5),
                B(CallRuntime), U16(Runtime::kToFastProperties), R(3), U8(1),
                B(Star), R(0),
                B(Star), R(1),
                B(LdaUndefined),
  /*  129 S> */ B(Return),
]
constant pool: [
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::SHARED_FUNCTION_INFO_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::SHARED_FUNCTION_INFO_TYPE,
  InstanceType::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: 74
bytecodes: [
                B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), U8(1),
                B(PushContext), R(2),
                B(LdaTheHole),
                B(Star), R(1),
  /*   30 E> */ B(StackCheck),
  /*   46 S> */ B(LdaZero),
  /*   46 E> */ B(StaContextSlot), R(context), U8(4),
                B(LdaTheHole),
                B(Star), R(0),
                B(LdaTheHole),
                B(Star), R(3),
                B(CreateClosure), U8(0), U8(2),
                B(Star), R(4),
                B(LdaSmi), U8(49),
                B(Star), R(5),
                B(LdaSmi), U8(86),
                B(Star), R(6),
                B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4),
                B(Star), R(3),
                B(LdrNamedProperty), R(3), U8(1), U8(1), R(4),
                B(CallRuntime), U16(Runtime::kToFastProperties), R(3), U8(1),
                B(Star), R(0),
                B(Star), R(1),
  /*   87 S> */ B(JumpIfNotHole), U8(11),
                B(LdaConstant), U8(2),
                B(Star), R(4),
                B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1),
                B(Star), R(3),
  /*   94 E> */ B(New), R(3), R(0), U8(0), U8(3),
  /*  103 S> */ B(Return),
]
constant pool: [
  InstanceType::SHARED_FUNCTION_INFO_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
]
handlers: [
]

