Browse Source

feat(express): verify proc27 exact (CASE 98/97/94 + ELSE, w3-DIV)

Eric Streit 2 tuần trước cách đây
mục cha
commit
8e6dc9445f
1 tập tin đã thay đổi với 24 bổ sung và 12 xóa
  1. 24 12
      src/compiler/EXPRESS.MOD

+ 24 - 12
src/compiler/EXPRESS.MOD

@@ -28,7 +28,7 @@
      Scanner.word13: unknown, kept + FIXME.
    - CodeGen.word5 = emitEnabled. Doubles.qcp/6/7/8/9/11 =
      qcp/qadd/qsub/qmul/qdiv/qneg (DEF order = proc order).
-   - Single-arg BaseTypeOf(X) calls = TypeKindOf (proc27); two-arg keeps
+   - Single-arg BaseTypeOf(X) calls = TypeKindOf() (proc27); two-arg keeps
      BaseTypeOf (proc34). ParseCondValue() = BoolCondHelper (proc12).
    - Errors.ReportErrorWithText 3rd args were HIGH() bounds — stripped.
 
@@ -118,7 +118,14 @@ BEGIN
   RETURN (t^.word4 = 11) AND (CARDINAL(t^.word5) = CARDINAL(Compiler.CharType));
 END IsPointer;
 PROCEDURE TypeKindOf(): CARDINAL;
-BEGIN HALT; END TypeKindOf;
+BEGIN
+  CASE curDesc^.typ^.w4 OF
+    98: RETURN (CARDINAL(curDesc^.typ^.w3) DIV 2) + 1;
+  | 97: RETURN 2;
+  | 94: RETURN 4;
+  ELSE RETURN ORD(RecordPtr(curDesc^.typ) = Compiler.IntType);
+  END;
+END TypeKindOf;
 (* proc23 @002a stub — ~LookupField (tiny predicate; TBD by MCD audit). *)
 (* proc23 @002a — field-selector test. FIXME: word2 =0 shape TBD by score. *)
 PROCEDURE LookupField(t: RecordPtr): BOOLEAN;
@@ -126,13 +133,18 @@ BEGIN
   RETURN (t^.word4 = 11) AND (CARDINAL(t^.word2) = 0);
 END LookupField;
 (* DEF-export stubs (signatures exact per DEF; bodies TBD by MCD audit). *)
+(* proc1 @0001 — central error: report code unless ok. *)
 PROCEDURE CentralError(ok: BOOLEAN; code: CARDINAL);
-BEGIN HALT; END CentralError;
+BEGIN
+  IF NOT ok THEN Errors.ReportError(code) END;
+END CentralError;
 PROCEDURE EmitOp(subOp, typeKind: CARDINAL);
 BEGIN HALT; END EmitOp;
-(* proc6 @0047 stub — 0-arg curDesc helper (name TBD by MCD audit). *)
+(* proc6 @0047 — unwrap typ to typ^.w2 when kind=1. Name TBD (audit). *)
 PROCEDURE Proc6;
-BEGIN HALT; END Proc6;
+BEGIN
+  IF curDesc^.typ^.w4 = 1 THEN curDesc^.typ := NodePtr(curDesc^.typ^.w2) END;
+END Proc6;
 PROCEDURE NormalizeOperand(d: HeadPtr);
 BEGIN HALT; END NormalizeOperand;
 PROCEDURE LoadIndirect(d: HeadPtr);
