When emitting jump instructions for breaking out of for-loops, the compiler incorrectly set the jump target before the pop instruction clearing the intermediate loop variables. Since the break instruction itself already compiles to a series of pop instructions reverting the stack to it's the pre-loop state, intermediate values got popped twice, leading to a stack layout mismatch between compiler and VM, resulting in wrong local variable values or segmentation faults at runtime. -- Testcase -- {% let x = 1; for (let y in [2]) break; let z = 3; print([ x, z ], "\n"); %} -- End -- -- Expect stdout -- [ 1, 3 ] -- End -- -- Testcase -- {% let x = 1; for (let y = 0; y < 1; y++) break; let z = 3; print([ x, z ], "\n"); %} -- End -- -- Expect stdout -- [ 1, 3 ] -- End --