diff options
author | Russ Cox <rsc@golang.org> | 2010-03-31 11:46:01 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-03-31 11:46:01 -0700 |
commit | ea38be0512395c8f81417fb75ce98664d9329b9b (patch) | |
tree | 6fd09575dcc2abccf75c017828b45ddbb98c3e88 /src/cmd/5g/ggen.c | |
parent | 867aa94eb6c414512801b14f5931dc27d51cd3d4 (diff) | |
download | golang-ea38be0512395c8f81417fb75ce98664d9329b9b.tar.gz |
gc: implement panic and recover
R=ken2, r, ken3
CC=golang-dev
http://codereview.appspot.com/831042
Diffstat (limited to 'src/cmd/5g/ggen.c')
-rw-r--r-- | src/cmd/5g/ggen.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c index 50c90912e..5831d597e 100644 --- a/src/cmd/5g/ggen.c +++ b/src/cmd/5g/ggen.c @@ -190,7 +190,7 @@ ginscall(Node *f, int proc) break; - case 2: // defered call (defer) + case 2: // deferred call (defer) regalloc(&r, types[tptr], N); p = gins(AMOVW, N, &r); p->from.type = D_OREG; @@ -222,7 +222,7 @@ ginscall(Node *f, int proc) ginscall(deferproc, 0); - regalloc(&r, types[tptr], N); + nodreg(&r, types[tptr], D_R1); p = gins(AMOVW, N, &r); p->from.type = D_OREG; p->from.reg = REGSP; @@ -233,8 +233,13 @@ ginscall(Node *f, int proc) p->to.reg = REGSP; p->to.offset = 8; p->scond |= C_WBIT; - regfree(&r); - + + if(proc == 2) { + nodconst(&con, types[TINT32], 0); + nodreg(&r, types[tptr], D_R0); + gins(ACMP, &con, &r); + patch(gbranch(ABNE, T), pret); + } break; } } |