]> git.mdlowis.com Git - proto/obnc.git/commitdiff
added some error checking to array indexing
authormike lowis <mike@mdlowis.com>
Tue, 11 May 2021 00:44:26 +0000 (20:44 -0400)
committermike lowis <mike@mdlowis.com>
Tue, 11 May 2021 00:44:26 +0000 (20:44 -0400)
cerise/backend/c99/codegen.c
cerise/backend/test/codegen.c
cerise/backend/x86_64/codegen.c
cerise/inc/cerise.h
cerise/oberon0/OSG.Mod
cerise/src/grammar.c

index 9c3636f99f3620efde080fbc94c0cb1c4cf89fe3..56553f9b156cbe292019775c4185f3fbb1fc6cb7 100644 (file)
@@ -214,12 +214,28 @@ void codegen_binop(Parser* p, int op, Item* a, Item* b)
 
 void codegen_store(Parser* p, Item* a, Item* b)
 {
+    item_dump(a);
+    item_dump(b);
     if (a->mode == ITEM_MVAR && b->reg == 0)
     {
+//        if (a->offset)
+//        {
+//            printf("    (%s*)\n",
+//                TypeNames[a->type->form]
+//
+//            );
+//        }
         printf("    %s_%s = %lld;\n", p->name, a->imm.s, b->imm.i);
     }
     else if (a->mode == ITEM_MVAR)
     {
+//        if (a->offset)
+//        {
+//            printf("    (%s*)\n",
+//                TypeNames[a->type->form]
+//
+//            );
+//        }
         printf("    %s_%s = _T%d;\n", p->name, a->imm.s, b->reg);
     }
     else
@@ -287,7 +303,7 @@ void codegen_return(Parser* p, Item* item)
     }
 }
 
-void codegen_rangecheck(Parser* p, long length, Item* index)
+void codegen_index(Parser* p, Item* array, Item* index)
 {
 //    codegen_binop(p, '*', index, base);
     if (index->mode == ITEM_CONST)
@@ -296,9 +312,15 @@ void codegen_rangecheck(Parser* p, long length, Item* index)
         {
             error(p, "array indexes must be of integral type");
         }
-        else if (index->imm.i >= length)
+        else if (index->imm.i >= array->type->size)
         {
             error(p, "array index out of bounds");
         }
+        else if (index->imm.i < 0)
+        {
+            error(p, "negative array index");
+        }
+
+        array->offset = index->imm.i;
     }
 }
index 78e13a8a17642372b454dab3027100daf824fe7c..3502455d54cc8043b1dc78324723db19b596f401 100644 (file)
@@ -121,7 +121,7 @@ void codegen_return(Parser* p, Item* item)
     (void)p, (void)item;
 }
 
-void codegen_rangecheck(Parser* p, long length, Item* index)
+void codegen_index(Parser* p, Item* array, Item* index)
 {
-    (void)p, (void)length, (void)index;
+    (void)p, (void)array, (void)index;
 }
index fb3ea6a0ec2267b15e43ebde0d7747063359a58c..651f515aabcb125a5f4008f693678205635ad745 100644 (file)
@@ -349,7 +349,7 @@ void codegen_return(Parser* p, Item* item)
     (void)p, (void)item;
 }
 
-void codegen_rangecheck(Parser* p, long length, Item* index)
+void codegen_index(Parser* p, Item* array, Item* index)
 {
-    (void)p, (void)length, (void)index;
+    (void)p, (void)array, (void)index;
 }
index ec2181d96eb72a2fd3b0f139afe16e3ef66d998b..26c1a923a083a83ac85c4aac1be4181e7dcbd95e 100644 (file)
@@ -224,7 +224,7 @@ void codegen_prepcall(Parser* p, Item* item);
 void codegen_call(Parser* p, Item* item, Item* args);
 void codegen_setarg(Parser* p, Item* item, bool firstarg);
 void codegen_return(Parser* p, Item* item);
-void codegen_rangecheck(Parser* p, long length, Item* index);
+void codegen_index(Parser* p, Item* array, Item* index);
 
 /*
 
index c8a226c8261859e51f97af869dc65ffb662f9c77..1925f38214a0ca9980613eccde255e129cba91f9 100644 (file)
@@ -289,12 +289,15 @@ MODULE OSG; (* NW 19.12.94 / 20.10.07 / OSGX  9.5.2017*)
       IF (y.a < 0) OR (y.a >= x.type.len) THEN\r
         OSS.Mark("bad index")\r
       END ;\r
+\r
       IF x.mode = Par THEN\r
         Put2(Ldw, RH, x.r, x.a);\r
         x.mode := RegI;\r
         x.a := 0\r
       END ;\r
+\r
       x.a := x.a + y.a * x.type.base.size\r
+\r
     ELSE\r
       s := x.type.base.size;\r
       IF y.mode # Reg THEN\r
@@ -513,12 +516,15 @@ MODULE OSG; (* NW 19.12.94 / 20.10.07 / OSGX  9.5.2017*)
         GetSB;\r
         Put2(Stw, y.r, SB, x.a)\r
       END\r
+\r
     ELSIF x.mode = Par THEN\r
       Put2(Ldw, RH, SP, x.a);\r
       Put2(Stw, y.r, RH, x.b)\r
+\r
     ELSIF x.mode = RegI THEN\r
       Put2(Stw, y.r, x.r, x.a);\r
       DEC(RH)\r
+\r
     ELSE\r
       OSS.Mark("illegal assignment")\r
     END ;\r
index c90a8954e97df414c7edc084982be6da4bb71d0d..347be3572282c93fc1e465863584b40cbbc9c6f3 100644 (file)
@@ -114,13 +114,18 @@ RULE(designator)
 
         case '[':
         {
-            expect(p, '[');
-            Type* type = item->type;
             Item index = {0};
+            expect(p, '[');
             expression(p, &index);
-            codegen_rangecheck(p, item->type->size, &index);
-            //codegen_binop(p, '*', &index, &base);
-            item->type = item->type->base;
+            if (item->type->form == FORM_ARRAY)
+            {
+                codegen_index(p, item, &index);
+                item->type = item->type->base;
+            }
+            else
+            {
+                error(p, "attempting to index non-array value");
+            }
             expect(p, ']');
             break;
         }