Переглянути джерело

feat(errors): ERRORS.MOD compiles on v1.00, 28/30 mnemonic-identical

Heap cliff fixed by dropping unused Compiler/ComLine/Editor imports
(SYM weight, not source size). Ground-truth fixes from orig ERRORS.MCD:
EditPos module (editPos/editOk) replaces Editor fiction; Editor.Edit is
Loader.Call('EDITERR') overlay load; TruncateScopeStack uses
SymTab.scopeChain (word8); SYMTAB.proc7=RestoreAfterEdit confirmed.
v1.00 retail is stricter than Borland's internal compiler (ADDRESS vs
Identifier nominal checks, CARDINAL/CHAR mixing) - adapted with zero-cost
CHR(ORD())/ORD()/CHR() no-ops, U1-U4 probe-proven identical codegen.
keyHash DEF is (ADDRESS,CHAR): 2nd param matches original textually.
New EDITPOS.DEF. Remaining diffs: proc5 FindFileOnDrives (FATDIR vs
Files.Open clean-room) and 4-op proc0 epilogue scatter.
Eric Streit 4 днів тому
батько
коміт
59e438ed44

+ 7 - 0
src/compiler/EDITPOS.DEF

@@ -0,0 +1,7 @@
+(* Renamed for readability (editOk was global17). Semantics unchanged.
+   Original: DEFINITION MODULE EditPos; VAR editPos: CARDINAL;
+   global17: BOOLEAN; END EditPos. (SYSTEM.DIR/EDITPOS.DEF) *)
+DEFINITION MODULE EditPos;
+VAR editPos: CARDINAL;
+    editOk: BOOLEAN;
+END EditPos.

+ 16 - 17
src/compiler/ERRORS.MOD

@@ -1,7 +1,7 @@
 (* Renamed for readability. Semantics unchanged. Original identifiers: see docs/compiler/ + src/compiler/RENAME-MAP.md. *)
 IMPLEMENTATION MODULE Errors;
-IMPORT Compiler, Scanner, Files, ComLine, Texts, Terminal, Loader, Editor, SymTab, CodeGen;
-FROM SYSTEM  IMPORT MOVE, ADR, BYTE;
+IMPORT Scanner, Files, Texts, Terminal, Loader, SymTab, EditPos, CodeGen; (* Compiler/ComLine dropped: unused (original keeps them as dep-only slots; every SYM costs heap) *)
+FROM SYSTEM  IMPORT MOVE, ADR, BYTE, WORD;
 FROM STORAGE IMPORT MARK, RELEASE;
 
 CONST LF = 12C; CR = 15C; EOF = 32C; DEL = 177C;
@@ -119,20 +119,19 @@ BEGIN
     freeRoom := ADR(backupName) - moveSize;
     IF editBufSize > freeRoom THEN
       spillSize := editBufSize - freeRoom;
-      backupName := "@:CBACKUP.$$$";
-      backupName[0] := ComLine.inName[0];
+      backupName := "CBACKUP.$$$"; (* original has no drive-letter patch (012b: 11-char literal, no COMLINE ref) *)
       Files.Create(backupFile, backupName);
       Files.WriteBytes(backupFile, moveSize-spillSize, spillSize);
       Files.SetPos(backupFile, LONG(0));
       Scanner.CheckStk(moveSize - spillSize);
     END; (* 018a *)
-    Editor.editPosition := Scanner.tokPos;
-    Editor.Edit;
-    savedEditPos := Editor.editPosition;
+    EditPos.editPos := Scanner.tokPos;
+    Loader.Call("EDITERR");
+    savedEditPos := EditPos.editPos;
     IF editBufSize > freeRoom THEN
       Scanner.CheckStk(moveSize);
       IF Files.ReadBytes(backupFile, moveSize-spillSize, spillSize)<>spillSize THEN
-        Editor.editOkFlag := FALSE
+        EditPos.editOk := FALSE
       END;
       Files.Delete(backupFile);
     END; (* 01B2 *)
@@ -140,7 +139,7 @@ BEGIN
     heap := savedStack + 60;
     savedStack^ := FREEMARKER;
     mainModule := savedModList;
-    IF Editor.editOkFlag THEN
+    IF EditPos.editOk THEN
       IF doSymtabRollback THEN SymTab.RestoreAfterEdit END;
       RAISE usererror
     END;
@@ -164,11 +163,11 @@ BEGIN
   slot := 0;
   topSlot := 16;
   WHILE slot <= topSlot DO
-    entry := SymTab.rollbackStack^[slot];
+    entry := SymTab.scopeChain^[slot];
     WHILE (entry <> NIL) AND (cutAddr <= ADDRESS(entry)) DO
       entry := entry^.link0
     END;
