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
}
}
-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)
{
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;
}
}
(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;
}
(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;
}
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);
/*
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
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
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;
}