OSDN Git Service

- Better error message for trying to cram too many values into an array.
authorRandy Heit <rheit@zdoom.fake>
Thu, 8 Jul 2010 22:08:20 +0000 (22:08 +0000)
committerRandy Heit <rheit@zdoom.fake>
Thu, 8 Jul 2010 22:08:20 +0000 (22:08 +0000)
- Fixed: Array initialization in ACC was incorrect for partial initializers, especially with higher dimensions.

SVN r2416 (trunk)

parse.c
pcode.c

diff --git a/parse.c b/parse.c
index 981dee1..f59daa2 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -12,6 +12,7 @@
 #include <ctype.h>\r
 #include <malloc.h>\r
 #include <stdio.h>\r
+#include <assert.h>\r
 \r
 #include "common.h"\r
 #include "parse.h"\r
@@ -3886,12 +3887,13 @@ static void ParseArrayIndices(symbolNode_t *sym, int requiredIndices)
        }\r
 }\r
 \r
-static int *ProcessArrayLevel(int level, int *entry, int ndim,\r
+static void ProcessArrayLevel(int level, int *entry, int ndim,\r
        int dims[MAX_ARRAY_DIMS], int muls[MAX_ARRAY_DIMS], char *name)\r
 {\r
+       int warned_too_many = NO;\r
        int i;\r
 \r
-       for(i = 0; i < dims[level-1]; ++i)\r
+       for(i = 0; ; ++i)\r
        {\r
                if(tk_Token == TK_COMMA)\r
                {\r
@@ -3901,14 +3903,7 @@ static int *ProcessArrayLevel(int level, int *entry, int ndim,
                else if(tk_Token == TK_RBRACE)\r
                {\r
                        TK_NextToken();\r
-                       if(level > 1)\r
-                       {\r
-                               return entry + muls[level-2] - i;\r
-                       }\r
-                       else\r
-                       {\r
-                               return entry + (muls[0]*dims[0]) - i;\r
-                       }\r
+                       return;\r
                }\r
                else\r
                {\r
@@ -3923,15 +3918,28 @@ static int *ProcessArrayLevel(int level, int *entry, int ndim,
                                }\r
                                else\r
                                {\r
-                                       *entry++ = EvalConstExpression();\r
+                                       int val;\r
+\r
+                                       if (i >= dims[level - 1] && !warned_too_many)\r
+                                       {\r
+                                               warned_too_many = YES;\r
+                                               ERR_Error(ERR_TOO_MANY_ARRAY_INIT, YES);\r
+                                       }\r
+                                       val = EvalConstExpression();\r
                                        ArrayHasStrings |= pa_ConstExprIsString;\r
+                                       if (i < dims[level - 1])\r
+                                       {\r
+                                               entry[i] = val;\r
+                                       }\r
                                }\r
                        }\r
                        else\r
                        {\r
                                TK_TokenMustBe(TK_LBRACE, ERR_MISSING_LBRACE_ARR);\r
                                TK_NextToken();\r
-                               entry = ProcessArrayLevel(level+1, entry, ndim, dims, muls, name);\r
+                               ProcessArrayLevel(level+1, entry, ndim, dims, muls, name);\r
+                               assert(level > 0);\r
+                               entry += muls[level-1];\r
                        }\r
                        if(i < dims[level-1]-1)\r
                        {\r
@@ -3956,7 +3964,6 @@ static int *ProcessArrayLevel(int level, int *entry, int ndim,
        }\r
        TK_TokenMustBe(TK_RBRACE, ERR_MISSING_RBRACE_ARR);\r
        TK_NextToken();\r
-       return entry;\r
 }\r
 \r
 //==========================================================================\r
diff --git a/pcode.c b/pcode.c
index 923747c..baa8360 100644 (file)
--- a/pcode.c
+++ b/pcode.c
@@ -830,6 +830,7 @@ static void CloseNew(void)
                                        PC_Append("AINI", 4);\r
                                        PC_AppendInt(ArraySizes[i]*4+4);\r
                                        PC_AppendInt((U_INT)i);\r
+                                       MS_Message(MSG_DEBUG, "Writing array initializers for array %d (size %d)\n", i, ArraySizes[i]);\r
                                        for(j = 0; j < ArraySizes[i]; ++j)\r
                                        {\r
                                                PC_AppendInt((U_INT)ArrayInits[i][j]);\r