Sfoglia il codice sorgente

lower L5 (params): aggregate formals, value open arrays

- CanProc now accepts aggregate parameter types (CanType) rather than
  scalars only.
- FuncParam mirrors the grammar's value-open-array rule: pass by
  descriptor address (isV OR IsOpenArray(t)), so a value ARRAY OF T
  formal does not copy.

t_lower5arr (VAR open array, value open array, VAR record) byte-matches.
Suite 191/191; FIXPOINT OK (stage2 == stage3, 3,304,549 bytes).
Eric Streit 6 giorni fa
parent
commit
0b22c8a93f
3 ha cambiato i file con 34 aggiunte e 2 eliminazioni
  1. 1 0
      compiler/run_tests.sh
  2. 2 2
      compiler/src/Lower.mod
  3. 31 0
      compiler/tests/t_lower5arr.mod

+ 1 - 0
compiler/run_tests.sh

@@ -473,6 +473,7 @@ lower_ok t_lower4.mod
 lower_ok t_lower4case.mod
 lower_ok t_lower4case.mod
 lower_ok t_lower4with.mod
 lower_ok t_lower4with.mod
 lower_ok t_lower5.mod
 lower_ok t_lower5.mod
+lower_ok t_lower5arr.mod
 lower_ok t_lower5lit.mod
 lower_ok t_lower5lit.mod
 lower_ok t_lower5set.mod
 lower_ok t_lower5set.mod
 
 

+ 2 - 2
compiler/src/Lower.mod

@@ -600,7 +600,7 @@ PROCEDURE CanProc (proc: AST.Node): BOOLEAN;
     i := 0;
     i := 0;
     WHILE i < np DO
     WHILE i < np DO
       IF NOT ParamInfo(nm, i, t, isV, pn) THEN RETURN FALSE END;
       IF NOT ParamInfo(nm, i, t, isV, pn) THEN RETURN FALSE END;
-      IF NOT IsScalarClass(SymTab.ClassOf(t)) THEN RETURN FALSE END;
+      IF NOT CanType(t) THEN RETURN FALSE END;
       INC(i)
       INC(i)
     END;
     END;
     RETURN CanDecls(AST.Child(proc, 2)) AND CanStmt(AST.Child(proc, 1))
     RETURN CanDecls(AST.Child(proc, 2)) AND CanStmt(AST.Child(proc, 1))
@@ -1367,7 +1367,7 @@ PROCEDURE LowerDecls (seq: AST.Node);
         j := 0;
         j := 0;
         WHILE j < np DO
         WHILE j < np DO
           IF NOT ParamInfo(nm, j, pt, pv, txt) THEN END;
           IF NOT ParamInfo(nm, j, pt, pv, txt) THEN END;
-          IF NOT QbeGen.FuncParam(txt, pv, pt) THEN END;
+          IF NOT QbeGen.FuncParam(txt, pv OR SymTab.IsOpenArray(pt), pt) THEN END;
           INC(j)
           INC(j)
         END;
         END;
         QbeGen.SetFuncRes(res);
         QbeGen.SetFuncRes(res);

+ 31 - 0
compiler/tests/t_lower5arr.mod

@@ -0,0 +1,31 @@
+MODULE TLower5Arr;
+(* Lower slice L5: open-array (VAR and value) and VAR record parameters.
+   Exit 42. *)
+TYPE
+  Vec = ARRAY [0..3] OF INTEGER;
+  Rec = RECORD a, b : INTEGER; END;
+VAR
+  v : Vec;
+  r : Rec;
+  i, ExitCode : INTEGER;
+
+PROCEDURE Sum (VAR a : ARRAY OF INTEGER; n : INTEGER) : INTEGER;
+  VAR k, s : INTEGER;
+  BEGIN
+    k := 0; s := 0;
+    WHILE k < n DO s := s + a[k]; INC(k) END;
+    RETURN s
+  END Sum;
+
+PROCEDURE First (a : ARRAY OF INTEGER) : INTEGER;
+  BEGIN RETURN a[0] END First;
+
+PROCEDURE SetB (VAR x : Rec);
+  BEGIN x.b := 5 END SetB;
+
+BEGIN
+  v[0] := 10; v[1] := 11; v[2] := 12; v[3] := 13;
+  SetB(r);
+  i := Sum(v, 4) + First(v) + r.b;
+  ExitCode := i - 19
+END TLower5Arr.