diff options
| author | Russ Cox <rsc@golang.org> | 2009-10-19 20:39:18 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-10-19 20:39:18 -0700 |
| commit | f8efa6a67cab7b25f64421c27a2f2d822361a20e (patch) | |
| tree | 4ed63956ed55179bf39dbcc5cf471bf3153be6fc /src | |
| parent | cbc80ae3168885117ccdc7f17df25efad3bc1be8 (diff) | |
| download | golang-f8efa6a67cab7b25f64421c27a2f2d822361a20e.tar.gz | |
bug136
R=ken
OCL=35902
CL=35904
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/gc/gen.c | 30 | ||||
| -rw-r--r-- | src/cmd/gc/go.h | 5 | ||||
| -rw-r--r-- | src/cmd/gc/go.y | 2 |
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); |
