]> Cypherpunks repositories - gostls13.git/commitdiff
1. retract general field names
authorKen Thompson <ken@golang.org>
Mon, 24 Nov 2008 22:01:12 +0000 (14:01 -0800)
committerKen Thompson <ken@golang.org>
Mon, 24 Nov 2008 22:01:12 +0000 (14:01 -0800)
2. array bounds bug
3. ... optimization bug

R=r
OCL=19927
CL=19927

src/cmd/6g/cgen.c
src/cmd/6g/reg.c
src/cmd/gc/go.y

index 74e945e65488d4efb054d666b5cc25a4223bbfb5..de54756de8b2ac7612414421c227c93d16f27ecf 100644 (file)
@@ -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);
                }
index 0715faa0972924b109a184ea4d3a503403650c61..841a2312ebfacaedef7c249fe84124ebb0a88d54 100644 (file)
@@ -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;
index 0a7c7bc07d4ffd3bd08c2f8567c20272f45a00f1..082a83fdeacccd218282441f030384619e12bbb0 100644 (file)
@@ -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
        {