@@ -692,8 +704,8 @@ BEGIN HALT; END ParseTypeCast; (* TEMP-STUB: uplevel proc40 frame; audit later *
 PROCEDURE ExpandStdProc43(code: CARDINAL);
 VAR buf: ARRAY [0..3] OF WORD; tmp: ARRAY [0..1] OF WORD; k, i: CARDINAL;
 BEGIN
-  k := TypeKindOf; (*{0adf} local proc27 *)
-  k := TypeKindOf; (*{0889-088a} local proc27 *)
+  k := TypeKindOf(); (*{0adf} local proc27 *)
+  k := TypeKindOf(); (*{0889-088a} local proc27 *)
   IF k <= 1 THEN (*{088b-088d} short ordinal: bias into const *)
     CodeGen.QueueConst(code-k*32768); RETURN; (*{088f-0896}*)
   END;
@@ -810,7 +822,7 @@ BEGIN
         CASE t3 OF (*{0a9c,0b79} switch 90..105 *)
           90..95:
               ParseExpression; Proc6; (*FIXME-PROC6*) (*{0aa1} proc12/6 *)
-              k := TypeKindOf; (*{0aa1-0aa3} local proc27 *)
+              k := TypeKindOf(); (*{0aa1-0aa3} local proc27 *)
               IF ~ MatchOpClass(388, t2) THEN (*{0aa4-0aa8}*) END;
               IF t3 # 4 THEN CodeGen.EmitTypedOp(13+t3, k); (*{0aac-0ab2}*)
               ELSE
@@ -1143,7 +1155,7 @@ BEGIN
   EmitOp(); (* proc6 *) (*{0ed4}*)
   MatchOpClass(rkind, op); (* proc9 *) (*{0ed5-0ed7}*)
   FoldConstOp(buf); (* proc35 FIXME: kind result TBD *) (*{0ed8-0ed9}*)
-  rkind := TypeKindOf; (* proc27 FIXME: 0-arg vs use *) (*{0edb}*)
+  rkind := TypeKindOf(); (* proc27 FIXME: 0-arg vs use *) (*{0edb}*)
   IF op = 63 THEN op := 61 END; (*{0ede-0ee2}*)
   IF (curDesc^.mode = 0) AND (buf.raw[1] = 0) THEN (*{0ee7-0eef} both const *)
     CodeGen.DiscardPending; (*{0ef2}*)
@@ -1201,7 +1213,7 @@ BEGIN
       EmitRangeCheck; (* nested proc49 *) (*{1038}*)
       EmitOp(); (* proc6 *) (*{103a}*)
       MatchOpClass(388, 59); (* proc9 *) (*{103b-1040}*)
-      t := TypeKindOf; (* proc27 FIXME: 0-arg; t role TBD *) (*{1041-1043}*)
+      t := TypeKindOf(); (* proc27 FIXME: 0-arg; t role TBD *) (*{1041-1043}*)
       IF t = NIL THEN t := Compiler.CardType; ConstToCard(t, 59); END; (*{1044-104c} FIXME *)
       IF curDesc^.mode = 0 THEN (* const negation *) (*{104d-1050}*)
         CodeGen.DiscardPending; (*{1052}*)
@@ -1258,7 +1270,7 @@ BEGIN
       EmitOp(); (* proc6 *) (*{1118}*)
       MatchOpClass(404, op); (* proc9 *) (*{1119-111e}*)
       FoldConstOp(buf); (* proc35 FIXME: kind result TBD *) (*{111f}*)
-      t := TypeKindOf; (* proc27 FIXME *) (*{1121}*)
+      t := TypeKindOf(); (* proc27 FIXME *) (*{1121}*)
       IF (curDesc^.mode = 0) AND (buf.raw[1] = 0) THEN (*{1124-112c}*)
         CodeGen.DiscardPending; (*{112e}*)
         CodeGen.DiscardPending; (*{1130}*)
@@ -1353,7 +1365,7 @@ BEGIN
     EmitOp(); (* proc6 *) (*{12c8}*)
     MatchOpClass(cls, op); (* proc9 *) (*{12c9-12cb}*)
     FoldConstOp(buf); (* proc35 *) (*{12cc-12cd}*)
-    rkind := TypeKindOf; (* proc27 FIXME *) (*{12cf-12d1}*)
+    rkind := TypeKindOf(); (* proc27 FIXME *) (*{12cf-12d1}*)
     IF (curDesc^.mode = 0) AND (buf.raw[1] = 0) THEN (*{12d2-12da}*)
       CodeGen.DiscardPending; (*{12dc}*)
       CodeGen.DiscardPending; (*{12de}*)