summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2008-09-02 19:11:25 -0700
committerKen Thompson <ken@golang.org>2008-09-02 19:11:25 -0700
commite84dba5ee0c570e1f150e06c8e204ab0a0a43786 (patch)
tree37a39aa7d4ca0ec79082d454edf20eafc966a99e
parent53dcc6ad3e3e90e24afa00b8783c1ee16a29e5a0 (diff)
downloadgolang-e84dba5ee0c570e1f150e06c8e204ab0a0a43786.tar.gz
structure literals
R=r OCL=14735 CL=14735
-rw-r--r--src/cmd/6g/gen.c7
-rw-r--r--src/cmd/gc/subr.c17
-rw-r--r--src/cmd/gc/walk.c24
3 files changed, 22 insertions, 26 deletions
diff --git a/src/cmd/6g/gen.c b/src/cmd/6g/gen.c
index 7c64f4ddc..ef53696ee 100644
--- a/src/cmd/6g/gen.c
+++ b/src/cmd/6g/gen.c
@@ -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
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 56958caff..aa3ecf45e 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -1221,6 +1221,23 @@ isptrdarray(Type *t)
}
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)
{
if(t != T && t->etype == TINTER)
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 3f2e856fd..3ab4671b8 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -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);