Parcourir la source

docs: session summary 2026-09-28 (c) — variant records, UString, IOChan/Files

Consolidates v3-variant-records, v3-ustring-files and v3-showcase16:
135/135, fixpoint OK (2,142,363 bytes). Tables each step's tag and
commit; notes layout/semantics, deviations and remaining polish.
Eric Streit il y a 1 semaine
Parent
commit
b95b863785
1 fichiers modifiés avec 93 ajouts et 0 suppressions
  1. 93 0
      docs/summary_session-2026-09-28c.md

+ 93 - 0
docs/summary_session-2026-09-28c.md

@@ -0,0 +1,93 @@
+# Session summary — 2026-09-28 (c): variant records, UString, IOChan/Files
+
+Suite **135/135**; self-hosting fixpoint **OK**
+(`bootstrap/fixpoint.sh`, image **2,142,363 bytes**). `master`, tree
+clean except the user's uncommitted `compiler/toto.mod`.
+
+This session landed the three items left open at the previous save,
+then showcased them.
+
+## Steps, tags and headline commits
+
+| Step | Tag | Commit | What |
+| --- | --- | --- | --- |
+| Variant records | `v3-variant-records` | `252d7dd` | `RECORD … ; CASE tag : T OF … END` |
+| UString + Files | `v3-ustring-files` | `36e8dcf` | `a := U"…"` content copy; `Files` on `IOChan` |
+| Showcase | `v3-showcase16` | `36e8dcf` | the three features in one program |
+
+## 1. Variant records
+
+```modula-2
+Shape = RECORD
+  id : INTEGER;
+  CASE k : Kind OF
+    circle : radius : INTEGER;
+  | square : side : INTEGER;
+  | rect   : w, h : INTEGER;
+  END;
+END
+```
+
+- Grammar stays LL(1): a variant part starts with the `CASE` keyword,
+  so `RecItem` is unambiguously `RecField | CaseField`. Labels are
+  parsed but not interpreted; a non-ordinal tag is error **224**.
+- Layout: fields declared before the tag pack normally, the tag takes
+  the next slot, and **every** branch field overlays in the region
+  after it. Size = plain + tag + max(branch fields).
+- `SymTab`: `SetVariantTag`/`MarkVariant`/`IsVariant`/`ResetFields`/
+  `IsOrdinal`; `ComputeOffsets` and `TypeSizeD` handle the overlay.
+- Whole-record equality/assignment for a variant record is not
+  offered (overlapping storage); the existing strictness gives 213.
+- `WITH` over variant fields works (verified).
+- Docs: `summary_variant-records.md`.
+
+## 2. UString whole-string assignment
+
+- `a := U"…"` into a 1-D `ARRAY OF UCHAR` is a **content copy**
+  (count-clamped, `0` terminator), mirroring `CHAR` strings.
+- `SymTab.IsUCharArray`, `QbeGen.UAssign`, shim `m2uassign`.
+  The descriptor is `{ l count, w codepoints… }`, so the body copies
+  32-bit elements off a 64-bit header.
+- `UCHAR` arrays now reserve a terminator slot (`z (n+1)*4`), heap
+  allocation and bounds checks included.
+- A `U"…"` literal and a `UCHAR` array both pass to an open
+  `VAR ARRAY OF UCHAR` formal.
+- Docs: `summary_ustring-files.md`.
+
+## 3. Files layered on IOChan
+
+- `IOChan` gained `Handle(cid): ADDRESS` / `MakeChan(h): ChanId` so a
+  library can wrap a channel.
+- `Files.FileRec` holds an `IOChan.ChanId`; **all** I/O delegates to
+  `IOChan`, with `NIL` guards. `Files` gained `ReadString` (one line).
+- The public `Files` API is unchanged apart from that addition.
+
+## 4. Showcase
+
+`compiler/tests/showcase16.mod` (`Showcase16`, exit 42): a `Shape`
+variant record, a `U"ok✓"` content copy, and a write/read round-trip
+through a `Files` handle.
+
+```
+showcase16: id=3 total=42
+```
+
+## Tests (135, was 132)
+
+New: `t_variant` (31), `t_ustrassign` (63), `t_ustrformal` (3),
+`Showcase16` (42). `FilesProg`/`TBadFile`/`MixProg`/`Showcase11` file
+lists now include `SysShim` + `IOChan`.
+
+## Resume
+
+```sh
+cd .../m2compiler-V3
+./bootstrap/fixpoint.sh                       # FIXPOINT OK
+cd compiler && ./build.sh && ./run_tests.sh   # 135/135
+```
+
+## Remaining polish
+
+- Clarion `CLASS` lowering (declared + checked only).
+- `IOChan` position/seek; ISO `ConvResults` enumerations (now
+  expressible); UString concatenation/`Length`.