]> Cypherpunks repositories - gostls13.git/commitdiff
add readonly flag to static initialization
authorKen Thompson <ken@golang.org>
Thu, 16 Sep 2010 23:42:38 +0000 (16:42 -0700)
committerKen Thompson <ken@golang.org>
Thu, 16 Sep 2010 23:42:38 +0000 (16:42 -0700)
R=rsc
CC=golang-dev
https://golang.org/cl/2187042

src/cmd/gc/go.h
src/cmd/gc/sinit.c
src/cmd/gc/subr.c
src/cmd/gc/walk.c

index 011cbf1c9333ff619f7ab985bfc3b32da3e0d078..ab6386cb568d425239e5ac6b0be3a1b1d330b353 100644 (file)
@@ -1023,7 +1023,7 @@ void      walkselect(Node *sel);
 /*
  *     sinit.c
  */
-void   anylit(int ctxt, Node *n, Node *var, NodeList **init);
+void   anylit(Node *n, Node *var, NodeList **init);
 int    gen_as_init(Node *n);
 NodeList*      initfix(NodeList *l);
 int    oaslit(Node *n, NodeList **init);
index fa0f5dcdc5edb56e6ccfed7c15f76b2c7d55a85b..84a3cf1661ece7261f19d38f567acde44eb3101b 100644 (file)
@@ -179,10 +179,23 @@ initfix(NodeList *l)
  * part of the composit literal.
  */
 
-static void    structlit(int ctxt, int pass, Node *n, Node *var, NodeList **init);
-static void    arraylit(int ctxt, int pass, Node *n, Node *var, NodeList **init);
-static void    slicelit(int ctxt, Node *n, Node *var, NodeList **init);
-static void    maplit(int ctxt, Node *n, Node *var, NodeList **init);
+static void    structlit(int pass, Node *n, Node *var, NodeList **init);
+static void    arraylit(int pass, Node *n, Node *var, NodeList **init);
+static void    slicelit(Node *n, Node *var, NodeList **init);
+static void    maplit(Node *n, Node *var, NodeList **init);
+
+Node*
+staticname(Type *t)
+{
+       Node *n;
+
+       snprint(namebuf, sizeof(namebuf), "statictmp_%.4d", statuniqgen);
+       statuniqgen++;
+       n = newname(lookup(namebuf));
+       n->readonly = 1;
+       addvar(n, t, PEXTERN);
+       return n;
+}
 
 static int
 isliteral(Node *n)
@@ -257,7 +270,7 @@ getdyn(Node *n, int top)
 }
 
 static void
