Allow more procedure parameters
authorceriel <none@none>
Thu, 9 Nov 1989 11:04:18 +0000 (11:04 +0000)
committerceriel <none@none>
Thu, 9 Nov 1989 11:04:18 +0000 (11:04 +0000)
mach/proto/ncg/codegen.c
util/ncgg/cgg.y
util/ncgg/extern.h
util/ncgg/output.c
util/ncgg/param.h
util/ncgg/var.c

index 6e89de0..4553613 100644 (file)
@@ -57,7 +57,7 @@ unsigned codegen(codep,ply,toplevel,costlimit,forced) byte *codep; unsigned cost
 #endif
        unsigned totalcost = 0;
        int inscoerc=0;
-       int procarg[2];
+       int procarg[MAXPROCARG];
 #ifdef ALLOW_NEXTEM
        static int paniced;
        char *savebp = 0;
@@ -149,9 +149,13 @@ unsigned codegen(codep,ply,toplevel,costlimit,forced) byte *codep; unsigned cost
 #endif
                n = *bp++;
                if (n==0) {     /* "procedure" */
+                       int j, nargs;
                        getint(i,bp);
-                       getint(procarg[0],bp);
-                       getint(procarg[1],bp);
+                       getint(nargs,bp);
+                       assert(nargs < MAXPROCARGS);
+                       for (j = 0; j < nargs; j++) {
+                               getint(procarg[j],bp);
+                       }
                        bp= &pattern[i];
                        n = *bp++;
                        DEBUG("PROC_CALL");
@@ -677,7 +681,7 @@ normalfailed:       if (stackpad!=tokpatlen) {
        if (toplevel) {
                swtxt();
                if (stringno>10000) {
-                       assert(stringno== 10001 || stringno== 10002);
+                       assert(stringno < 100001 + MAXPROCARG);
                        genstr(procarg[stringno-10001]);
                } else
                        genstr(stringno);
index 0fea969..b51a49b 100644 (file)
@@ -98,7 +98,7 @@ iocc_t iops[20];
 %type <yy_str> opt_par_string optstring
 %type <yy_int> register propno att_list_el_type tokenset_no
 %type <yy_int> adornlist optstar optuses optregvar regvartype optregvartype
-%type <yy_int> emarg tokarg subreg allreg optsecondstring
+%type <yy_int> emarg tokarg subreg allreg
 %type <yy_expr> expr regvarexpr
 %type <yy_iocc> tokeninstance
 %type <yy_int> optexpr optexact optstack
@@ -671,22 +671,23 @@ patterns
                  if (npatterns>maxrule)
                        maxrule=npatterns;
                }
-       | CALL IDENT '(' STRING optsecondstring ')'
+       | CALL IDENT '(' stringlist ')'
                { register symbol *sy_p;
                  saferulefound=1;
                  sy_p=lookup($2,symproc,mustexist);
                  callproc=sy_p->sy_value.syv_procoff;
-                 procarg[0] = strlookup($4);
-                 procarg[1] = $5;
                  free($2);
-                 free($4);
+                 if (nprocargs > maxprocargs) maxprocargs = nprocargs;
                }
        ;
-optsecondstring
-       : /* empty */
-               { $$ = 0; }
-       | ',' STRING
-               { $$ = strlookup($2); free($2); }
+
+stringlist
+       : STRING
+               { nprocargs = 1; procarg[0] = strlookup($1); free($1); }
+       | stringlist ',' STRING
+               { NEXT(nprocargs, MAXPROCARG, "Procedure argument list");
+                 procarg[nprocargs-1] = strlookup($3); free($3);
+               }
        ;
 
 onepattern
index 9e80551..3620ebd 100644 (file)
@@ -30,11 +30,12 @@ extern int cursetno;
 extern int allsetno;
 extern int inproc;
 extern int callproc;
-extern int procarg[2];
+extern int procarg[];
 extern int fc1,fc2,fc3,fc4;
 extern int maxmembers;
 extern int regclass;
 extern int maxtokensize;
+extern int nprocargs, maxprocargs;
 
 extern char *mystrcpy();
 extern char *myalloc();
index 7fc8396..97c5b82 100644 (file)
@@ -184,8 +184,8 @@ outpatterns() {
        } else {
                patbyte(0);
                pat(callproc);
-               pat(procarg[0]);
-               pat(procarg[1]);
+               pat(nprocargs);
+               for (i = 0; i < nprocargs; i++) pat(procarg[i]);
        }
 }
 
@@ -585,6 +585,7 @@ outdefs() {
        cdef("MAXPATLEN",maxtokpatlen);
        cdef("MAXREPLLEN",maxtokrepllen);
        cdef("MAXEMREPLLEN",maxemrepllen);
+       cdef("MAXPROCARG",maxprocargs);
        cdef("MAXRULE",maxrule<16 ? 16 : maxrule);
        if (nsplit>0) {
                cdef("MAXSPLIT",maxsplit);
index 50ab657..a82e5c2 100644 (file)
@@ -36,6 +36,7 @@
 #define MAXPATBYTES BORS(14000,7000)
 #define MAXREGVAR 10
 #define MAXSOURCELINES 6000
+#define MAXPROCARG 10
 
 /* end of tunable constants */
 
index 9a7a630..1e0bfce 100644 (file)
@@ -33,7 +33,6 @@ int cursetno = -1;
 int allsetno;
 int inproc=0;  /* scanning "procedure" */
 int callproc=0;
-int procarg[2];
 int fc1=1,fc2=1,fc3=1,fc4=1;
 int maxmembers=0;
 int regclass=1;
@@ -42,6 +41,8 @@ int rvused=0;
 int nregvar[4];
 int rvsize[4];
 int rvnumbers[4][MAXREGVAR];
+int procarg[MAXPROCARG];
+int maxprocargs, nprocargs;
 
 reginfo l_regs[MAXREGS];
 propinfo l_props[MAXPROPS];