-    SymTab.rollbackStack^[slot] := entry;
+    SymTab.scopeChain^[slot] := entry;
     INC(slot);
   END;
 END TruncateScopeStack;
@@ -251,9 +250,9 @@ END WriteTypeOfSymbol;
 PROCEDURE WriteSymbolToken(mode: CHAR);
 VAR ch: CHAR;
 VAR idx: CARDINAL;
-VAR idBuf: Scanner.Identifier;
+VAR idBuf: Scanner.Identifier; (* nominal type required: v1.00 checks proc-var array args nominally; original passes idBuf directly (0390: load dword27 + eb) *)
 BEGIN
-  idx := Scanner.keyHash(idBuf, mode);
+  idx := Scanner.keyHash(ADR(idBuf), mode); (* original passes idBuf directly to (Identifier,CHAR); v1.00 retail rejects Buf/ADDRESS-vs-Identifier nominally (T2/T4 probes) though codegen is identical (U1/U2) — ADR() adaptation *)
   IF idx # 0 THEN WriteString(idBuf)
   ELSE
     Terminal.WriteChar('"');
@@ -267,7 +266,7 @@ BEGIN
         Terminal.WriteChar(listPipeChar);
       ELSE
         ch := '!';
-        WHILE (ch < DEL) AND (Scanner.charClas^[ORD(ch)] # mode) DO INC(ch) END;
+        WHILE (ch < DEL) AND (Scanner.charClas^[ORD(ch)] # ORD(mode)) DO INC(ch) END; (* ORD(mode): zero-cost; table elements are CARDINAL-typed *)
         IF ch < DEL THEN Terminal.WriteChar(ch) END;
       END; (* 0433 *)
     END; (* 0433 *)
@@ -277,12 +276,12 @@ END WriteSymbolToken;
 
 PROCEDURE WriteFoundToken;
 BEGIN
-  IF Scanner.curSym = 0C THEN
+  IF Scanner.curSym = 0 THEN (* 0C spelled 0: original emits unary eq0 (040d), i.e. CARDINAL comparison; same value *)
     IF Scanner.isLit THEN WriteString('literal "') ELSE WriteString('identifier "') END;
     WriteString(Scanner.tokBuf);
     Terminal.WriteChar('"');
   ELSE
-    WriteSymbolToken(Scanner.curSym)
+    WriteSymbolToken(CHR(Scanner.curSym))
   END; (* 046E *)
   WriteString(" found")
 END WriteFoundToken;
@@ -483,7 +482,7 @@ BEGIN
       IF 4 IN want    THEN WriteString(" or Set") END;
       WriteString(" Type");
       IF NOT( {7,8} - want = {} ) THEN 
-        WriteString(",exluding");
+        WriteString(",excluding");
         IF NOT( 7 IN want ) THEN WriteString(" LONGINT and") END;
         WriteString(" REAL,");
       END; (* 085b *)

+ 3 - 3
src/compiler/SCANNER.DEF

@@ -14,9 +14,9 @@ FROM SymTab   IMPORT T1, StringPtr;
 TYPE Ext = ARRAY [0..2] OF CHAR;
      T = POINTER TO ARRAY [0..6] OF WORD;
      Buf = ARRAY [0..128] OF CHAR;
-(*
      Identifier = ARRAY [0..14] OF CHAR;
-     StringPtr  = POINTER TO Identifier;
+(*
+      StringPtr  = POINTER TO Identifier;
 *)
      List = POINTER TO ListDesc;
      ListDesc = RECORD first: T1; ident: StringPtr END;
@@ -43,7 +43,7 @@ VAR
     charClas: POINTER TO ARRAY [0..255] OF TypeOfChar;
     tokPos: CARDINAL;
     tokCol: CARDINAL;
-    keyHash: PROCEDURE(ADDRESS, BOOLEAN):CARDINAL;
+    keyHash: PROCEDURE(ADDRESS, CHAR):CARDINAL; (* original: PROCEDURE(Identifier, CHAR); ADDRESS pushes identically (U1/U2 probes) and satisfies v1.00's nominal array check, which rejects Buf-vs-Identifier *)
 
 PROCEDURE GetSym;
 PROCEDURE NextCh;

+ 1 - 1
src/compiler/SCANNER.MOD

@@ -509,7 +509,7 @@ BEGIN
   REPEAT
     IF ScanNext() THEN
       ignCase := 9 IN scanOpt;
-      curSym := keyHash(ADR(tokBuf), ignCase);
+      curSym := keyHash(ADR(tokBuf), CHR(ORD(ignCase))); (* CHR(ORD()) is zero-cost (V3 probe) and value-preserving; satisfies CHAR formal *)
       IF curSym # 0 THEN
         identKd := 7;
         IF ((curSym = 14) OR (curSym = 39)) AND NOT (12 IN scanOpt) THEN