#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: yes

---
snippet: "
  {
    class A {
      #a;
      constructor() {
        this.#a = 1;
      }
    }
  
    class B {
      #a = 1;
    }
    new A;
    new B;
  }
"
frame size: 7
parameter count: 1
bytecode array length: 130
bytecodes: [
  /*   30 E> */ B(CreateBlockContext), U8(0),
                B(PushContext), R(2),
                B(LdaConstant), U8(2),
                B(Star), R(4),
                B(LdaConstant), U8(2),
                B(Star), R(4),
                B(CallRuntime), U16(Runtime::kCreatePrivateNameSymbol), R(4), U8(1),
                B(StaCurrentContextSlot), U8(2),
                B(LdaTheHole),
                B(Star), R(6),
                B(CreateClosure), U8(3), U8(0), U8(2),
                B(Star), R(3),
                B(LdaConstant), U8(1),
                B(Star), R(4),
                B(Mov), R(3), R(5),
                B(CallRuntime), U16(Runtime::kDefineClass), R(4), U8(3),
                B(Star), R(4),
                B(CreateClosure), U8(4), U8(1), U8(2),
                B(Star), R(5),
                B(StaNamedProperty), R(3), U8(5), U8(0),
                B(PopContext), R(2),
                B(Mov), R(3), R(0),
  /*   38 E> */ B(CreateBlockContext), U8(6),
                B(PushContext), R(2),
                B(LdaConstant), U8(2),
                B(Star), R(4),
                B(LdaConstant), U8(2),
                B(Star), R(4),
                B(CallRuntime), U16(Runtime::kCreatePrivateNameSymbol), R(4), U8(1),
                B(StaCurrentContextSlot), U8(2),
                B(LdaTheHole),
                B(Star), R(6),
                B(CreateClosure), U8(8), U8(2), U8(2),
                B(Star), R(3),
                B(LdaConstant), U8(7),
                B(Star), R(4),
                B(Mov), R(3), R(5),
                B(CallRuntime), U16(Runtime::kDefineClass), R(4), U8(3),
                B(Star), R(4),
                B(CreateClosure), U8(9), U8(3), U8(2),
                B(Star), R(5),
                B(StaNamedProperty), R(3), U8(5), U8(2),
                B(PopContext), R(2),
                B(Mov), R(3), R(1),
  /*  136 S> */ B(Ldar), R(0),
  /*  136 E> */ B(Construct), R(0), R(0), U8(0), U8(4),
  /*  145 S> */ B(Ldar), R(1),
  /*  145 E> */ B(Construct), R(1), R(0), U8(0), U8(6),
                B(LdaUndefined),
  /*  154 S> */ B(Return),
]
constant pool: [
  SCOPE_INFO_TYPE,
  FIXED_ARRAY_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#a"],
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SYMBOL_TYPE,
  SCOPE_INFO_TYPE,
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

---
snippet: "
  {
    class A extends class {} {
      #a;
      constructor() {
        super();
        this.#a = 1;
      }
    }
  
    class B extends class {} {
      #a = 1;
      #b = this.#a;
      foo() { return this.#a; }
      bar(v) { this.#b = v; }
      constructor() {
        super();
        this.foo();
        this.bar(3);
      }
    }
  
    class C extends B {
      #a = 2;
      constructor() {
        (() => super())();
      }
    }
  
    new A;
    new B;
    new C;
  };
"
frame size: 12
parameter count: 1
bytecode array length: 267
bytecodes: [
  /*   30 E> */ B(CreateBlockContext), U8(0),
                B(PushContext), R(3),
                B(LdaConstant), U8(2),
                B(Star), R(5),
                B(LdaConstant), U8(2),
                B(Star), R(5),
                B(CallRuntime), U16(Runtime::kCreatePrivateNameSymbol), R(5), U8(1),
                B(StaCurrentContextSlot), U8(2),
                B(LdaTheHole),
                B(Star), R(11),
                B(CreateClosure), U8(4), U8(0), U8(2),
                B(Star), R(8),
                B(LdaConstant), U8(3),
                B(Star), R(9),
                B(Mov), R(8), R(10),
                B(CallRuntime), U16(Runtime::kDefineClass), R(9), U8(3),
                B(Star), R(9),
                B(CreateClosure), U8(5), U8(1), U8(2),
                B(Star), R(4),
                B(LdaConstant), U8(1),
                B(Star), R(5),
                B(Mov), R(4), R(6),
                B(Mov), R(10), R(7),
                B(CallRuntime), U16(Runtime::kDefineClass), R(5), U8(3),
                B(Star), R(5),
                B(CreateClosure), U8(6), U8(2), U8(2),
                B(Star), R(6),
                B(StaNamedProperty), R(4), U8(7), U8(0),
                B(PopContext), R(3),
                B(Mov), R(4), R(0),
  /*   38 E> */ B(CreateBlockContext), U8(8),
                B(PushContext), R(3),
                B(LdaConstant), U8(2),
                B(Star), R(5),
                B(LdaConstant), U8(2),
                B(Star), R(5),
                B(CallRuntime), U16(Runtime::kCreatePrivateNameSymbol), R(5), U8(1),
                B(StaCurrentContextSlot), U8(2),
                B(LdaConstant), U8(10),
                B(Star), R(5),
                B(LdaConstant), U8(10),
                B(Star), R(5),
                B(CallRuntime), U16(Runtime::kCreatePrivateNameSymbol), R(5), U8(1),
                B(StaCurrentContextSlot), U8(3),
                B(LdaTheHole),
                B(Star), R(11),
                B(CreateClosure), U8(12), U8(3), U8(2),
                B(Star), R(8),
                B(LdaConstant), U8(11),
                B(Star), R(9),
                B(Mov), R(8), R(10),
                B(CallRuntime), U16(Runtime::kDefineClass), R(9), U8(3),
                B(Star), R(9),
                B(CreateClosure), U8(13), U8(4), U8(2),
                B(Star), R(4),
                B(LdaConstant), U8(9),
                B(Star), R(5),
                B(CreateClosure), U8(14), U8(5), U8(2),
                B(Star), R(8),
                B(CreateClosure), U8(15), U8(6), U8(2),
                B(Star), R(9),
                B(Mov), R(4), R(6),
                B(Mov), R(10), R(7),
                B(CallRuntime), U16(Runtime::kDefineClass), R(5), U8(5),
                B(Star), R(5),
                B(CreateClosure), U8(16), U8(7), U8(2),
                B(Star), R(6),
                B(StaNamedProperty), R(4), U8(7), U8(2),
                B(PopContext), R(3),
                B(Mov), R(4), R(1),
  /*  140 E> */ B(CreateBlockContext), U8(17),
                B(PushContext), R(3),
                B(LdaConstant), U8(2),
                B(Star), R(5),
                B(LdaConstant), U8(2),
                B(Star), R(5),
                B(CallRuntime), U16(Runtime::kCreatePrivateNameSymbol), R(5), U8(1),
                B(StaCurrentContextSlot), U8(2),
  /*  356 E> */ B(CreateClosure), U8(19), U8(8), U8(2),
                B(Star), R(4),
                B(LdaConstant), U8(18),
                B(Star), R(5),
                B(Mov), R(4), R(6),
                B(Mov), R(1), R(7),
                B(CallRuntime), U16(Runtime::kDefineClass), R(5), U8(3),
                B(Star), R(5),
                B(CreateClosure), U8(20), U8(9), U8(2),
                B(Star), R(6),
                B(StaNamedProperty), R(4), U8(7), U8(4),
                B(PopContext), R(3),
                B(Mov), R(4), R(2),
  /*  430 S> */ B(Ldar), R(0),
  /*  430 E> */ B(Construct), R(0), R(0), U8(0), U8(6),
  /*  439 S> */ B(Ldar), R(1),
  /*  439 E> */ B(Construct), R(1), R(0), U8(0), U8(8),
  /*  448 S> */ B(Ldar), R(2),
  /*  448 E> */ B(Construct), R(2), R(0), U8(0), U8(10),
                B(LdaUndefined),
  /*  458 S> */ B(Return),
]
constant pool: [
  SCOPE_INFO_TYPE,
  FIXED_ARRAY_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#a"],
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SYMBOL_TYPE,
  SCOPE_INFO_TYPE,
  FIXED_ARRAY_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#b"],
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SCOPE_INFO_TYPE,
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

