#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: yes

---
snippet: "
  for (var p in null) {}
"
frame size: 2
parameter count: 1
bytecode array length: 3
bytecodes: [
  /*   30 E> */ B(StackCheck),
                B(LdaUndefined),
  /*   57 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  for (var p in undefined) {}
"
frame size: 2
parameter count: 1
bytecode array length: 3
bytecodes: [
  /*   30 E> */ B(StackCheck),
                B(LdaUndefined),
  /*   62 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  for (var p in undefined) {}
"
frame size: 2
parameter count: 1
bytecode array length: 3
bytecodes: [
  /*   30 E> */ B(StackCheck),
                B(LdaUndefined),
  /*   62 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 'potatoes';
  for (var p in x) { return p; }
"
frame size: 8
parameter count: 1
bytecode array length: 46
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaConstant), U8(0),
                B(Star), R(0),
  /*   68 S> */ B(JumpIfUndefined), U8(39),
                B(JumpIfNull), U8(37),
                B(ToObject), R(3),
                B(ForInEnumerate), R(3),
                B(ForInPrepare), R(4), U8(0),
                B(LdaZero),
                B(Star), R(7),
  /*   63 S> */ B(ForInContinue), R(7), R(6),
                B(JumpIfFalse), U8(22),
                B(ForInNext), R(3), R(7), R(4), U8(0),
                B(JumpIfUndefined), U8(8),
                B(Star), R(1),
  /*   54 E> */ B(StackCheck),
                B(Star), R(2),
  /*   82 S> */ B(Return),
                B(ForInStep), R(7),
                B(Star), R(7),
                B(JumpLoop), U8(22), I8(0),
                B(LdaUndefined),
  /*   85 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["potatoes"],
]
handlers: [
]

---
snippet: "
  var x = 0;
  for (var p in [1,2,3]) { x += p; }
"
frame size: 9
parameter count: 1
bytecode array length: 58
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   59 S> */ B(CreateArrayLiteral), U8(0), U8(1), U8(37),
                B(JumpIfUndefined), U8(48),
                B(JumpIfNull), U8(46),
                B(ToObject), R(3),
                B(ForInEnumerate), R(3),
                B(ForInPrepare), R(4), U8(0),
                B(LdaZero),
                B(Star), R(7),
  /*   54 S> */ B(ForInContinue), R(7), R(6),
                B(JumpIfFalse), U8(31),
                B(ForInNext), R(3), R(7), R(4), U8(0),
                B(JumpIfUndefined), U8(17),
                B(Star), R(1),
  /*   45 E> */ B(StackCheck),
                B(Star), R(2),
  /*   70 S> */ B(Ldar), R(1),
  /*   75 E> */ B(Add), R(0), U8(2),
                B(Mov), R(0), R(8),
                B(Star), R(0),
  /*   72 E> */ B(ForInStep), R(7),
                B(Star), R(7),
                B(JumpLoop), U8(31), I8(0),
                B(LdaUndefined),
  /*   80 S> */ B(Return),
]
constant pool: [
  TUPLE2_TYPE,
]
handlers: [
]

---
snippet: "
  var x = { 'a': 1, 'b': 2 };
  for (x['a'] in [10, 20, 30]) {
    if (x['a'] == 10) continue;
    if (x['a'] == 20) break;
  }
"
frame size: 7
parameter count: 1
bytecode array length: 87
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(41), R(1),
                B(Mov), R(1), R(0),
  /*   77 S> */ B(CreateArrayLiteral), U8(1), U8(2), U8(37),
                B(JumpIfUndefined), U8(72),
                B(JumpIfNull), U8(70),
                B(ToObject), R(1),
                B(ForInEnumerate), R(1),
                B(ForInPrepare), R(2), U8(1),
                B(LdaZero),
                B(Star), R(5),
  /*   68 S> */ B(ForInContinue), R(5), R(4),
                B(JumpIfFalse), U8(55),
                B(ForInNext), R(1), R(5), R(2), U8(1),
                B(JumpIfUndefined), U8(41),
                B(Star), R(6),
                B(Ldar), R(6),
  /*   67 E> */ B(StaNamedProperty), R(0), U8(2), U8(3),
  /*   62 E> */ B(StackCheck),
  /*  100 S> */ B(LdaNamedProperty), R(0), U8(2), U8(5),
                B(Star), R(6),
                B(LdaSmi), I8(10),
  /*  106 E> */ B(TestEqual), R(6), U8(7),
                B(JumpIfFalse), U8(4),
  /*  113 S> */ B(Jump), U8(17),
  /*  130 S> */ B(LdaNamedProperty), R(0), U8(2), U8(8),
                B(Star), R(6),
                B(LdaSmi), I8(20),
  /*  136 E> */ B(TestEqual), R(6), U8(10),
                B(JumpIfFalse), U8(4),
  /*  143 S> */ B(Jump), U8(9),
                B(ForInStep), R(5),
                B(Star), R(5),
                B(JumpLoop), U8(55), I8(0),
                B(LdaUndefined),
  /*  152 S> */ B(Return),
]
constant pool: [
  FIXED_ARRAY_TYPE,
  TUPLE2_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["a"],
]
handlers: [
]

---
snippet: "
  var x = [ 10, 11, 12 ] ;
  for (x[0] in [1,2,3]) { return x[3]; }
"
frame size: 9
parameter count: 1
bytecode array length: 64
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(37),
                B(Star), R(0),
  /*   72 S> */ B(CreateArrayLiteral), U8(1), U8(2), U8(37),
                B(JumpIfUndefined), U8(51),
                B(JumpIfNull), U8(49),
                B(ToObject), R(1),
                B(ForInEnumerate), R(1),
                B(ForInPrepare), R(2), U8(1),
                B(LdaZero),
                B(Star), R(5),
  /*   65 S> */ B(ForInContinue), R(5), R(4),
                B(JumpIfFalse), U8(34),
                B(ForInNext), R(1), R(5), R(2), U8(1),
                B(JumpIfUndefined), U8(20),
                B(Star), R(6),
                B(LdaZero),
                B(Star), R(8),
                B(Ldar), R(6),
  /*   64 E> */ B(StaKeyedProperty), R(0), R(8), U8(3),
  /*   59 E> */ B(StackCheck),
  /*   83 S> */ B(LdaSmi), I8(3),
  /*   91 E> */ B(LdaKeyedProperty), R(0), U8(5),
  /*   95 S> */ B(Return),
                B(ForInStep), R(5),
                B(Star), R(5),
                B(JumpLoop), U8(34), I8(0),
                B(LdaUndefined),
  /*   98 S> */ B(Return),
]
constant pool: [
  TUPLE2_TYPE,
  TUPLE2_TYPE,
]
handlers: [
]

