#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: no
test function name: test
private methods: yes

---
snippet: "
  class A {
    static #a() { return 1; }
    static test() { return this.#a(); }
  }
  
  var test = A.test;
  test();
"
frame size: 4
parameter count: 1
bytecode array length: 35
bytecodes: [
  /*   56 S> */ B(LdaCurrentContextSlot), U8(3),
                B(TestReferenceEqual), R(this),
                B(Mov), R(this), R(1),
                B(JumpIfTrue), U8(18),
                B(Wide), B(LdaSmi), I16(268),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Star), R(3),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(2), U8(2),
                B(Throw),
                B(LdaImmutableCurrentContextSlot), U8(2),
                B(Star), R(0),
  /*   70 E> */ B(CallAnyReceiver), R(0), R(1), U8(1), U8(0),
  /*   73 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#a"],
]
handlers: [
]

---
snippet: "
  class B {
    static #b() { return 1; }
    static test() { this.#b = 1; }
  }
  
  var test = B.test;
  test();
"
frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
  /*   56 S> */ B(Wide), B(LdaSmi), I16(270),
                B(Star), R(0),
                B(LdaConstant), U8(0),
                B(Star), R(1),
  /*   64 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(0), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#b"],
]
handlers: [
]

---
snippet: "
  class C {
    static #c() { return 1; }
    static test() { this.#c++; }
  }
  
  var test = C.test;
  test();
"
frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
  /*   56 S> */ B(Wide), B(LdaSmi), I16(270),
                B(Star), R(0),
                B(LdaConstant), U8(0),
                B(Star), R(1),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(0), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#c"],
]
handlers: [
]

---
snippet: "
  class D {
    static get #d() { return 1; }
    static set #d(val) { }
  
    static test() {
      this.#d++;
      this.#d = 1;
      return this.#d;
    }
  }
  
  var test = D.test;
  test();
"
frame size: 5
parameter count: 1
bytecode array length: 142
bytecodes: [
  /*   90 S> */ B(LdaImmutableCurrentContextSlot), U8(2),
                B(Star), R(1),
                B(LdaCurrentContextSlot), U8(3),
  /*   94 E> */ B(TestReferenceEqual), R(this),
                B(Mov), R(this), R(0),
                B(JumpIfTrue), U8(18),
                B(Wide), B(LdaSmi), I16(268),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Star), R(3),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(2), U8(2),
                B(Throw),
                B(CallRuntime), U16(Runtime::kLoadPrivateGetter), R(1), U8(1),
                B(Star), R(2),
                B(CallProperty0), R(2), R(0), U8(0),
                B(Inc), U8(2),
                B(Star), R(2),
  /*   97 E> */ B(CallRuntime), U16(Runtime::kLoadPrivateSetter), R(1), U8(1),
                B(Star), R(3),
                B(CallProperty1), R(3), R(0), R(2), U8(3),
  /*  105 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
                B(LdaImmutableCurrentContextSlot), U8(2),
                B(Star), R(2),
                B(LdaCurrentContextSlot), U8(3),
  /*  109 E> */ B(TestReferenceEqual), R(this),
                B(Mov), R(this), R(1),
                B(JumpIfTrue), U8(18),
                B(Wide), B(LdaSmi), I16(269),
                B(Star), R(3),
                B(LdaConstant), U8(0),
                B(Star), R(4),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(3), U8(2),
                B(Throw),
                B(CallRuntime), U16(Runtime::kLoadPrivateSetter), R(2), U8(1),
                B(Star), R(3),
                B(CallProperty1), R(3), R(1), R(0), U8(5),
  /*  122 S> */ B(LdaImmutableCurrentContextSlot), U8(2),
                B(Star), R(1),
                B(LdaCurrentContextSlot), U8(3),
  /*  133 E> */ B(TestReferenceEqual), R(this),
                B(Mov), R(this), R(0),
                B(JumpIfTrue), U8(18),
                B(Wide), B(LdaSmi), I16(268),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Star), R(3),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(2), U8(2),
                B(Throw),
                B(CallRuntime), U16(Runtime::kLoadPrivateGetter), R(1), U8(1),
                B(Star), R(2),
                B(CallProperty0), R(2), R(0), U8(7),
  /*  137 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#d"],
]
handlers: [
]

---
snippet: "
  class E {
    static get #e() { return 1; }
    static test() { this.#e++; }
  }
  var test = E.test;
  test();
"
frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
  /*   60 S> */ B(Wide), B(LdaSmi), I16(272),
                B(Star), R(0),
                B(LdaConstant), U8(0),
                B(Star), R(1),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(0), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#e"],
]
handlers: [
]

---
snippet: "
  class F {
    static set #f(val) { }
    static test() { this.#f++; }
  }
  var test = F.test;
  test();
"
frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
  /*   53 S> */ B(Wide), B(LdaSmi), I16(271),
                B(Star), R(0),
                B(LdaConstant), U8(0),
                B(Star), R(1),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(0), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#f"],
]
handlers: [
]

---
snippet: "
  class G {
    static get #d() { return 1; }
    static test() { this.#d = 1; }
  }
  var test = G.test;
  test();
"
frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
  /*   60 S> */ B(Wide), B(LdaSmi), I16(272),
                B(Star), R(0),
                B(LdaConstant), U8(0),
                B(Star), R(1),
  /*   68 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(0), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#d"],
]
handlers: [
]

---
snippet: "
  class H {
    set #h(val) { }
    static test() { this.#h; }
  }
  var test = H.test;
  test();
"
frame size: 3
parameter count: 1
bytecode array length: 16
bytecodes: [
  /*   46 S> */ B(Wide), B(LdaSmi), I16(271),
                B(Star), R(1),
                B(LdaConstant), U8(0),
                B(Star), R(2),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(1), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#h"],
]
handlers: [
]

