#
# Autogenerated by generate-bytecode-expectations.
#

---
pool type: mixed
execute: yes
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: 44
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaConstant), U8(0),
                B(Star), R(1),
  /*   68 S> */ B(JumpIfUndefined), U8(37),
                B(JumpIfNull), U8(35),
                B(ToObject),
                B(ForInPrepare), R(4),
                B(Star), R(3),
                B(LdaZero),
                B(Star), R(7),
  /*   63 S> */ B(ForInDone), R(7), R(6),
                B(JumpIfTrue), U8(22),
                B(ForInNext), R(3), R(7), R(4), U8(1),
                B(JumpIfUndefined), U8(9),
                B(Star), R(0),
  /*   54 E> */ B(StackCheck),
                B(Star), R(2),
  /*   73 S> */ B(Nop),
  /*   85 S> */ B(Return),
                B(ForInStep), R(7),
                B(Star), R(7),
                B(Jump), U8(-23),
                B(LdaUndefined),
  /*   85 S> */ B(Return),
]
constant pool: [
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
]
handlers: [
]

---
snippet: "
  var x = 0;
  for (var p in [1,2,3]) { x += p; }
"
frame size: 9
parameter count: 1
bytecode array length: 54
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaZero),
                B(Star), R(1),
  /*   59 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(3),
                B(JumpIfUndefined), U8(44),
                B(JumpIfNull), U8(42),
                B(ToObject),
                B(ForInPrepare), R(4),
                B(Star), R(3),
                B(LdaZero),
                B(Star), R(7),
  /*   54 S> */ B(ForInDone), R(7), R(6),
                B(JumpIfTrue), U8(29),
                B(ForInNext), R(3), R(7), R(4), U8(1),
                B(JumpIfUndefined), U8(16),
                B(Star), R(0),
  /*   45 E> */ B(StackCheck),
                B(Star), R(2),
  /*   70 S> */ B(Ldar), R(0),
  /*   75 E> */ B(Add), R(1),
                B(Mov), R(1), R(8),
                B(Star), R(1),
  /*   72 E> */ B(ForInStep), R(7),
                B(Star), R(7),
                B(Jump), U8(-30),
                B(LdaUndefined),
  /*   80 S> */ B(Return),
]
constant pool: [
  InstanceType::FIXED_ARRAY_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: 8
parameter count: 1
bytecode array length: 80
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(1),
                B(Star), R(1),
                B(Star), R(0),
  /*   77 S> */ B(CreateArrayLiteral), U8(1), U8(1), U8(3),
                B(JumpIfUndefined), U8(65),
                B(JumpIfNull), U8(63),
                B(ToObject),
                B(ForInPrepare), R(2),
                B(Star), R(1),
                B(LdaZero),
                B(Star), R(5),
  /*   68 S> */ B(ForInDone), R(5), R(4),
                B(JumpIfTrue), U8(50),
                B(ForInNext), R(1), R(5), R(2), U8(9),
                B(JumpIfUndefined), U8(37),
                B(Star), R(6),
  /*   67 E> */ B(StaNamedPropertySloppy), R(0), U8(2), U8(7),
  /*   62 E> */ B(StackCheck),
  /*   95 S> */ B(Nop),
  /*  100 E> */ B(LdrNamedProperty), R(0), U8(2), U8(3), R(7),
                B(LdaSmi), U8(10),
  /*  106 E> */ B(TestEqual), R(7),
                B(JumpIfFalse), U8(4),
  /*  113 S> */ B(Jump), U8(16),
  /*  125 S> */ B(Nop),
  /*  130 E> */ B(LdrNamedProperty), R(0), U8(2), U8(5), R(7),
                B(LdaSmi), U8(20),
  /*  136 E> */ B(TestEqual), R(7),
                B(JumpIfFalse), U8(4),
  /*  143 S> */ B(Jump), U8(8),
                B(ForInStep), R(5),
                B(Star), R(5),
                B(Jump), U8(-51),
                B(LdaUndefined),
  /*  152 S> */ B(Return),
]
constant pool: [
  InstanceType::FIXED_ARRAY_TYPE,
  InstanceType::FIXED_ARRAY_TYPE,
  InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
]
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: 61
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(3),
                B(Star), R(0),
  /*   72 S> */ B(CreateArrayLiteral), U8(1), U8(1), U8(3),
                B(JumpIfUndefined), U8(48),
                B(JumpIfNull), U8(46),
                B(ToObject),
                B(ForInPrepare), R(2),
                B(Star), R(1),
                B(LdaZero),
                B(Star), R(5),
  /*   65 S> */ B(ForInDone), R(5), R(4),
                B(JumpIfTrue), U8(33),
                B(ForInNext), R(1), R(5), R(2), U8(7),
                B(JumpIfUndefined), U8(20),
                B(Star), R(6),
                B(LdaZero),
                B(Star), R(8),
                B(Ldar), R(6),
  /*   64 E> */ B(StaKeyedPropertySloppy), R(0), R(8), U8(5),
  /*   59 E> */ B(StackCheck),
  /*   83 S> */ B(LdaSmi), U8(3),
  /*   91 E> */ B(LdaKeyedProperty), R(0), U8(3),
  /*   98 S> */ B(Return),
                B(ForInStep), R(5),
                B(Star), R(5),
                B(Jump), U8(-34),
                B(LdaUndefined),
  /*   98 S> */ B(Return),
]
constant pool: [
  InstanceType::FIXED_ARRAY_TYPE,
  InstanceType::FIXED_ARRAY_TYPE,
]
handlers: [
]

