]> Cypherpunks repositories - gostls13.git/commitdiff
structure literals
authorKen Thompson <ken@golang.org>
Wed, 3 Sep 2008 02:11:25 +0000 (19:11 -0700)
committerKen Thompson <ken@golang.org>
Wed, 3 Sep 2008 02:11:25 +0000 (19:11 -0700)
R=r
OCL=14735
CL=14735

src/cmd/6g/gen.c
src/cmd/gc/subr.c
src/cmd/gc/walk.c

index 7c64f4ddce9b84544c74a252d1e1087f4e1b9cfd..ef53696eeead0294244232685bdef130974247b7 100644 (file)
@@ -137,6 +137,9 @@ gen(Node *n, Label *labloop)
 loop:
        if(n == N)
                goto ret;
+       if(n->ninit)
+               gen(n->ninit, L);
+
        setlineno(n);
 
        switch(n->op) {
@@ -234,7 +237,6 @@ loop:
                break;
 
        case OFOR:
-               gen(n->ninit, L);                       //              init
                p1 = gbranch(AJMP, T);                  //              goto test
                sbreak = breakpc;
                breakpc = gbranch(AJMP, T);             // break:       goto done
@@ -256,7 +258,6 @@ loop:
                break;
 
        case OIF:
-               gen(n->ninit, L);                       //              init
                p1 = gbranch(AJMP, T);                  //              goto test
                p2 = gbranch(AJMP, T);                  // p2:          goto else
                patch(p1, pc);                          // test:
@@ -269,7 +270,6 @@ loop:
                break;
 
        case OSWITCH:
-               gen(n->ninit, L);                       //              init
                p1 = gbranch(AJMP, T);                  //              goto test
                sbreak = breakpc;
                breakpc = gbranch(AJMP, T);             // break:       goto done
@@ -284,7 +284,6 @@ loop:
                break;
 
        case OSELECT:
-               gen(n->ninit, L);
                sbreak = breakpc;
                p1 = gbranch(AJMP, T);                  //              goto test
                breakpc = gbranch(AJMP, T);             // break:       goto done
index 56958caff9b8e64a298bb42192406ef6578bcbc4..aa3ecf45e18bd0d324c9dd9067ff3a9e0e6262a8 100644 (file)
@@ -1220,6 +1220,23 @@ isptrdarray(Type *t)
        return 0;
 }
 
+int
+isselect(Node *n)
+{
+       Sym *s;
+
+       if(n == N)
+               return 0;
+       n = n->left;
+       s = pkglookup("selectsend", "sys");
+       if(s == n->sym)
+               return 1;
+       s = pkglookup("selectrecv", "sys");
+       if(s == n->sym)
+               return 1;
+       return 0;
+}
+
 int
 isinter(Type *t)
 {
index 3f2e856fd88971c63f51bf6a605deead806b3dae..3ab4671b8cdcc8d24b461ef1978a3d6de6dc6eb1 100644 (file)
@@ -21,23 +21,6 @@ walk(Node *fn)
                dump("fn", fn->nbody);
 }
 
-int
-isselect(Node *n)
-{
-       Sym *s;
-
-       if(n == N)
-               return 0;
-       n = n->left;
-       s = pkglookup("selectsend", "sys");
-       if(s == n->sym)
-               return 1;
-       s = pkglookup("selectrecv", "sys");
-       if(s == n->sym)
-               return 1;
-       return 0;
-}
-
 void
 walktype1(Node *n, int top)
 {
@@ -396,8 +379,6 @@ loop:
                        goto ret;
 
                convlit(l, t);
-               if(l->type == T)
-                       goto ret;
 
                // nil conversion
                if(eqtype(t, l->type, 0)) {
@@ -415,6 +396,7 @@ loop:
                }
 
                // to string
+               if(l->type != T)
                if(isptrto(t, TSTRING)) {
                        if(isint[l->type->etype]) {
                                *n = *stringop(n, top);
@@ -2331,7 +2313,7 @@ walktype(Node *n, int top)
                r = addtop;
                addtop = N;
                walktype1(r, top);
-               n->ninit = list(r, n->ninit);
+               n->ninit = list(n->ninit, r);
        }
 }
 
@@ -2830,8 +2812,6 @@ structlit(Node *n)
        if(t->etype != TSTRUCT)
                fatal("structlit: not struct");
 
-print("\nstruct lit %lT\n", t);
-
        var = nod(OXXX, N, N);
        tempname(var, t);