summary_session-2026-09-28c.md 3.2 KB

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

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

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.