KOS_OP_PUSH_LOOP
Style: NOARG. Argument unused; break target is derived at runtime from the extent table (
pop_pc + 1). Continue target = instruction immediately following PUSH_LOOP (i.e.CURRENT_PCafter the evaluator has advanced past the opcode).Stack: Pushes the LOOP node, which owns its segment. Break/continue use
break_pc(derived at runtime) andcontinue_pc(next instruction after PUSH_LOOP). Initializes node result toNone.Pushes: KOS_DYN_LOOP (static extent KOS_EXT_LOOP; with its own segment for the loop body).
Invariants: A KOS_EXT_LOOP extent must exist at the PUSH_LOOP PC; otherwise RuntimeError. Extent kind KOS_EXT_LOOP.
Compiler form: Pre-compile arg = 0 (unused). Break target is not stored in the instruction; it is derived at runtime via
kos_extent_find(KOS_EXT_LOOP)→ext->pop_pc + 1.
Example: while loop. Break target derived from extent table (pop_pc+1 = 6).
index |
opcode |
arg |
arg view |
comment |
|---|---|---|---|---|
0 |
PUSH_LOOP |
0 |
0 |
push LOOP region; break_pc = pop_pc+1 from extent table; continue_pc = 1 |
1 |
CONST |
0 |
0 (False) |
condition |
2 |
JUMP_FALSE |
5 |
5 (-> 5) |
exit loop if false; jumps to POP_LOOP |
3 |
… |
… |
… |
body |
4 |
JUMP |
1 |
1 (-> 1) |
continue (loop head) |
5 |
POP_LOOP |
0 |
0 |
|
6 |
LABEL |
– |
– |
break target (= pop_pc+1) |