#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: yes

---
snippet: "
  var x = 0;
  while (false) { x = 99; break; continue; }
  return x;
"
frame size: 1
parameter count: 1
bytecode array length: 4
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   97 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0;
  while (false) {
    x = x + 1;
  };
  return x;
"
frame size: 1
parameter count: 1
bytecode array length: 4
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   86 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0;
  var y = 1;
  while (x < 10) {
    y = y * 12;
    x = x + 1;
    if (x == 3) continue;
    if (x == 4) break;
  }
  return y;
"
frame size: 2
parameter count: 1
bytecode array length: 52
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(1),
                B(Star), R(1),
  /*   65 S> */ B(LdaSmi), I8(10),
  /*   65 E> */ B(TestLessThan), R(0), U8(0),
                B(JumpIfFalse), U8(37),
  /*   75 S> */ B(Ldar), R(1),
  /*   81 E> */ B(MulSmi), I8(12), U8(1),
                B(Star), R(1),
  /*   89 S> */ B(Ldar), R(0),
  /*   95 E> */ B(AddSmi), I8(1), U8(2),
                B(Star), R(0),
  /*  102 S> */ B(LdaSmi), I8(3),
  /*  108 E> */ B(TestEqual), R(0), U8(3),
                B(JumpIfFalse), U8(4),
  /*  114 S> */ B(Jump), U8(11),
  /*  126 S> */ B(LdaSmi), I8(4),
  /*  132 E> */ B(TestEqual), R(0), U8(4),
                B(JumpIfFalse), U8(4),
  /*  138 S> */ B(Jump), U8(5),
  /*   56 E> */ B(JumpLoop), U8(39), I8(0),
  /*  147 S> */ B(Ldar), R(1),
  /*  156 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var i = 0;
  while (true) {
    if (i < 0) continue;
    if (i == 3) break;
    if (i == 4) break;
    if (i == 10) continue;
    if (i == 5) break;
    i = i + 1;
  }
  return i;
"
frame size: 1
parameter count: 1
bytecode array length: 60
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   62 S> */ B(LdaZero),
  /*   68 E> */ B(TestLessThan), R(0), U8(0),
                B(JumpIfFalse), U8(4),
  /*   73 S> */ B(Jump), U8(45),
  /*   85 S> */ B(LdaSmi), I8(3),
  /*   91 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*   97 S> */ B(Jump), U8(39),
  /*  106 S> */ B(LdaSmi), I8(4),
  /*  112 E> */ B(TestEqual), R(0), U8(2),
                B(JumpIfFalse), U8(4),
  /*  118 S> */ B(Jump), U8(30),
  /*  127 S> */ B(LdaSmi), I8(10),
  /*  133 E> */ B(TestEqual), R(0), U8(3),
                B(JumpIfFalse), U8(4),
  /*  140 S> */ B(Jump), U8(18),
  /*  152 S> */ B(LdaSmi), I8(5),
  /*  158 E> */ B(TestEqual), R(0), U8(4),
                B(JumpIfFalse), U8(4),
  /*  164 S> */ B(Jump), U8(12),
  /*  173 S> */ B(Ldar), R(0),
  /*  179 E> */ B(AddSmi), I8(1), U8(5),
                B(Star), R(0),
  /*   45 E> */ B(JumpLoop), U8(51), I8(0),
  /*  186 S> */ B(Ldar), R(0),
  /*  195 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var i = 0;
  while (true) {
    while (i < 3) {
      if (i == 2) break;
      i = i + 1;
    }
    i = i + 1;
    break;
  }
  return i;
"
frame size: 1
parameter count: 1
bytecode array length: 43
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   71 S> */ B(LdaSmi), I8(3),
  /*   71 E> */ B(TestLessThan), R(0), U8(0),
                B(JumpIfFalse), U8(20),
  /*   82 S> */ B(LdaSmi), I8(2),
  /*   88 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*   94 S> */ B(Jump), U8(11),
  /*  105 S> */ B(Ldar), R(0),
  /*  111 E> */ B(AddSmi), I8(1), U8(2),
                B(Star), R(0),
                B(Jump), U8(11),
  /*  122 S> */ B(Ldar), R(0),
  /*  128 E> */ B(AddSmi), I8(1), U8(3),
                B(Star), R(0),
  /*  135 S> */ B(Jump), U8(5),
  /*   45 E> */ B(JumpLoop), U8(34), I8(0),
  /*  144 S> */ B(Ldar), R(0),
  /*  153 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 10;
  var y = 1;
  while (x) {
    y = y * 12;
    x = x - 1;
  }
  return y;
"
frame size: 2
parameter count: 1
bytecode array length: 32
bytecodes: [
  /*   42 S> */ B(LdaSmi), I8(10),
                B(Star), R(0),
  /*   54 S> */ B(LdaSmi), I8(1),
                B(Star), R(1),
  /*   64 S> */ B(Ldar), R(0),
                B(JumpIfToBooleanFalse), U8(19),
  /*   71 S> */ B(Ldar), R(1),
  /*   77 E> */ B(MulSmi), I8(12), U8(0),
                B(Star), R(1),
  /*   85 S> */ B(Ldar), R(0),
  /*   91 E> */ B(SubSmi), I8(1), U8(1),
                B(Star), R(0),
  /*   57 E> */ B(JumpLoop), U8(18), I8(0),
  /*   98 S> */ B(Ldar), R(1),
  /*  107 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0; var y = 1;
  do {
    y = y * 10;
    if (x == 5) break;
    if (x == 6) continue;
    x = x + 1;
  } while (x < 10);
  return y;
"
frame size: 2
parameter count: 1
bytecode array length: 52
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(1),
                B(Star), R(1),
  /*   63 S> */ B(Ldar), R(1),
  /*   69 E> */ B(MulSmi), I8(10), U8(0),
                B(Star), R(1),
  /*   77 S> */ B(LdaSmi), I8(5),
  /*   83 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*   89 S> */ B(Jump), U8(28),
  /*   98 S> */ B(LdaSmi), I8(6),
  /*  104 E> */ B(TestEqual), R(0), U8(2),
                B(JumpIfFalse), U8(4),
  /*  110 S> */ B(Jump), U8(9),
  /*  122 S> */ B(Ldar), R(0),
  /*  128 E> */ B(AddSmi), I8(1), U8(3),
                B(Star), R(0),
  /*  144 S> */ B(LdaSmi), I8(10),
  /*  144 E> */ B(TestLessThan), R(0), U8(4),
                B(JumpIfFalse), U8(5),
  /*   56 E> */ B(JumpLoop), U8(39), I8(0),
  /*  151 S> */ B(Ldar), R(1),
  /*  160 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 10;
  var y = 1;
  do {
    y = y * 12;
    x = x - 1;
  } while (x);
  return y;
"
frame size: 2
parameter count: 1
bytecode array length: 30
bytecodes: [
  /*   42 S> */ B(LdaSmi), I8(10),
                B(Star), R(0),
  /*   54 S> */ B(LdaSmi), I8(1),
                B(Star), R(1),
  /*   64 S> */ B(Ldar), R(1),
  /*   70 E> */ B(MulSmi), I8(12), U8(0),
                B(Star), R(1),
  /*   78 S> */ B(Ldar), R(0),
  /*   84 E> */ B(SubSmi), I8(1), U8(1),
                B(Star), R(0),
  /*   98 S> */ B(JumpIfToBooleanFalse), U8(5),
  /*   57 E> */ B(JumpLoop), U8(16), I8(0),
  /*  102 S> */ B(Ldar), R(1),
  /*  111 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0; var y = 1;
  do {
    y = y * 10;
    if (x == 5) break;
    x = x + 1;
    if (x == 6) continue;
  } while (false);
  return y;
"
frame size: 2
parameter count: 1
bytecode array length: 40
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(1),
                B(Star), R(1),
  /*   69 S> */ B(MulSmi), I8(10), U8(0),
                B(Star), R(1),
  /*   77 S> */ B(LdaSmi), I8(5),
  /*   83 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*   89 S> */ B(Jump), U8(18),
  /*   98 S> */ B(Ldar), R(0),
  /*  104 E> */ B(AddSmi), I8(1), U8(2),
                B(Star), R(0),
  /*  111 S> */ B(LdaSmi), I8(6),
  /*  117 E> */ B(TestEqual), R(0), U8(3),
                B(JumpIfFalse), U8(4),
  /*  123 S> */ B(Jump), U8(2),
  /*  150 S> */ B(Ldar), R(1),
  /*  159 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0; var y = 1;
  do {
    y = y * 10;
    if (x == 5) break;
    x = x + 1;
    if (x == 6) continue;
  } while (true);
  return y;
"
frame size: 2
parameter count: 1
bytecode array length: 45
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(1),
                B(Star), R(1),
  /*   63 S> */ B(Ldar), R(1),
  /*   69 E> */ B(MulSmi), I8(10), U8(0),
                B(Star), R(1),
  /*   77 S> */ B(LdaSmi), I8(5),
  /*   83 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*   89 S> */ B(Jump), U8(21),
  /*   98 S> */ B(Ldar), R(0),
  /*  104 E> */ B(AddSmi), I8(1), U8(2),
                B(Star), R(0),
  /*  111 S> */ B(LdaSmi), I8(6),
  /*  117 E> */ B(TestEqual), R(0), U8(3),
                B(JumpIfFalse), U8(4),
  /*  123 S> */ B(Jump), U8(2),
  /*   56 E> */ B(JumpLoop), U8(32), I8(0),
  /*  149 S> */ B(Ldar), R(1),
  /*  158 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0;
  for (;;) {
    if (x == 1) break;
    if (x == 2) continue;
    x = x + 1;
  }
"
frame size: 1
parameter count: 1
bytecode array length: 33
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   58 S> */ B(LdaSmi), I8(1),
  /*   64 E> */ B(TestEqual), R(0), U8(0),
                B(JumpIfFalse), U8(4),
  /*   70 S> */ B(Jump), U8(21),
  /*   79 S> */ B(LdaSmi), I8(2),
  /*   85 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*   91 S> */ B(Jump), U8(9),
  /*  103 S> */ B(Ldar), R(0),
  /*  109 E> */ B(AddSmi), I8(1), U8(2),
                B(Star), R(0),
  /*   45 E> */ B(JumpLoop), U8(25), I8(0),
                B(LdaUndefined),
  /*  116 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  for (var x = 0;;) {
    if (x == 1) break;
    if (x == 2) continue;
    x = x + 1;
  }
"
frame size: 1
parameter count: 1
bytecode array length: 33
bytecodes: [
  /*   47 S> */ B(LdaZero),
                B(Star), R(0),
  /*   56 S> */ B(LdaSmi), I8(1),
  /*   62 E> */ B(TestEqual), R(0), U8(0),
                B(JumpIfFalse), U8(4),
  /*   68 S> */ B(Jump), U8(21),
  /*   77 S> */ B(LdaSmi), I8(2),
  /*   83 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*   89 S> */ B(Jump), U8(9),
  /*  101 S> */ B(Ldar), R(0),
  /*  107 E> */ B(AddSmi), I8(1), U8(2),
                B(Star), R(0),
  /*   34 E> */ B(JumpLoop), U8(25), I8(0),
                B(LdaUndefined),
  /*  114 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0;
  for (;; x = x + 1) {
    if (x == 1) break;
    if (x == 2) continue;
  }
"
frame size: 1
parameter count: 1
bytecode array length: 33
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   68 S> */ B(LdaSmi), I8(1),
  /*   74 E> */ B(TestEqual), R(0), U8(0),
                B(JumpIfFalse), U8(4),
  /*   80 S> */ B(Jump), U8(21),
  /*   89 S> */ B(LdaSmi), I8(2),
  /*   95 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*  101 S> */ B(Jump), U8(2),
  /*   55 S> */ B(Ldar), R(0),
  /*   59 E> */ B(AddSmi), I8(1), U8(2),
                B(Star), R(0),
  /*   45 E> */ B(JumpLoop), U8(25), I8(0),
                B(LdaUndefined),
  /*  113 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  for (var x = 0;; x = x + 1) {
    if (x == 1) break;
    if (x == 2) continue;
  }
"
frame size: 1
parameter count: 1
bytecode array length: 33
bytecodes: [
  /*   47 S> */ B(LdaZero),
                B(Star), R(0),
  /*   66 S> */ B(LdaSmi), I8(1),
  /*   72 E> */ B(TestEqual), R(0), U8(0),
                B(JumpIfFalse), U8(4),
  /*   78 S> */ B(Jump), U8(21),
  /*   87 S> */ B(LdaSmi), I8(2),
  /*   93 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*   99 S> */ B(Jump), U8(2),
  /*   53 S> */ B(Ldar), R(0),
  /*   57 E> */ B(AddSmi), I8(1), U8(2),
                B(Star), R(0),
  /*   34 E> */ B(JumpLoop), U8(25), I8(0),
                B(LdaUndefined),
  /*  111 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var u = 0;
  for (var i = 0; i < 100; i = i + 1) {
    u = u + 1;
    continue;
  }
"
frame size: 2
parameter count: 1
bytecode array length: 34
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   58 S> */ B(LdaZero),
                B(Star), R(1),
  /*   63 S> */ B(LdaSmi), I8(100),
  /*   63 E> */ B(TestLessThan), R(1), U8(0),
                B(JumpIfFalse), U8(21),
  /*   85 S> */ B(Ldar), R(0),
  /*   91 E> */ B(AddSmi), I8(1), U8(1),
                B(Star), R(0),
  /*   98 S> */ B(Jump), U8(2),
  /*   72 S> */ B(Ldar), R(1),
  /*   76 E> */ B(AddSmi), I8(1), U8(2),
                B(Star), R(1),
  /*   45 E> */ B(JumpLoop), U8(23), I8(0),
                B(LdaUndefined),
  /*  110 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var y = 1;
  for (var x = 10; x; --x) {
    y = y * 12;
  }
  return y;
"
frame size: 2
parameter count: 1
bytecode array length: 31
bytecodes: [
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   58 S> */ B(LdaSmi), I8(10),
                B(Star), R(1),
  /*   62 S> */ B(Ldar), R(1),
                B(JumpIfToBooleanFalse), U8(18),
  /*   74 S> */ B(Ldar), R(0),
  /*   80 E> */ B(MulSmi), I8(12), U8(0),
                B(Star), R(0),
  /*   67 S> */ B(Ldar), R(1),
                B(Dec), U8(1),
                B(Star), R(1),
  /*   45 E> */ B(JumpLoop), U8(17), I8(0),
  /*   88 S> */ B(Ldar), R(0),
  /*   97 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0;
  for (var i = 0; false; i++) {
    x = x + 1;
  };
  return x;
"
frame size: 2
parameter count: 1
bytecode array length: 9
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   58 S> */ B(LdaZero),
                B(Star), R(1),
  /*   91 S> */ B(Ldar), R(0),
  /*  100 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0;
  for (var i = 0; true; ++i) {
    x = x + 1;
    if (x == 20) break;
  };
  return x;
"
frame size: 2
parameter count: 1
bytecode array length: 34
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   58 S> */ B(LdaZero),
                B(Star), R(1),
  /*   76 S> */ B(Ldar), R(0),
  /*   82 E> */ B(AddSmi), I8(1), U8(0),
                B(Star), R(0),
  /*   89 S> */ B(LdaSmi), I8(20),
  /*   95 E> */ B(TestEqual), R(0), U8(1),
                B(JumpIfFalse), U8(4),
  /*  102 S> */ B(Jump), U8(11),
  /*   69 S> */ B(Ldar), R(1),
                B(Inc), U8(2),
                B(Star), R(1),
  /*   45 E> */ B(JumpLoop), U8(22), I8(0),
  /*  112 S> */ B(Ldar), R(0),
  /*  121 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var a = 0;
  while (a) {
    { 
     let z = 1;
     function f() { z = 2; }
     if (z) continue;
     z++;
    }
  }
"
frame size: 4
parameter count: 1
bytecode array length: 48
bytecodes: [
  /*   42 S> */ B(LdaZero),
                B(Star), R(0),
  /*   52 S> */ B(Ldar), R(0),
                B(JumpIfToBooleanFalse), U8(41),
                B(CreateBlockContext), U8(0),
                B(PushContext), R(3),
                B(LdaTheHole),
                B(StaCurrentContextSlot), U8(2),
                B(CreateClosure), U8(1), U8(0), U8(2),
                B(Star), R(2),
  /*   73 S> */ B(LdaSmi), I8(1),
  /*   73 E> */ B(StaCurrentContextSlot), U8(2),
  /*  102 S> */ B(Mov), R(2), R(1),
  /*  106 S> */ B(LdaCurrentContextSlot), U8(2),
                B(JumpIfToBooleanFalse), U8(6),
  /*  113 S> */ B(PopContext), R(3),
                B(Jump), U8(10),
  /*  126 S> */ B(LdaCurrentContextSlot), U8(2),
                B(Inc), U8(0),
  /*  127 E> */ B(StaCurrentContextSlot), U8(2),
                B(PopContext), R(3),
  /*   45 E> */ B(JumpLoop), U8(40), I8(0),
                B(LdaUndefined),
  /*  137 S> */ B(Return),
]
constant pool: [
  SCOPE_INFO_TYPE,
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

