#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: yes
private methods: yes

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

---
snippet: "
  {
    class D {
      #d() { return 1; }
      callD() { return this.#d(); }
    }
  
    class E extends D {
      #e() { return 2; }
      callE() { return this.callD() + this.#e(); }
    }
  
    const e = new E;
    e.callE();
  }
"
frame size: 11
parameter count: 1
bytecode array length: 138
bytecodes: [
  /*   30 E> */ B(StackCheck),
                B(CreateBlockContext), U8(0),
                B(PushContext), R(5),
                B(LdaTheHole),
                B(Star), R(9),
                B(CreateClosure), U8(2), U8(0), U8(2),
                B(Star), R(6),
                B(LdaConstant), U8(1),
                B(Star), R(7),
                B(CreateClosure), U8(3), U8(1), U8(2),
                B(StaCurrentContextSlot), U8(4),
                B(CreateClosure), U8(4), U8(2), U8(2),
                B(Star), R(10),
                B(Mov), R(6), R(8),
                B(CallRuntime), U16(Runtime::kDefineClass), R(7), U8(4),
                B(Star), R(7),
                B(Mov), R(8), R(4),
                B(LdaConstant), U8(5),
                B(Star), R(8),
                B(CallRuntime), U16(Runtime::kCreatePrivateNameSymbol), R(8), U8(1),
                B(StaCurrentContextSlot), U8(5),
                B(PopContext), R(5),
                B(Mov), R(4), R(0),
  /*   38 E> */ B(CreateBlockContext), U8(6),
                B(PushContext), R(5),
  /*  128 E> */ B(CreateClosure), U8(8), U8(3), U8(2),
                B(Star), R(6),
                B(LdaConstant), U8(7),
                B(Star), R(7),
                B(CreateClosure), U8(9), U8(4), U8(2),
                B(StaCurrentContextSlot), U8(4),
                B(CreateClosure), U8(10), U8(5), U8(2),
                B(Star), R(10),
                B(Mov), R(6), R(8),
                B(Mov), R(4), R(9),
                B(CallRuntime), U16(Runtime::kDefineClass), R(7), U8(4),
                B(Star), R(7),
                B(Mov), R(8), R(3),
                B(LdaConstant), U8(11),
                B(Star), R(8),
                B(CallRuntime), U16(Runtime::kCreatePrivateNameSymbol), R(8), U8(1),
                B(StaCurrentContextSlot), U8(5),
                B(PopContext), R(5),
                B(Mov), R(3), R(1),
  /*  221 S> */ B(Ldar), R(1),
  /*  221 E> */ B(Construct), R(1), R(0), U8(0), U8(0),
                B(Star), R(2),
  /*  232 S> */ B(LdaNamedProperty), R(2), U8(12), U8(2),
                B(Star), R(5),
  /*  232 E> */ B(CallProperty0), R(5), R(2), U8(4),
                B(LdaUndefined),
  /*  243 S> */ B(Return),
]
constant pool: [
  SCOPE_INFO_TYPE,
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["D"],
  SCOPE_INFO_TYPE,
  FIXED_ARRAY_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["E"],
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["callE"],
]
handlers: [
]

