#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: no
test function name: f

---
snippet: "
  function Outer() {
    var outerVar = 1;
    function Inner(innerArg) {
      this.innerFunc = function() { return outerVar * innerArg; }
    }
    this.getInnerFunc = function() { return new Inner(1).innerFunc; }
  }
  var f = new Outer().getInnerFunc();
  f();
"
frame size: 1
parameter count: 1
bytecode array length: 13
bytecodes: [
  /*   97 E> */ B(StackCheck),
  /*  102 S> */ B(LdaImmutableContextSlot), R(context), U8(4), U8(1),
                B(Star), R(0),
                B(LdaImmutableCurrentContextSlot), U8(4),
  /*  118 E> */ B(Mul), R(0), U8(0),
  /*  129 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  function Outer() {
    var outerVar = 1;
    function Inner(innerArg) {
      this.innerFunc = function() { outerVar = innerArg; }
    }
    this.getInnerFunc = function() { return new Inner(1).innerFunc; }
  }
  var f = new Outer().getInnerFunc();
  f();
"
frame size: 0
parameter count: 1
bytecode array length: 9
bytecodes: [
  /*   97 E> */ B(StackCheck),
  /*  102 S> */ B(LdaImmutableCurrentContextSlot), U8(4),
  /*  111 E> */ B(StaContextSlot), R(context), U8(4), U8(1),
                B(LdaUndefined),
  /*  123 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

