KOS_OP_LABEL
Style: COMPILE. Compile-time only.
Stack: No change.
Invariants: Not present in final bytecode after normal finalize; or executed as no-op if retained.
Behavior: Jump target placeholder. Finalize resolves branch targets to the LABEL’s pc, then strips the LABEL instruction (branch args are adjusted to point at the next instruction). If a LABEL is retained, it advances PC only (safety net).
Compiler form: Pre-compile arg = label name, a str or int. Branches refer to this name; finalize resolves names to pcs and strips LABEL. Post-compile: normally omitted; if retained, arg is 0 or unused.
Pre-compile example: List of (opcode, arg) pairs. The label name "done" is used by JUMP; finalize resolves it and then strips the LABEL.
["JUMP", "done"],
["CONST", 99],
["LABEL", "done"],
["RETURN", 1],
Post-compile (normal): LABEL is stripped. JUMP’s target was the LABEL at index 2; after stripping, that target becomes index 1 (the next instruction). Constant 99 is in the pool at index 0.
index |
opcode |
arg |
arg view |
comment |
|---|---|---|---|---|
0 |
JUMP |
1 |
1 (-> 1) |
branch to “done” (was LABEL at 2; after strip, target is 1) |
1 |
CONST |
0 |
0 (99) |
dead code; pool 0 = 99 |
2 |
RETURN |
1 |
1 |
(was index 3 before strip) |
Post-compile (if LABEL retained): Safety-net case only. If the LABEL were not stripped, it would appear as below and execute as a no-op.
index |
opcode |
arg |
arg view |
comment |
|---|---|---|---|---|
0 |
JUMP |
2 |
2 (-> 2) |
branch to label |
1 |
CONST |
0 |
0 (99) |
dead code |
2 |
LABEL |
0 |
– |
target “done”; no-op if executed |
3 |
RETURN |
1 |
1 |