-structlit(int ctxt, int pass, Node *n, Node *var, NodeList **init)
+structlit(int pass, Node *n, Node *var, NodeList **init)
 {
        Node *r, *a;
        NodeList *nl;
@@ -273,25 +286,21 @@ structlit(int ctxt, int pass, Node *n, Node *var, NodeList **init)
                switch(value->op) {
                case OARRAYLIT:
                        if(value->type->bound < 0) {
-                               if(pass == 1 && ctxt != 0) {
+                               if(pass == 2) {
                                        a = nod(ODOT, var, newname(index->sym));
-                                       slicelit(ctxt, value, a, init);
-                               } else
-                               if(pass == 2 && ctxt == 0) {
-                                       a = nod(ODOT, var, newname(index->sym));
-                                       slicelit(ctxt, value, a, init);
+                                       slicelit(value, a, init);
                                } else
                                if(pass == 3)
                                        break;
                                continue;
                        }
                        a = nod(ODOT, var, newname(index->sym));
-                       arraylit(ctxt, pass, value, a, init);
+                       arraylit(pass, value, a, init);
                        continue;
 
                case OSTRUCTLIT:
                        a = nod(ODOT, var, newname(index->sym));
-                       structlit(ctxt, pass, value, a, init);
+                       structlit(pass, value, a, init);
                        continue;
                }
 
@@ -317,7 +326,7 @@ structlit(int ctxt, int pass, Node *n, Node *var, NodeList **init)
 }
 
 static void
-arraylit(int ctxt, int pass, Node *n, Node *var, NodeList **init)
+arraylit(int pass, Node *n, Node *var, NodeList **init)
 {
        Node *r, *a;
        NodeList *l;
@@ -333,25 +342,21 @@ arraylit(int ctxt, int pass, Node *n, Node *var, NodeList **init)
                switch(value->op) {
                case OARRAYLIT:
                        if(value->type->bound < 0) {
-                               if(pass == 1 && ctxt != 0) {
-                                       a = nod(OINDEX, var, index);
-                                       slicelit(ctxt, value, a, init);
-                               } else
-                               if(pass == 2 && ctxt == 0) {
+                               if(pass == 2) {
                                        a = nod(OINDEX, var, index);
-                                       slicelit(ctxt, value, a, init);
+                                       slicelit(value, a, init);
                                } else
                                if(pass == 3)
                                        break;
                                continue;
                        }
                        a = nod(OINDEX, var, index);
-                       arraylit(ctxt, pass, value, a, init);
+                       arraylit(pass, value, a, init);
                        continue;
 
                case OSTRUCTLIT:
                        a = nod(OINDEX, var, index);
-                       structlit(ctxt, pass, value, a, init);
+                       structlit(pass, value, a, init);
                        continue;
                }
 
@@ -377,7 +382,7 @@ arraylit(int ctxt, int pass, Node *n, Node *var, NodeList **init)
 }
 
 static void
-slicelit(int ctxt, Node *n, Node *var, NodeList **init)
+slicelit(Node *n, Node *var, NodeList **init)
 {
        Node *r, *a;
        NodeList *l;
@@ -393,22 +398,6 @@ slicelit(int ctxt, Node *n, Node *var, NodeList **init)
        t->sym = nil;
        dowidth(t);
 
-       if(ctxt != 0) {
-
-               // put everything into static array
-               vstat = staticname(t);
-               arraylit(ctxt, 1, n, vstat, init);
-               arraylit(ctxt, 2, n, vstat, init);
-
-               // copy static to slice
-               a = nod(OSLICE, vstat, nod(OKEY, N, N));
-               a = nod(OAS, var, a);
-               typecheck(&a, Etop);
-               a->dodata = 2;
-               *init = list(*init, a);
-               return;
-       }
-
        // recipe for var = []t{...}
        // 1. make a static array
        //      var vstat [...]t
@@ -434,7 +423,7 @@ slicelit(int ctxt, Node *n, Node *var, NodeList **init)
        mode = getdyn(n, 1);
        if(mode & MODECONST) {
                vstat = staticname(t);
-               arraylit(ctxt, 1, n, vstat, init);
+               arraylit(1, n, vstat, init);
        }
 
        // make new auto *array (3 declare)
@@ -479,11 +468,11 @@ slicelit(int ctxt, Node *n, Node *var, NodeList **init)
                case OARRAYLIT:
                        if(value->type->bound < 0)
                                break;
-                       arraylit(ctxt, 2, value, a, init);
+                       arraylit(2, value, a, init);
                        continue;
 
                case OSTRUCTLIT:
-                       structlit(ctxt, 2, value, a, init);
+                       structlit(2, value, a, init);
                        continue;
                }
 
@@ -499,7 +488,7 @@ slicelit(int ctxt, Node *n, Node *var, NodeList **init)
 }
 
 static void
-maplit(int ctxt, Node *n, Node *var, NodeList **init)
+maplit(Node *n, Node *var, NodeList **init)
 {
        Node *r, *a;
        NodeList *l;
@@ -651,7 +640,7 @@ maplit(int ctxt, Node *n, Node *var, NodeList **init)
 }
 
 void
-anylit(int ctxt, Node *n, Node *var, NodeList **init)
+anylit(Node *n, Node *var, NodeList **init)
 {
        Type *t;
        Node *a, *vstat;
@@ -666,24 +655,18 @@ anylit(int ctxt, Node *n, Node *var, NodeList **init)
                        fatal("anylit: not struct");
 
                if(simplename(var)) {
+                       // lay out static data
+                       vstat = staticname(t);
+                       structlit(1, n, vstat, init);
 
-                       if(ctxt == 0) {
-                               // lay out static data
-                               vstat = staticname(t);
-                               structlit(1, 1, n, vstat, init);
-
-                               // copy static to var
-                               a = nod(OAS, var, vstat);
-                               typecheck(&a, Etop);
-                               walkexpr(&a, init);
-                               *init = list(*init, a);
+                       // copy static to var
+                       a = nod(OAS, var, vstat);
+                       typecheck(&a, Etop);
+                       walkexpr(&a, init);
+                       *init = list(*init, a);
 
-                               // add expressions to automatic
-                               structlit(ctxt, 2, n, var, init);
-                               break;
-                       }
-                       structlit(ctxt, 1, n, var, init);
-                       structlit(ctxt, 2, n, var, init);
+                       // add expressions to automatic
+                       structlit(2, n, var, init);
                        break;
                }
 
@@ -694,36 +677,30 @@ anylit(int ctxt, Node *n, Node *var, NodeList **init)
                        walkexpr(&a, init);
                        *init = list(*init, a);
                }
-               structlit(ctxt, 3, n, var, init);
+               structlit(3, n, var, init);
                break;
 
        case OARRAYLIT:
                if(t->etype != TARRAY)
                        fatal("anylit: not array");
                if(t->bound < 0) {
-                       slicelit(ctxt, n, var, init);
+                       slicelit(n, var, init);
                        break;
                }
 
                if(simplename(var)) {
+                       // lay out static data
+                       vstat = staticname(t);
+                       arraylit(1, n, vstat, init);
 
-                       if(ctxt == 0) {
-                               // lay out static data
-                               vstat = staticname(t);
-                               arraylit(1, 1, n, vstat, init);
-
-                               // copy static to automatic
-                               a = nod(OAS, var, vstat);
-                               typecheck(&a, Etop);
-                               walkexpr(&a, init);
-                               *init = list(*init, a);
+                       // copy static to automatic
+                       a = nod(OAS, var, vstat);
+                       typecheck(&a, Etop);
+                       walkexpr(&a, init);
+                       *init = list(*init, a);
 
-                               // add expressions to automatic
-                               arraylit(ctxt, 2, n, var, init);
-                               break;
-                       }
-                       arraylit(ctxt, 1, n, var, init);
-                       arraylit(ctxt, 2, n, var, init);
+                       // add expressions to automatic
+                       arraylit(2, n, var, init);
                        break;
                }
 
@@ -734,13 +711,13 @@ anylit(int ctxt, Node *n, Node *var, NodeList **init)
                        walkexpr(&a, init);
                        *init = list(*init, a);
                }
