session-handoff-2026-10-01.md 5.0 KB

Session handoff — 2026-10-01 (end of day)

State: master at tag v3-wrap-modules (bdcefbb). Suite 177/177, fixpoint OK (2,899,706 bytes). Working tree clean except the user's compiler/toto.mod.

>>> NEXT SESSION: architectural work (decided) <<<

The single biggest blocker identified this session is the single-pass, no-AST frontend (declaration-before-use, emit-during- parse). It is the root cause of: text-patched forward variables, forward procedures needing a DEFINITION, set values in CONST, and the statement-context suffix difficulty.

Decided plan for tomorrow: options 1 and 2.

  1. Thin AST / two-phase parse for declarations — parse a unit's declarations fully into the symbol table before lowering any body, so forward references (variables, procedures, typed constants, CONST constructors) resolve naturally. This would delete the FwdPatchAll / placeholder / text-rewriting machinery.
  2. Interim discipline (cheaper, preserves no-AST) — keep no-AST, but finish the symbol table for a module before emitting any procedure body (extend the existing module-level FlushPend discipline to procedure bodies).

Suggested order: do 2 first as the structural stepping stone, then 1 if the goal is to compile gm2's corpus as-is. Ask/confirm the long-term target before committing to 1: "compile gm2 corpus as-is" (→ both) vs "clean classic Modula-2 that self-hosts" (→ neither is a blocker; forward references stay out of scope).

Work on a branch off v3-session-2026-10-01; run fixpoint.sh and run_tests.sh after every increment; revert the increment if either fails; commit only when both are green.

What landed today

Tag Commit What
(prev) 678f20e showcase21: expression result suffixes, coroutines, core library
v3-fwdvars-resultsfx a613e7b forward module-level variables, expression result suffixes, LongIO/LongWholeIO/DynamicStrings/SysStorage
v3-wrap-modules 05d9bd0 StdChans, TimeString, wrapclock, wraptime, wrapc
v3-wrap-modules bdcefbb showcase22 + docs/summary_wrap-modules.md

Docs: docs/language-report.md (feature set + gaps), docs/summary_fwdvars-resultsfx.md, docs/summary_wrap-modules.md.

The one blocked feature

ChanConsts and StreamFile are written and parked in docs/wip/ (not compiled into the tree). They are blocked by a single missing language feature:

Aggregate (set) values in CONST declarations. read = FlagSet{readFlag} — and even CONST b = BITSET{0} — is rejected with not supported yet.

Important precision: this is not a "typed set constructor" problem. T{…} constructors already work in expression/assignment position, including a := FSet{r} over an enum base. The gap is specifically that ConstDecl (compiler/src/M2.atg) accepts only ClArray/ClRecord/ClClass/ClStr/ClUStr as aggregate constants and has no set case; a set value has no single immediate operand.

Why it was not attempted

It touches the riskiest area of the frontend (M2.atg) across ConstDecl, TypedBraceLit/BraceElem and Design, plus new SymTab set-word storage and QbeGen set-constant materialisation — a multi-step change, each step needing the full build → suite → fixpoint loop. Today's session showed that grammar edits here can silently break self-hosting; doing it unreliably would risk the green state.

Suggested plan for next time (branch-first)

Work on a branch off bdcefbb; after every increment run ./bootstrap/fixpoint.sh and cd compiler && ./build.sh && ./run_tests.sh. Revert the increment (git checkout -- compiler/src) if either fails. Commit only when both are green.

Increments:

  1. SymTab: store a set constant's bit words per symbol (SetSymSet/GetSymSet), reusing SymNode.val or a small array.
  2. QbeGen: SetConstBegin/SetConstBit/SetConstEnd accumulating words, and SetConstLoad(name) materialising NewSetTemp + Zero + word stores at a use site.
  3. Grammar: a constCtx flag set in ConstDecl; in TypedBraceLit (set branch) accumulate words when constCtx; ConstDecl stores them; Design's KindConst + ClSet calls SetConstLoad.
  4. Activate docs/wip/chanconsts.* and docs/wip/streamfile.* (move back to stdlib/), add them to run_tests.sh, and add a wrapflags.mod test.

Other open items (see docs/language-report.md §9)

  • GOTO/labels.
  • Generics.
  • Statement-context result suffixes (F()[i] := x).
  • Multiple inheritance (deliberate).
  • Full forward variables: module scope only (done); forward procedure references rely on the DEFINITION being present.
  • BITSET is not accepted as a function-result type (hence wrapc.ReadOnly/WriteOnly return CARDINAL).

Resume

cd ~/Projets/Projets-Modula2/MyWork/m2compiler-V3
./bootstrap/fixpoint.sh                       # FIXPOINT OK
cd compiler && ./build.sh && ./run_tests.sh   # 177/177