Commit 8e3fe10e authored by Ken Thompson's avatar Ken Thompson

1. retract general field names

2. array bounds bug
3. ... optimization bug

R=r
OCL=19927
CL=19927
parent 2a874603
...@@ -406,17 +406,44 @@ agen(Node *n, Node *res) ...@@ -406,17 +406,44 @@ agen(Node *n, Node *res)
if(w == 0) if(w == 0)
fatal("index is zero width"); fatal("index is zero width");
// constant index
if(whatis(nr) == Wlitint) { if(whatis(nr) == Wlitint) {
v = mpgetfix(nr->val.u.xval);
if(isptrdarray(nl->type)) { if(isptrdarray(nl->type)) {
if(!debug['B']) {
n1 = n3;
n1.op = OINDREG;
n1.type = types[tptr];
n1.xoffset = offsetof(Array, nel);
nodconst(&n2, types[TUINT64], v);
gins(optoas(OCMP, types[TUINT32]), &n1, &n2);
p1 = gbranch(optoas(OGT, types[TUINT32]), T);
gins(ACALL, N, throwindex);
patch(p1, pc);
}
n1 = n3; n1 = n3;
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[tptr]; n1.type = types[tptr];
n1.xoffset = offsetof(Array, array); n1.xoffset = offsetof(Array, array);
gmove(&n1, &n3); gmove(&n1, &n3);
} else
if(!debug['B']) {
if(v < 0)
yyerror("out of bounds on array");
else
if(isptrarray(nl->type)) {
if(v >= nl->type->type->bound)
yyerror("out of bounds on array");
} else
if(v >= nl->type->bound)
yyerror("out of bounds on array");
} }
v = mpgetfix(nr->val.u.xval);
nodconst(&n2, types[tptr], v*w); nodconst(&n2, types[tptr], v*w);
gins(optoas(OADD, types[tptr]), &n2, &n3); gins(optoas(OADD, types[tptr]), &n2, &n3);
gmove(&n3, res); gmove(&n3, res);
regfree(&n3); regfree(&n3);
break; break;
...@@ -443,8 +470,8 @@ agen(Node *n, Node *res) ...@@ -443,8 +470,8 @@ agen(Node *n, Node *res)
if(isptrarray(nl->type)) if(isptrarray(nl->type))
nodconst(&n1, types[TUINT64], nl->type->type->bound); nodconst(&n1, types[TUINT64], nl->type->type->bound);
} }
gins(optoas(OCMP, types[TUINT64]), &n2, &n1); gins(optoas(OCMP, types[TUINT32]), &n2, &n1);
p1 = gbranch(optoas(OLT, types[TUINT64]), T); p1 = gbranch(optoas(OLT, types[TUINT32]), T);
gins(ACALL, N, throwindex); gins(ACALL, N, throwindex);
patch(p1, pc); patch(p1, pc);
} }
......
...@@ -767,8 +767,8 @@ mkvar(Reg *r, Adr *a) ...@@ -767,8 +767,8 @@ mkvar(Reg *r, Adr *a)
s = a->sym; s = a->sym;
if(s == S) if(s == S)
goto none; goto none;
// if(s->name[0] == '.') if(s->name[0] == '!' || s->name[0] == '.')
// goto none; goto none;
et = a->etype; et = a->etype;
o = a->offset; o = a->offset;
v = var; v = var;
......
...@@ -993,9 +993,6 @@ sym1: ...@@ -993,9 +993,6 @@ sym1:
*/ */
sym2: sym2:
sym1 sym1
| LTYPE
| LFUNC
| LVAR
/* /*
* keywords that can be variables * keywords that can be variables
...@@ -2014,7 +2011,7 @@ hidden_importsym: ...@@ -2014,7 +2011,7 @@ hidden_importsym:
* to check whether the rest of the grammar is free of * to check whether the rest of the grammar is free of
* reduce/reduce conflicts, comment this section out by * reduce/reduce conflicts, comment this section out by
* removing the slash on the next line. * removing the slash on the next line.
* */
lpack: lpack:
LATYPE LATYPE
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment