diff options
author | Ken Thompson <ken@golang.org> | 2008-09-02 19:11:25 -0700 |
---|---|---|
committer | Ken Thompson <ken@golang.org> | 2008-09-02 19:11:25 -0700 |
commit | e84dba5ee0c570e1f150e06c8e204ab0a0a43786 (patch) | |
tree | 37a39aa7d4ca0ec79082d454edf20eafc966a99e | |
parent | 53dcc6ad3e3e90e24afa00b8783c1ee16a29e5a0 (diff) | |
download | golang-e84dba5ee0c570e1f150e06c8e204ab0a0a43786.tar.gz |
structure literals
R=r
OCL=14735
CL=14735
-rw-r--r-- | src/cmd/6g/gen.c | 7 | ||||
-rw-r--r-- | src/cmd/gc/subr.c | 17 | ||||
-rw-r--r-- | src/cmd/gc/walk.c | 24 |
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); |