# Session save — 2026-09-22 (m2compiler-V3, step 4 complete) ## Where we are HEAD: `abc41a7` — tag `v3-step4.3`, milestone tag `v3-step4`. Suite **87/87** (44 run — incl. 4 trap-aborts + 4 sessions — + 43 reject). Build is warning-free (only the known-benign Coco TypeBlock LL(1) advisory). Tree clean except untracked `git.txt` (push recipe, intentional). No remote configured. ## Step 4 in three landings (all green at each tag) - `v3-step4.1` (79/79) — **calls**: value/`VAR` params, function results, recursion, `FORWARD`, open-array `VAR` formals, int→real argument conversion; frames with entry copies and stack-slot locals; 233 `invalid call`. Two backend bugs fixed: nested-call state clobber (16-deep call stack) and uninitialized stack slots (zero-init locals). - `v3-step4.2` (82/82) — **nested procedures**: static-link display (`alloc8` link records, chain walking for up-level load/store/ address), lexical `ProcDepthOf`; bare `P;` parameterless calls. QBE can't nest definitions, so nested bodies hoist via per-nesting-depth buffers (`nestBufs`). - `v3-step4.3` (87/87) — **separate compilation**: single-image sessions (`lib.def lib.mod prog.mod` → one `.ssa`), module registry + scopes, `FROM`/`IMPORT`, qualified `L.x` via materialization, opaque `TYPE T;` completion, module `BEGIN` as `_init` called from `main`, whole-image buffering written under the program module's name. ## Locked decisions from this session (do not relitigate) - Whole-program single-image separate compilation (V1/V2 lineage), not per-file objects; program module is last in the session. - Unknown modules import as silent stubs; a known module's missing export is 201; a session with no program module is an error. - Opaque types complete via `SetTarget` on the definition's alias; clients use them behind pointers only. - Mangled symbols are `_` (uid per compilation); definitions and implementations agree because the implementation resumes the definition's proc node (`ResumeProc`). - `DISPOSE` nils and is shallow; nil-deref raw; classic idents. ## Step 4 deferred (carry forward) Strict 231 signature checking for impl-vs-def headings (arity is checked; parameter/result types are not), procedure-type variables and indirect calls, `HIGH`/`LEN`, variant records, import cycles, class lowering (vtable/`THIS`), enum literals, `F()^` result suffixes, >64 locals, recursive `DISPOSE`. ## Next: step 5 — Benjamin stdlib Per `docs/plan.md` and the Blaise map (`docs/blaise-phases-map.md`): `stdlib/` with classic `DEFINITION`/`IMPLEMENTATION` + `OPAQUE` forms (no R10 `INTERFACE`/blueprints/operator-procedures), semantics from `Benjamin/Actual/m2bsk-master/r10/stdlib/*.if`: `Strings`, `TextIO` (+ `UWrite*`), `WholeIO`, `Math`, `Files`, over `runtime/syslib` (`SysIO`/`Storage`). This is the first phase that exercises the new separate-compilation machinery with real libraries. ## Resume commands ```sh cd /home/eric/Projets/Projets-Modula2/MyWork/m2compiler-V3/compiler ./build.sh && ./run_tests.sh # expect 87/87, zero gm2 warnings ```