|
|
@@ -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`.
|