Parcourir la source

feat(express): verify proc4 exact; CentralError range guards, NodePtr(src)

Eric Streit il y a 2 semaines
Parent
commit
10cacb1a87
2 fichiers modifiés avec 15 ajouts et 12 suppressions
  1. 3 0
      SESSION.md
  2. 12 12
      src/compiler/EXPRESS.MOD

+ 3 - 0
SESSION.md

@@ -303,3 +303,6 @@ Next: GENZ80 media hunt; stage-2 pty-driven MCD diff per module.
   (value+extra overlay lv LONGINT for QueueLongConst dword-load; layout
   unchanged, re-scored proc28 52/52 to prove byte-neutrality). ORD()+const
   gives `add N` peephole; (A OR B) AND C parens reproduce orjp/andjp.
+- Verified now 28: + proc4 PushExprDesc (57/57). CentralError(ok,code) with
+  range guards (>=384/<=510); plain +/- (not INC/DEC); dst^.typ := NodePtr(src)
+  (raw pointer store, free transfer — NOT src^.typ).

+ 12 - 12
src/compiler/EXPRESS.MOD

@@ -251,28 +251,28 @@ END CheckAndStore;
 PROCEDURE PushExprDesc(dst: HeadPtr; src: DescPtr);
 VAR aligned: CARDINAL; (* local word-2 *)
 BEGIN
-  (*{004a}*) (* aligned := (src^.extra + 1) DIV 2 * 2 *)
+  (*{02a2}*) (* aligned := (src^.extra + 1) DIV 2 * 2 *)
   aligned := (src^.extra + 1) DIV 2 * 2;
-  (*{0054}*) (* if temp mark held, reserve space, check against SymTab pool *)
+  (*{02ac}*) (* if temp mark held, give back space, floor-check 81 *)
   IF spillFlag <> 0 THEN
-    DEC(spillTop, aligned);
+    spillTop := spillTop - aligned;
     IF spillTop < SymTab.stringPoolPtr THEN
-      Errors.ReportError(81);
+      CentralError(spillTop >= 384, 81);
+      SymTab.stringPoolPtr := spillTop;
     END;
-    spillTop := SymTab.stringPoolPtr; (* sync mark: 006a..006b *)
   END;
-  (*{006d}*) (* init new descriptor *)
+  (*{02c5}*) (* init new descriptor *)
   dst^.mode := 1;
-  IF spillFlag = 0 THEN dst^.kind := 0 ELSE dst^.kind := dst^.kind END;
+  dst^.kind := ORD(spillFlag = 0);
   dst^.extra := spillTop;
-  dst^.typ := src^.typ;
-  (*{007e}*) (* if fresh mark, claim space, overflow check 83 *)
+  dst^.typ := NodePtr(src);
+  (*{02d2}*) (* if fresh mark, claim space, ceiling-check 83 *)
   IF spillFlag = 0 THEN
-    INC(spillTop, aligned);
+    spillTop := spillTop + aligned;
     IF spillTop > SymTab.stringPoolPtr THEN
-      Errors.ReportError(83);
+      CentralError(spillTop <= 510, 83);
+      SymTab.stringPoolPtr := spillTop;
     END;
-    spillTop := SymTab.stringPoolPtr;
   END;
 END PushExprDesc;