فهرست منبع

feat(express): verify proc1/27/28; 21 procs exact, 2 near-exact accepted

Eric Streit 2 هفته پیش
والد
کامیت
63e6666f99
2فایلهای تغییر یافته به همراه29 افزوده شده و 4 حذف شده
  1. 11 0
      SESSION.md
  2. 18 4
      src/compiler/EXPRESS.MOD

+ 11 - 0
SESSION.md

@@ -277,3 +277,14 @@ Next: GENZ80 media hunt; stage-2 pty-driven MCD diff per module.
   issues, fast feedback). Full-MOD only for stub-tail prefix scoring
   (which also needs reorder + nesting pass first).
 - Tiny procs 23/24/25/26 bodies verified-compiling (ZZ); scoring next.
+- proc20 = 205/206 (one Borland-lax ADR(sel) delta: `load local address +5`
+  vs retail `load param3`; retail bans ADR on pointer-params; single-formal
+  cannot take both value (proc15) and address-of (proc20)). Accepted.
+- proc15 = 233/236 (temp-reserve prologue only). Both near-exact, explained.
+- Verified now 21: + proc1 CentralError (7/7), proc27 TypeKindOf (24/24,
+  CASE 98/97/94+ELSE), proc28 EmitAddress (52/52), proc23/24/25/26.
+  proc20 205/206 (ADR delta), proc15 233/236 (reserve delta) accepted.
+- Proc24 takes NodePtr (direct from d^.typ); CheckAndStore VALUE ADDRESS
+  (not VAR); VAR-ADDRESS accepts pointer vars/fields (not CARDINAL).
+  Value-record params pass by reference (single push) but copy on entry
+  (reserve_string) so not for no-copy procs. Transfers from records banned.

+ 18 - 4
src/compiler/EXPRESS.MOD

@@ -108,9 +108,9 @@ BEGIN
   IF NOT (12 IN Scanner.scanOpt) THEN Errors.AskContinue(v) END;
 END GetRangeBase;
 (* proc24 @0038 — kind-4 with word3 > 2. Name TBD (audit). *)
-PROCEDURE Proc24(t: RecordPtr): BOOLEAN;
+PROCEDURE Proc24(t: NodePtr): BOOLEAN;
 BEGIN
-  RETURN (t^.word4 = 4) AND (CARDINAL(t^.word3) > 2);
+  RETURN (t^.w4 = 4) AND (CARDINAL(t^.w3) > 2);
 END Proc24;
 (* proc26 @001a — kind-11 with word5 = CharType. *)
 PROCEDURE IsPointer(t: RecordPtr): BOOLEAN;
@@ -156,9 +156,23 @@ BEGIN HALT; END OpSetTest;
 (* proc29 @01eb stub — ~ParseActualList (0-arg; TBD by MCD audit). *)
 PROCEDURE ParseActualList;
 BEGIN HALT; END ParseActualList;
-(* proc28 @009e — ~EmitAddress (takes head). *)
+(* proc28 @009e — ~EmitAddress. *)
 PROCEDURE EmitAddress(d: HeadPtr);
-BEGIN HALT; END EmitAddress;
+VAR k: CARDINAL; (* local-2 *)
+BEGIN
+  IF d^.mode = 0 THEN
+    CodeGen.QueueConst(Scanner.StrLen(d^.value, 128) - 1);
+  ELSE
+    IF CARDINAL(d^.typ^.w2) = 0 THEN
+      k := d^.kind;
+      IF k = 5 THEN k := 0 END;
+      IF CARDINAL(d^.value) # 0 THEN k := 4 END;
+      CodeGen.SetPendingOp(1, k, CARDINAL(d^.value), d^.extra - 2);
+    ELSE
+      CodeGen.QueueConst(d^.typ^.w2^.high - d^.typ^.w2^.low);
+    END;
+  END;
+END EmitAddress;
 (* proc22 stub — ~CheckAndStore (VALUE ADDRESS: proc20 passes ADR(sel),
    proc15 passes curDesc pointer; TBD by MCD audit). *)
 PROCEDURE CheckAndStore(a: ADDRESS);