#
# 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: 45
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaConstant), U8(0),
  /*   42 E> */ B(Star), R(1),
  /*   68 S> */ B(JumpIfUndefined), U8(38),
                B(JumpIfNull), U8(36),
                B(ToObject),
                B(Star), R(3),
                B(ForInPrepare), R(4),
                B(LdaZero),
                B(Star), R(7),
  /*   63 S> */ B(ForInDone), R(7), R(6),
                B(JumpIfTrue), U8(23),
                B(ForInNext), R(3), R(7), R(4), U8(1),
                B(JumpIfUndefined), U8(10),
                B(Star), R(0),
  /*   54 E> */ B(StackCheck),
                B(Ldar), R(0),
                B(Star), R(2),
  /*   85 S> */ B(Return),
                B(ForInStep), R(7),
                B(Star), R(7),
                B(Jump), U8(-24),
                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: 57
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaZero),
  /*   42 E> */ B(Star), R(1),
  /*   59 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(3),
                B(JumpIfUndefined), U8(47),
                B(JumpIfNull), U8(45),
                B(ToObject),
                B(Star), R(3),
                B(ForInPrepare), R(4),
                B(LdaZero),
                B(Star), R(7),
  /*   54 S> */ B(ForInDone), R(7), R(6),
                B(JumpIfTrue), U8(32),
                B(ForInNext), R(3), R(7), R(4), U8(1),
                B(JumpIfUndefined), U8(19),
                B(Star), R(0),
  /*   45 E> */ B(StackCheck),
                B(Ldar), R(0),
                B(Star), R(2),
  /*   70 S> */ B(Ldar), R(1),
                B(Star), R(8),
  /*   75 E> */ B(Ldar), R(2),
                B(Add), R(8),
  /*   72 E> */ B(Star), R(1),
                B(ForInStep), R(7),
                B(Star), R(7),
                B(Jump), U8(-33),
                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: 94
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(1),
                B(Star), R(1),
  /*   42 E> */ B(Star), R(0),
  /*   77 S> */ B(CreateArrayLiteral), U8(1), U8(1), U8(3),
                B(JumpIfUndefined), U8(79),
                B(JumpIfNull), U8(77),
                B(ToObject),
                B(Star), R(1),
                B(ForInPrepare), R(2),
                B(LdaZero),
                B(Star), R(5),
  /*   68 S> */ B(ForInDone), R(5), R(4),
                B(JumpIfTrue), U8(64),
                B(ForInNext), R(1), R(5), R(2), U8(9),
                B(JumpIfUndefined), U8(51),
                B(Star), R(6),
  /*   67 E> */ B(Ldar), R(0),
                B(Star), R(7),
                B(Ldar), R(6),
                B(StoreICSloppy), R(7), U8(2), U8(7),
  /*   62 E> */ B(StackCheck),
  /*   95 S> */ B(Ldar), R(0),
                B(Star), R(6),
  /*  100 E> */ B(LoadIC), R(6), U8(2), U8(3),
                B(Star), R(7),
                B(LdaSmi), U8(10),
  /*  106 E> */ B(TestEqual), R(7),
                B(JumpIfFalse), U8(4),
  /*  113 S> */ B(Jump), U8(20),
  /*  125 S> */ B(Ldar), R(0),
                B(Star), R(6),
  /*  130 E> */ B(LoadIC), R(6), U8(2), U8(5),
                B(Star), 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(-65),
                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: 69
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(3),
  /*   42 E> */ B(Star), R(0),
  /*   72 S> */ B(CreateArrayLiteral), U8(1), U8(1), U8(3),
                B(JumpIfUndefined), U8(56),
                B(JumpIfNull), U8(54),
                B(ToObject),
                B(Star), R(1),
                B(ForInPrepare), R(2),
                B(LdaZero),
                B(Star), R(5),
  /*   65 S> */ B(ForInDone), R(5), R(4),
                B(JumpIfTrue), U8(41),
                B(ForInNext), R(1), R(5), R(2), U8(7),
                B(JumpIfUndefined), U8(28),
                B(Star), R(6),
  /*   64 E> */ B(Ldar), R(0),
                B(Star), R(7),
                B(LdaZero),
                B(Star), R(8),
                B(Ldar), R(6),
                B(KeyedStoreICSloppy), R(7), R(8), U8(5),
  /*   59 E> */ B(StackCheck),
  /*   83 S> */ B(Ldar), R(0),
                B(Star), R(6),
  /*   91 E> */ B(LdaSmi), U8(3),
                B(KeyedLoadIC), R(6), U8(3),
  /*   98 S> */ B(Return),
                B(ForInStep), R(5),
                B(Star), R(5),
                B(Jump), U8(-42),
                B(LdaUndefined),
  /*   98 S> */ B(Return),
]
constant pool: [
  InstanceType::FIXED_ARRAY_TYPE,
  InstanceType::FIXED_ARRAY_TYPE,
]
handlers: [
]

