#
# Autogenerated by generate-bytecode-expectations.
#

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

---
snippet: "
  class A {
    get #a() { return 1; }
    set #a(val) { }
  
    constructor() {
      this.#a++;
      this.#a = 1;
      return this.#a;
    }
  }
  var test = A;
  new test;
"
frame size: 7
parameter count: 1
bytecode array length: 97
bytecodes: [
                B(LdaImmutableCurrentContextSlot), U8(3),
                B(Star), R(1),
                B(Mov), R(this), R(0),
                B(Mov), R(context), R(2),
  /*   67 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
  /*   76 S> */ B(LdaImmutableCurrentContextSlot), U8(2),
                B(Star), R(4),
                B(LdaImmutableCurrentContextSlot), U8(3),
  /*   81 E> */ B(LdaKeyedProperty), R(this), U8(0),
                B(CallRuntime), U16(Runtime::kLoadPrivateGetter), R(4), U8(1),
                B(Star), R(5),
                B(CallProperty0), R(5), R(this), U8(2),
                B(Inc), U8(4),
                B(Star), R(5),
  /*   83 E> */ B(CallRuntime), U16(Runtime::kLoadPrivateSetter), R(4), U8(1),
                B(Star), R(6),
                B(CallProperty1), R(6), R(this), R(5), U8(5),
  /*   91 S> */ B(LdaSmi), I8(1),
                B(Star), R(3),
                B(LdaImmutableCurrentContextSlot), U8(2),
                B(Star), R(5),
                B(LdaImmutableCurrentContextSlot), U8(3),
  /*   96 E> */ B(LdaKeyedProperty), R(this), U8(7),
                B(CallRuntime), U16(Runtime::kLoadPrivateSetter), R(5), U8(1),
                B(Star), R(6),
                B(CallProperty1), R(6), R(this), R(3), U8(9),
  /*  108 S> */ B(LdaImmutableCurrentContextSlot), U8(2),
                B(Star), R(4),
                B(LdaImmutableCurrentContextSlot), U8(3),
  /*  120 E> */ B(LdaKeyedProperty), R(this), U8(11),
                B(CallRuntime), U16(Runtime::kLoadPrivateGetter), R(4), U8(1),
                B(Star), R(5),
                B(CallProperty0), R(5), R(this), U8(13),
  /*  123 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  class B {
    get #b() { return 1; }
    constructor() { this.#b++; }
  }
  var test = B;
  new test;
"
frame size: 5
parameter count: 1
bytecode array length: 31
bytecodes: [
                B(LdaImmutableCurrentContextSlot), U8(3),
                B(Star), R(1),
                B(Mov), R(this), R(0),
                B(Mov), R(context), R(2),
  /*   48 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
  /*   53 S> */ B(Wide), B(LdaSmi), I16(272),
                B(Star), R(3),
                B(LdaConstant), U8(0),
                B(Star), R(4),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(3), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#b"],
]
handlers: [
]

---
snippet: "
  class C {
    set #c(val) { }
    constructor() { this.#c++; }
  }
  var test = C;
  new test;
"
frame size: 5
parameter count: 1
bytecode array length: 31
bytecodes: [
                B(LdaImmutableCurrentContextSlot), U8(3),
                B(Star), R(1),
                B(Mov), R(this), R(0),
                B(Mov), R(context), R(2),
  /*   41 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
  /*   46 S> */ B(Wide), B(LdaSmi), I16(271),
                B(Star), R(3),
                B(LdaConstant), U8(0),
                B(Star), R(4),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(3), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#c"],
]
handlers: [
]

---
snippet: "
  class D {
    get #d() { return 1; }
    constructor() { this.#d = 1; }
  }
  var test = D;
  new test;
"
frame size: 5
parameter count: 1
bytecode array length: 31
bytecodes: [
                B(LdaImmutableCurrentContextSlot), U8(3),
                B(Star), R(1),
                B(Mov), R(this), R(0),
                B(Mov), R(context), R(2),
  /*   48 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
  /*   53 S> */ B(Wide), B(LdaSmi), I16(272),
                B(Star), R(3),
                B(LdaConstant), U8(0),
                B(Star), R(4),
  /*   61 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(3), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#d"],
]
handlers: [
]

---
snippet: "
  class E {
    set #e(val) { }
    constructor() { this.#e; }
  }
  var test = E;
  new test;
"
frame size: 6
parameter count: 1
bytecode array length: 31
bytecodes: [
                B(LdaImmutableCurrentContextSlot), U8(3),
                B(Star), R(1),
                B(Mov), R(this), R(0),
                B(Mov), R(context), R(2),
  /*   41 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
  /*   46 S> */ B(Wide), B(LdaSmi), I16(271),
                B(Star), R(4),
                B(LdaConstant), U8(0),
                B(Star), R(5),
                B(CallRuntime), U16(Runtime::kNewTypeError), R(4), U8(2),
                B(Throw),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["#e"],
]
handlers: [
]

