# KOS_OP_VAR_STORE_CONST - **Style**: EXTRA (VAR, CONST, NOARG, NOARG). Arg = extra-table index (post-compile). - **Stack**: `[...] → [...]` (no stack effect). **STORE**: store the constant value into the given name via `frame_ns_store`. Same semantics as **VAR_STORE**, but the value is taken from the constant pool (extra row field `a1`), not from TOS. - **Peephole**: **`Compiler.compress`** fuses **`KOS_OP_CONST`** `value` immediately followed by **`KOS_OP_VAR_STORE`** `name` into this opcode with pre-compile arg **`(name, value, None, None)`**; the **`CONST`** is removed from the stream. See §1.8. - **Lowering**: **`Compiler.convert_fast`** (when the name has a fixed fast slot in FUNCTION mode) may replace **`VAR_STORE_CONST`** with **`FAST_STORE_CONST`**, rewriting the VAR field to a slot index and preserving the constant operand. - **Invariants**: Name must already be bound. Name and value are internalized into the extra row at finalize. - **Compiler form:** Pre-compile arg = 4-tuple `(name, value, None, None)`; post-compile arg = extra index. - **Implementation**: `koskari/lib/opcode/VAR_STORE_CONST.c` - **Covered by**: `tests/compile/test_compress.py`, `tests/compile/test_convert_fast.py`, `tests/lib/opcode/test_store_const.py` **Example:** Store constant 42 into name `"x"` without pushing 42. Pre-compile stream after compress: one **`VAR_STORE_CONST`**; pool/extra filled at finalize. Post-compile arg view uses extra index **0** (illustrative). | index | opcode | arg | arg view | comment | |------:|-----------------|-----|-----------------------|---------| | 0 | VAR_STORE_CONST | 0 | 0 → ('x', 42, …) | STORE 42 into "x"; stack unchanged | | 1 | RETURN | 1 | 1 | | **Example (fusion source):** `(setq x 42)` emits value, **`VAR_STORE`**, **`CONST`** `None`; compress turns **`CONST`** `42` + **`VAR_STORE`** `x` into **`VAR_STORE_CONST`**.