From: Ken Thompson Date: Mon, 24 Nov 2008 22:01:12 +0000 (-0800) Subject: 1. retract general field names X-Git-Tag: weekly.2009-11-06~2619 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8e3fe10ee381cb0200a683dfe116189aa8b41d9f;p=gostls13.git 1. retract general field names 2. array bounds bug 3. ... optimization bug R=r OCL=19927 CL=19927 --- diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c index 74e945e654..de54756de8 100644 --- a/src/cmd/6g/cgen.c +++ b/src/cmd/6g/cgen.c @@ -406,17 +406,44 @@ agen(Node *n, Node *res) if(w == 0) fatal("index is zero width"); + // constant index if(whatis(nr) == Wlitint) { + v = mpgetfix(nr->val.u.xval); 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.op = OINDREG; n1.type = types[tptr]; n1.xoffset = offsetof(Array, array); 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); gins(optoas(OADD, types[tptr]), &n2, &n3); + gmove(&n3, res); regfree(&n3); break; @@ -443,8 +470,8 @@ agen(Node *n, Node *res) if(isptrarray(nl->type)) nodconst(&n1, types[TUINT64], nl->type->type->bound); } - gins(optoas(OCMP, types[TUINT64]), &n2, &n1); - p1 = gbranch(optoas(OLT, types[TUINT64]), T); + gins(optoas(OCMP, types[TUINT32]), &n2, &n1); + p1 = gbranch(optoas(OLT, types[TUINT32]), T); gins(ACALL, N, throwindex); patch(p1, pc); } diff --git a/src/cmd/6g/reg.c b/src/cmd/6g/reg.c index 0715faa097..841a2312eb 100644 --- a/src/cmd/6g/reg.c +++ b/src/cmd/6g/reg.c @@ -767,8 +767,8 @@ mkvar(Reg *r, Adr *a) s = a->sym; if(s == S) goto none; -// if(s->name[0] == '.') -// goto none; + if(s->name[0] == '!' || s->name[0] == '.') + goto none; et = a->etype; o = a->offset; v = var; diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 0a7c7bc07d..082a83fdea 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -993,9 +993,6 @@ sym1: */ sym2: sym1 -| LTYPE -| LFUNC -| LVAR /* * keywords that can be variables @@ -2014,7 +2011,7 @@ hidden_importsym: * to check whether the rest of the grammar is free of * reduce/reduce conflicts, comment this section out by * removing the slash on the next line. - * + */ lpack: LATYPE {