codea: parameteranzahl wird durchgereicht und ggf. geprueft wenn die eingabe nicht...
authorBernhard Urban <lewurm@gmail.com>
Tue, 4 May 2010 23:51:59 +0000 (01:51 +0200)
committerBernhard Urban <lewurm@gmail.com>
Tue, 4 May 2010 23:51:59 +0000 (01:51 +0200)
codea/chelper.c
codea/chelper.h
codea/parser.y
codea/symtable.c

index 9f5032cd500af79944678cc986a063f740271458..1014a7184fe710fbeeac0a4c3febbe4ca327ab71 100644 (file)
@@ -1,9 +1,10 @@
 #include <stdio.h>
 #include <string.h>
+#include <stdlib.h>
 #include "chelper.h"
 #include "tree.h"
 
-#if 0
+#if 1
 #define DDCHELP
 #endif
 
@@ -36,14 +37,12 @@ void ret(void)
        printf("\tret\n");
 }
 
-char *next_reg(char *s, short skip)
+char *next_reg(char *s, short skip, int params)
 {
        /* TODO: bessere registerwahl. das is gerade a wengal suboptimal... */
-#if 1
-       char *regs[] = {"rax", "r10", "r11", "rax"};
-#else
+#define REGLEN 9
        char *regs[] = {"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"};
-#endif
+
        int i=0;
        if (s != (char*) NULL) {
                while(i < 9) {
@@ -56,8 +55,16 @@ char *next_reg(char *s, short skip)
                i++;
        }
 #ifdef DDCHELP
-       fprintf(stderr, "next_reg(): %s\n", regs[i]);
+       fprintf(stderr, "next_reg(): %s (bei %i parameter)\n", regs[i], params);
+#endif
+       /* TODO: <= passt? */
+       if(REGLEN - params <= i) {
+               fprintf(stderr, "next_reg(): register \"%s\" in dem sich ein parameter befindet wird als temporaeres register verwendet(params: %i, i: %i)\n", regs[i], params, i);
+               /* TODO: exit hier? */
+#if 0
+               exit(4);
 #endif
+       }
 
        return regs[i];
 }
index 9933b3422d2f73dbf5dd0cfd65e5afe234374af9..396859cc9a1676237a7876eced49216e8fcad568 100644 (file)
@@ -2,7 +2,7 @@
 #define __CHELPER_H
 void func_header(char *s);
 void func_footer(void);
-char *next_reg(char *s, short skip);
+char *next_reg(char *s, short skip, int params);
 char *param_reg(int num);
 void ret(void);
 void move(char *src, char *dest);
index 5fc5c8e2d5b09d26791a41d393f1f4a2398ef9bd..a804229a7bf18e0e20eb404e2f38b9232b14af52 100644 (file)
         * geht nicht, weil verschachtelte macros deaktiviert sind */
 @end
 
-@autoinh s
-@autosyn node imm exprcount
+/* beschreibung der attribute
+ * s:
+ * f:
+ * gparamges:
+ * parms:
+ * node:
+ * imm:
+ * exprcount:
+ * sin:
+ * sout:
+ */
+@autoinh s gparamges
+@autosyn node imm
 
 @attributes { char *name; } IDENT
 @attributes { long val; } NUM
-@attributes { struct symbol *f; int parms; } Parms
+@attributes { struct symbol *f; int paramges; int parms; } Parms
 @attributes { struct symbol *f; } FeldID Structdef Program
-@attributes { struct symbol *s; } Methoddef Statseq Exprs
-@attributes { struct symbol *s; struct treenode *node; short imm; int exprcount; } Expr Minusterm Term
-@attributes { struct symbol *s; struct treenode *node; } Lexpr Multerm Orterm Feld
-@attributes { struct symbol *sin; struct symbol *sout; struct treenode *node; } Statement
+@attributes { struct symbol *s; } Methoddef
+@attributes { struct symbol *s; int gparamges; } Statseq Exprs
+@attributes { struct symbol *s; int gparamges; struct treenode *node; short imm; int exprcount; } Expr Minusterm Term
+@attributes { struct symbol *s; int gparamges; struct treenode *node; } Lexpr Multerm Orterm Feld
+@attributes { struct symbol *sin; int gparamges; struct symbol *sout; struct treenode *node; } Statement
 
 @traversal @postorder c
 @traversal @preorder reg
@@ -65,6 +77,7 @@ Methoddef:
          @{
            @i @Parms.parms@ = 1;
            @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.f@, 0);
+               @i @Statseq.gparamges@ = @Parms.paramges@;
            @gen @revorder(1) func_header(@IDENT.name@);
          @}
        ;
@@ -81,12 +94,14 @@ Parms:
          IDENT Parms
          @{
            @i @Parms.1.parms@ = @Parms.parms@ + 1;
+               @i @Parms.0.paramges@ = @Parms.1.paramges@;
            @i @Parms.0.f@ = tab_add_symbol(@Parms.1.f@, @IDENT.name@, S_PARM, 1, @Parms.parms@);
          @}
 
        |
          @{
            @i @Parms.f@ = tab_new();
+               @i @Parms.paramges@ = @Parms.parms@;
          @}
        ;
 
@@ -168,7 +183,7 @@ Statement:
                statinout()
                xxputsin(@Expr.s@,)
                @i @Statement.node@ = new_node(O_RET, @Expr.node@, TREENULL, 0);
-               @reg @Statement.node@->reg = next_reg((char *)NULL, 0); @Expr.node@->reg = @Statement.node@->reg;
+               @reg @Statement.node@->reg = next_reg((char *)NULL, 0, @Expr.gparamges@); @Expr.node@->reg = @Statement.node@->reg;
          @}
        ;
 
@@ -212,7 +227,7 @@ Expr:
                        /* TODO */
                        @Term.node@->reg = @Expr.node@->reg;
                        @Term.node@->skip = 1;
-                       @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip);
+                       @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip, @Expr.gparamges@);
                }
          @}
 
@@ -252,7 +267,7 @@ Minusterm:
 
            @reg {
                        @Minusterm.1.node@->reg = @Minusterm.node@->reg;
-                       @Term.node@->reg = next_reg(@Minusterm.1.node@->reg, @Minusterm.node@->skip);
+                       @Term.node@->reg = next_reg(@Minusterm.1.node@->reg, @Minusterm.node@->skip, @Minusterm.gparamges@);
                }
          @}
 
index 5476ae8243fb71637f0ae3f6e73b70cafecdcc1f..dc11f878318a6c4cc56450778a6ad93ca2d62a19 100755 (executable)
@@ -35,6 +35,11 @@ struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short
        fprintf(stderr, "tab_add_symbol: tab(%08X), ident(%s), type(%i), check(%i), param_index(%i)\n", tab, ident, type, check, param_index);
 #endif
 
+       if(param_index >= 6) {
+               fprintf(stderr, "eine methode hat zu viele parameter (max. 6 inkl. this erlaubt)\n");
+               exit(4);
+       }
+
        if(tab_lookup(tab, ident, type) != SYMNULL) {
                if(check) {
                        fprintf(stderr, "Identifier doppelt vorhanden: \"%s\"\n", ident);