Преглед изворни кода

docs: session save 2026-09-22 — step 4 complete (calls, nesting, separate compilation)

Eric Streit пре 2 недеља
родитељ
комит
17e5733130
1 измењених фајлова са 68 додато и 0 уклоњено
  1. 68 0
      docs/session-2026-09-22-step4.md

+ 68 - 0
docs/session-2026-09-22-step4.md

@@ -0,0 +1,68 @@
+# 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 `<Prog>.ssa`),
+  module registry + scopes, `FROM`/`IMPORT`, qualified `L.x` via
+  materialization, opaque `TYPE T;` completion, module `BEGIN` as
+  `<mod>_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 `<proc>_<uid>` (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
+```