-               arraylit(ctxt, 3, n, var, init);
+               arraylit(3, n, var, init);
                break;
 
        case OMAPLIT:
                if(t->etype != TMAP)
                        fatal("anylit: not map");
-               maplit(ctxt, n, var, init);
+               maplit(n, var, init);
                break;
        }
 }
@@ -748,8 +725,6 @@ anylit(int ctxt, Node *n, Node *var, NodeList **init)
 int
 oaslit(Node *n, NodeList **init)
 {
-       int ctxt;
-
        if(n->left == N || n->right == N)
                goto no;
        if(n->left->type == T || n->right->type == T)
@@ -762,9 +737,6 @@ oaslit(Node *n, NodeList **init)
        // context is init() function.
        // implies generated data executed
        // exactly once and not subject to races.
-       ctxt = 0;
-       if(n->dodata == 1)
-               ctxt = 1;
 
        switch(n->right->op) {
        default:
@@ -775,7 +747,7 @@ oaslit(Node *n, NodeList **init)
        case OMAPLIT:
                if(vmatch1(n->left, n->right))
                        goto no;
-               anylit(ctxt, n->right, n->left, init);
+               anylit(n->right, n->left, init);
                break;
        }
        n->op = OEMPTY;
index 97026839f0731425976804260c36cfc028fa2d37..fc89d064db305375accac4b1ed476a1f5f7ae25c 100644 (file)
@@ -2593,19 +2593,6 @@ brrev(int a)
        return a;
 }
 
-Node*
-staticname(Type *t)
-{
-       Node *n;
-
-       snprint(namebuf, sizeof(namebuf), "statictmp_%.4d", statuniqgen);
-       statuniqgen++;
-       n = newname(lookup(namebuf));
-//     n->readonly = 1;
-       addvar(n, t, PEXTERN);
-       return n;
-}
-
 /*
  * return side effect-free appending side effects to init.
  * result is assignable if n is.
index 803977482e219d8ea998545b1c0702a4e22038e3..db5443ded610a0b66f13e3d06a7f1f1dc2ff1ef1 100644 (file)
@@ -1159,7 +1159,7 @@ walkexpr(Node **np, NodeList **init)
                case OMAPLIT:
                case OSTRUCTLIT:
                        nvar = makenewvar(n->type, init, &nstar);
-                       anylit(0, n->left, nstar, init);
+                       anylit(n->left, nstar, init);
                        n = nvar;
                        goto ret;
                }
@@ -1341,7 +1341,7 @@ walkexpr(Node **np, NodeList **init)
        case OSTRUCTLIT:
                nvar = nod(OXXX, N, N);
                tempname(nvar, n->type);
-               anylit(0, n, nvar, init);
+               anylit(n, nvar, init);
                n = nvar;
                goto ret;