With inlined byte code disassembly (and some braces and newlines): >int main() >{ === 3 1c entry === 3 30 function start === 3 30 mark_at(0) === 3 54 pop to mark === 3 90 fill_stack(4,0) === 3 b6 init_frame(0,4)
> array(int) positions=({4,3}); === 4 be constant(0) === 4 e5 copy_value === 4 ed assign local and pop(0) > int pos=1; === 5 123 assign local number and pop(1,1) > array unrolled=({}); === 6 160 mark, call builtin(1) === 6 176 assign local and pop(2) === 7 1b3 local(0) === 7 1e0 & local(3) === 7 203 clear local(3) === 7 236 push 0 === 7 24d branch(3) > foreach (positions, int nextpos) > { === 7 252 label(5) > write("Extending to %d\n",nextpos); === 9 261 string(1) === 9 28b local(3) === 9 2b1 apply N(2,2) === 9 2c5 pop === 10 2f1 --local(1) === 10 34b ~ === 10 362 local(3) === 10 388 add integer(1) === 10 3d1 int+int === 10 403 branch(6) > for (;pos<=nextpos;++pos) { === 10 408 label(7) > unrolled += ({"Spam"}); === 10 417 mark === 10 42b & local(2) === 10 44e push 0 === 10 465 string(2) === 10 481 append array === 10 489 pop === 10 4b1 label(6) === 10 4c0 loop(7) > } === 10 521 local(3) === 10 547 add integer(1) === 10 590 assign local and pop(1) === 7 5ca label(3) === 7 5d9 foreach(5) > } === 7 67f pop_n_elems(4) === 12 68d clear n local(0,4) === 12 6d4 return 0 >} Looks like the problem is either in the loop opcode, or in the setup.