summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-04-13 05:31:44 -0700
committerRuss Cox <rsc@golang.org>2009-04-13 05:31:44 -0700
commit7bd87ad287c04bea243e8b098da40491e555d3c8 (patch)
treeec88e54180df03e042471c6b2ccff89a87dd9b0c /src
parent75e424e4996b8abd0615f11356ec1db896825781 (diff)
downloadgolang-7bd87ad287c04bea243e8b098da40491e555d3c8.tar.gz
fix stringrange test
R=ken OCL=27353 CL=27353
Diffstat (limited to 'src')
-rw-r--r--src/cmd/gc/obj.c1
-rw-r--r--src/cmd/gc/walk.c48
2 files changed, 28 insertions, 21 deletions
diff --git a/src/cmd/gc/obj.c b/src/cmd/gc/obj.c
index aa7631bd8..037cd4d48 100644
--- a/src/cmd/gc/obj.c
+++ b/src/cmd/gc/obj.c
@@ -500,7 +500,6 @@ void
stringpool(Node *n)
{
Pool *p;
- int w;
if(n->op != OLITERAL || n->val.ctype != CTSTR) {
if(n->val.ctype == CTNIL)
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index fb8b7ca00..5f05c323f 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -3197,7 +3197,7 @@ Node*
dorange(Node *nn)
{
Node *k, *v, *m;
- Node *n, *hv, *hc, *ha, *hk, *on, *r, *a;
+ Node *n, *hv, *hc, *ha, *hk, *ohk, *on, *r, *a;
Type *t, *th;
int local;
@@ -3339,9 +3339,17 @@ strng:
hk = nod(OXXX, N, N); // hidden key
tempname(hk, types[TINT]);
+ ohk = nod(OXXX, N, N); // old hidden key
+ tempname(ohk, types[TINT]);
+
ha = nod(OXXX, N, N); // hidden string
tempname(ha, t);
+ hv = N;
+ if(v != N) {
+ hv = nod(OXXX, N, N); // hidden value
+ tempname(hv, types[TINT]);
+ }
if(local) {
k = old2new(k, types[TINT]);
@@ -3353,27 +3361,22 @@ strng:
a = nod(OAS, ha, m);
n->ninit = a;
- // kh = 0
- a = nod(OAS, hk, nodintconst(0));
+ // ohk = 0
+ a = nod(OAS, ohk, nodintconst(0));
n->ninit = list(n->ninit, a);
- // k = hk
- a = nod(OAS, k, hk);
- n->ninit = list(n->ninit, a);
-
-
- // hk[,v] = stringiter(ha,hk)
+ // hk[,hv] = stringiter(ha,hk)
if(v != N) {
// hk,v = stringiter2(ha, hk)
on = syslook("stringiter2", 0);
// argtype(on, v->type);
- a = list(ha, hk);
+ a = list(ha, nodintconst(0));
a = nod(OCALL, on, a);
- a = nod(OAS, list(hk, v), a);
+ a = nod(OAS, list(hk, hv), a);
} else {
// hk = stringiter(ha, hk)
on = syslook("stringiter", 0);
- a = list(ha, hk);
+ a = list(ha, nodintconst(0));
a = nod(OCALL, on, a);
a = nod(OAS, hk, a);
}
@@ -3382,18 +3385,13 @@ strng:
// while(hk != 0)
n->ntest = nod(ONE, hk, nodintconst(0));
- // k = hk
- a = nod(OAS, k, hk);
- n->nincr = a;
-
- // hk[,v] = stringiter(ha,hk)
+ // hk[,hv] = stringiter(ha,hk)
if(v != N) {
- // hk,v = stringiter2(ha, hk)
+ // hk,hv = stringiter2(ha, hk)
on = syslook("stringiter2", 0);
-// argtype(on, v->type);
a = list(ha, hk);
a = nod(OCALL, on, a);
- a = nod(OAS, list(hk, v), a);
+ a = nod(OAS, list(hk, hv), a);
} else {
// hk = stringiter(ha, hk)
on = syslook("stringiter", 0);
@@ -3403,6 +3401,16 @@ strng:
}
n->nincr = list(n->nincr, a);
+ // k,ohk[,v] = ohk,hk,[,hv]
+ a = nod(OAS, k, ohk);
+ n->nbody = a;
+ a = nod(OAS, ohk, hk);
+ n->nbody = list(n->nbody, a);
+ if(v != N) {
+ a = nod(OAS, v, hv);
+ n->nbody = list(n->nbody, a);
+ }
+
addtotop(n);
goto out;