summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-10-19 20:39:18 -0700
committerRuss Cox <rsc@golang.org>2009-10-19 20:39:18 -0700
commitf8efa6a67cab7b25f64421c27a2f2d822361a20e (patch)
tree4ed63956ed55179bf39dbcc5cf471bf3153be6fc /src
parentcbc80ae3168885117ccdc7f17df25efad3bc1be8 (diff)
downloadgolang-f8efa6a67cab7b25f64421c27a2f2d822361a20e.tar.gz
bug136
R=ken OCL=35902 CL=35904
Diffstat (limited to 'src')
-rw-r--r--src/cmd/gc/gen.c30
-rw-r--r--src/cmd/gc/go.h5
-rw-r--r--src/cmd/gc/go.y2
3 files changed, 10 insertions, 27 deletions
diff --git a/src/cmd/gc/gen.c b/src/cmd/gc/gen.c
index e5799a08b..bb1b19bfc 100644
--- a/src/cmd/gc/gen.c
+++ b/src/cmd/gc/gen.c
@@ -62,7 +62,7 @@ allocparams(void)
}
void
-newlab(int op, Sym *s)
+newlab(int op, Sym *s, Node *stmt)
{
Label *lab;
@@ -73,6 +73,7 @@ newlab(int op, Sym *s)
lab->sym = s;
lab->op = op;
lab->label = pc;
+ lab->stmt = stmt;
}
void
@@ -88,7 +89,6 @@ checklabels(void)
for(l=labellist; l!=L; l=l->link) {
switch(l->op) {
- case OFOR:
case OLABEL:
// these are definitions -
s = l->sym;
@@ -96,7 +96,6 @@ checklabels(void)
if(m->sym != s)
continue;
switch(m->op) {
- case OFOR:
case OLABEL:
// these are definitions -
// look for redefinitions
@@ -120,21 +119,6 @@ checklabels(void)
yyerror("label %S not defined", l->sym);
}
-Label*
-findlab(Sym *s)
-{
- Label *l;
-
- for(l=labellist; l!=L; l=l->link) {
- if(l->sym != s)
- continue;
- if(l->op != OFOR)
- continue;
- return l;
- }
- return L;
-}
-
/*
* compile statements
*/
@@ -191,11 +175,11 @@ gen(Node *n)
break;
case OLABEL:
- newlab(OLABEL, n->left->sym);
+ newlab(OLABEL, n->left->sym, n->right);
break;
case OGOTO:
- newlab(OGOTO, n->left->sym);
+ newlab(OGOTO, n->left->sym, N);
gjmp(P);
break;
@@ -252,7 +236,7 @@ gen(Node *n)
continpc = pc;
// define break and continue labels
- if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL) {
+ if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL && lab->stmt == n) {
lab->breakpc = breakpc;
lab->continpc = continpc;
}
@@ -291,7 +275,7 @@ gen(Node *n)
breakpc = gjmp(P); // break: goto done
// define break label
- if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL)
+ if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL && lab->stmt == n)
lab->breakpc = breakpc;
patch(p1, pc); // test:
@@ -306,7 +290,7 @@ gen(Node *n)
breakpc = gjmp(P); // break: goto done
// define break label
- if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL)
+ if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL && lab->stmt == n)
lab->breakpc = breakpc;
patch(p1, pc); // test:
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 2aa3b3e92..35f90a8f7 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -1089,6 +1089,7 @@ struct Label
{
uchar op; // OGOTO/OLABEL
Sym* sym;
+ Node* stmt;
Prog* label; // pointer to code
Prog* breakpc; // pointer to code
Prog* continpc; // pointer to code
@@ -1097,7 +1098,6 @@ struct Label
#define L ((Label*)0)
EXTERN Label* labellist;
-EXTERN Label* findlab(Sym*);
typedef struct Plist Plist;
struct Plist
@@ -1126,10 +1126,9 @@ void cgen_callmeth(Node *n, int proc);
void cgen_dcl(Node *n);
void cgen_proc(Node *n, int proc);
void checklabels(void);
-Label* findlab(Sym *s);
void gen(Node *n);
void genlist(NodeList *l);
-void newlab(int op, Sym *s);
+void newlab(int op, Sym *s, Node*);
Node* sysfunc(char *name);
Plist* newplist(void);
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index 02e941c16..e9a35171d 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -1380,7 +1380,7 @@ stmt:
{
NodeList *l;
- l = list1(nod(OLABEL, $1, N));
+ l = list1(nod(OLABEL, $1, $3));
if($3)
l = list(l, $3);
$$ = liststmt(l);