#
# Autogenerated by generate-bytecode-expectations.
#

---
pool type: mixed
execute: yes
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: 2
parameter count: 1
bytecode array length: 21
bytecodes: [
  /*   97 E> */ B(StackCheck),
  /*  102 S> */ B(Ldar), R(context),
                B(Star), R(0),
                B(LdaContextSlot), R(0), U8(1),
                B(Star), R(0),
                B(LdaContextSlot), R(0), U8(4),
                B(Star), R(1),
  /*  120 E> */ B(LdaContextSlot), R(context), U8(4),
                B(Mul), R(1),
  /*  130 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: 2
parameter count: 1
bytecode array length: 22
bytecodes: [
  /*   97 E> */ B(StackCheck),
  /*  102 S> */ B(LdaContextSlot), R(context), U8(4),
  /*  111 E> */ B(Star), R(0),
                B(Ldar), R(context),
                B(Star), R(1),
                B(LdaContextSlot), R(1), U8(1),
                B(Star), R(1),
                B(Ldar), R(0),
                B(StaContextSlot), R(1), U8(4),
                B(LdaUndefined),
  /*  123 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

