diff options
| author | Russ Cox <rsc@golang.org> | 2010-04-01 22:31:27 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2010-04-01 22:31:27 -0700 |
| commit | fb96dda6e66ab75e6cbcdfad2575fddd49eb5857 (patch) | |
| tree | 285fdef711a90a79f5cabf60b35dfe3b877702a0 /src/cmd | |
| parent | c536850d434ae3dd242417175287cd74c47d9063 (diff) | |
| download | golang-fb96dda6e66ab75e6cbcdfad2575fddd49eb5857.tar.gz | |
runtime: turn run time errors checks into panics
R=ken2, r
CC=golang-dev
http://codereview.appspot.com/871042
Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/5g/cgen.c | 4 | ||||
| -rw-r--r-- | src/cmd/5g/gg.h | 4 | ||||
| -rw-r--r-- | src/cmd/5g/ggen.c | 80 | ||||
| -rw-r--r-- | src/cmd/5g/gsubr.c | 4 | ||||
| -rw-r--r-- | src/cmd/6g/cgen.c | 4 | ||||
| -rw-r--r-- | src/cmd/6g/gg.h | 4 | ||||
| -rw-r--r-- | src/cmd/6g/ggen.c | 8 | ||||
| -rw-r--r-- | src/cmd/6g/gsubr.c | 6 | ||||
| -rw-r--r-- | src/cmd/6g/reg.c | 6 | ||||
| -rw-r--r-- | src/cmd/8g/cgen.c | 4 | ||||
| -rw-r--r-- | src/cmd/8g/gg.h | 4 | ||||
| -rw-r--r-- | src/cmd/8g/ggen.c | 8 | ||||
| -rw-r--r-- | src/cmd/8g/reg.c | 6 | ||||
| -rw-r--r-- | src/cmd/cov/main.c | 4 | ||||
| -rw-r--r-- | src/cmd/gc/builtin.c.boot | 3 | ||||
| -rw-r--r-- | src/cmd/gc/print.c | 5 | ||||
| -rw-r--r-- | src/cmd/gc/runtime.go | 3 | ||||
| -rw-r--r-- | src/cmd/gc/walk.c | 7 |
18 files changed, 58 insertions, 106 deletions
diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c index ce931600e..cf701a50a 100644 --- a/src/cmd/5g/cgen.c +++ b/src/cmd/5g/cgen.c @@ -573,7 +573,7 @@ agen(Node *n, Node *res) regfree(&n4); regfree(&n5); p1 = gbranch(optoas(OGT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } @@ -627,7 +627,7 @@ agen(Node *n, Node *res) gcmp(optoas(OCMP, types[TUINT32]), &n2, &n4); regfree(&n4); p1 = gbranch(optoas(OLT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } diff --git a/src/cmd/5g/gg.h b/src/cmd/5g/gg.h index 6477452b9..c62efeb6c 100644 --- a/src/cmd/5g/gg.h +++ b/src/cmd/5g/gg.h @@ -60,8 +60,8 @@ EXTERN Node* curfn; EXTERN Node* newproc; EXTERN Node* deferproc; EXTERN Node* deferreturn; -EXTERN Node* throwindex; -EXTERN Node* throwslice; +EXTERN Node* panicindex; +EXTERN Node* panicslice; EXTERN Node* throwreturn; EXTERN long unmappedzero; EXTERN int maxstksize; diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c index 5831d597e..3243bb863 100644 --- a/src/cmd/5g/ggen.c +++ b/src/cmd/5g/ggen.c @@ -23,8 +23,8 @@ compile(Node *fn) newproc = sysfunc("newproc"); deferproc = sysfunc("deferproc"); deferreturn = sysfunc("deferreturn"); - throwindex = sysfunc("throwindex"); - throwslice = sysfunc("throwslice"); + panicindex = sysfunc("panicindex"); + panicslice = sysfunc("panicslice"); throwreturn = sysfunc("throwreturn"); } @@ -142,8 +142,8 @@ ginscall(Node *f, int proc) afunclit(&p->to); break; - // TODO(kaib): unify newproc and defer if you can figure out how not to break things case 1: // call in new proc (go) + case 2: // deferred call (defer) regalloc(&r, types[tptr], N); p = gins(AMOVW, N, &r); p->from.type = D_OREG; @@ -173,71 +173,23 @@ ginscall(Node *f, int proc) p->to.offset = 4; regfree(&r); - ginscall(newproc, 0); - - regalloc(&r, types[tptr], N); - p = gins(AMOVW, N, &r); - p->from.type = D_OREG; - p->from.reg = REGSP; - p->from.offset = 0; - - p = gins(AMOVW, &r, N); - p->to.type = D_OREG; - p->to.reg = REGSP; - p->to.offset = 12; - p->scond |= C_WBIT; - regfree(&r); - - break; + if(proc == 1) + ginscall(newproc, 0); + else + ginscall(deferproc, 0); - case 2: // deferred call (defer) - regalloc(&r, types[tptr], N); - p = gins(AMOVW, N, &r); - p->from.type = D_OREG; + nodreg(&r, types[tptr], 1); + p = gins(AMOVW, N, N); + p->from.type = D_CONST; p->from.reg = REGSP; - - p = gins(AMOVW, &r, N); - p->to.type = D_OREG; + p->from.offset = 12; p->to.reg = REGSP; - p->to.offset = -8; - p->scond |= C_WBIT; + p->to.type = D_REG; - memset(&n1, 0, sizeof n1); - n1.op = OADDR; - n1.left = f; - gins(AMOVW, &n1, &r); - - p = gins(AMOVW, &r, N); - p->to.type = D_OREG; - p->to.reg = REGSP; - p->to.offset = 8; - - nodconst(&con, types[TINT32], argsize(f->type)); - gins(AMOVW, &con, &r); - p = gins(AMOVW, &r, N); - p->to.type = D_OREG; - p->to.reg = REGSP; - p->to.offset = 4; - regfree(&r); - - ginscall(deferproc, 0); - - nodreg(&r, types[tptr], D_R1); - p = gins(AMOVW, N, &r); - p->from.type = D_OREG; - p->from.reg = REGSP; - p->from.offset = 0; - - p = gins(AMOVW, &r, N); - p->to.type = D_OREG; - p->to.reg = REGSP; - p->to.offset = 8; - p->scond |= C_WBIT; - if(proc == 2) { nodconst(&con, types[TINT32], 0); - nodreg(&r, types[tptr], D_R0); - gins(ACMP, &con, &r); + p = gins(ACMP, &con, N); + p->reg = 0; patch(gbranch(ABNE, T), pret); } break; @@ -773,7 +725,7 @@ cmpandthrow(Node *nl, Node *nr) if(cl > cr) { if(throwpc == nil) { throwpc = pc; - ginscall(throwslice, 0); + ginscall(panicslice, 0); } else patch(gbranch(AB, T), throwpc); } @@ -807,7 +759,7 @@ cmpandthrow(Node *nl, Node *nr) if(throwpc == nil) { p1 = gbranch(optoas(op, types[TUINT32]), T); throwpc = pc; - ginscall(throwslice, 0); + ginscall(panicslice, 0); patch(p1, pc); } else { op = brcom(op); diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c index ad9cad67e..ef7815747 100644 --- a/src/cmd/5g/gsubr.c +++ b/src/cmd/5g/gsubr.c @@ -1724,7 +1724,7 @@ oindex: gcmp(optoas(OCMP, types[TUINT32]), reg1, &n3); regfree(&n3); p1 = gbranch(optoas(OLT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } @@ -1780,7 +1780,7 @@ oindex_const: regfree(&n4); regfree(&n3); p1 = gbranch(optoas(OGT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c index 05e36d2a7..30c190429 100644 --- a/src/cmd/6g/cgen.c +++ b/src/cmd/6g/cgen.c @@ -527,7 +527,7 @@ agen(Node *n, Node *res) nodconst(&n2, types[TUINT64], v); gins(optoas(OCMP, types[TUINT32]), &n1, &n2); p1 = gbranch(optoas(OGT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } @@ -573,7 +573,7 @@ agen(Node *n, Node *res) nodconst(&n1, types[TUINT64], nl->type->bound); gins(optoas(OCMP, types[TUINT32]), &n2, &n1); p1 = gbranch(optoas(OLT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } diff --git a/src/cmd/6g/gg.h b/src/cmd/6g/gg.h index 34b28c057..875c77358 100644 --- a/src/cmd/6g/gg.h +++ b/src/cmd/6g/gg.h @@ -54,8 +54,8 @@ EXTERN Node* curfn; EXTERN Node* newproc; EXTERN Node* deferproc; EXTERN Node* deferreturn; -EXTERN Node* throwindex; -EXTERN Node* throwslice; +EXTERN Node* panicindex; +EXTERN Node* panicslice; EXTERN Node* throwreturn; EXTERN vlong unmappedzero; diff --git a/src/cmd/6g/ggen.c b/src/cmd/6g/ggen.c index 10cd58293..a92d94572 100644 --- a/src/cmd/6g/ggen.c +++ b/src/cmd/6g/ggen.c @@ -23,8 +23,8 @@ compile(Node *fn) newproc = sysfunc("newproc"); deferproc = sysfunc("deferproc"); deferreturn = sysfunc("deferreturn"); - throwindex = sysfunc("throwindex"); - throwslice = sysfunc("throwslice"); + panicindex = sysfunc("panicindex"); + panicslice = sysfunc("panicslice"); throwreturn = sysfunc("throwreturn"); } @@ -1119,7 +1119,7 @@ cmpandthrow(Node *nl, Node *nr) if(cl > cr) { if(throwpc == nil) { throwpc = pc; - ginscall(throwslice, 0); + ginscall(panicslice, 0); } else patch(gbranch(AJMP, T), throwpc); } @@ -1137,7 +1137,7 @@ cmpandthrow(Node *nl, Node *nr) if(throwpc == nil) { p1 = gbranch(optoas(op, types[TUINT32]), T); throwpc = pc; - ginscall(throwslice, 0); + ginscall(panicslice, 0); patch(p1, pc); } else { op = brcom(op); diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c index c5f4dbe45..e9ad6c094 100644 --- a/src/cmd/6g/gsubr.c +++ b/src/cmd/6g/gsubr.c @@ -1867,7 +1867,7 @@ oindex: } gins(optoas(OCMP, types[TUINT32]), reg1, &n2); p1 = gbranch(optoas(OLT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } @@ -1924,7 +1924,7 @@ oindex_const: nodconst(&n2, types[TUINT64], v); gins(optoas(OCMP, types[TUINT32]), &n1, &n2); p1 = gbranch(optoas(OGT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } @@ -1958,7 +1958,7 @@ oindex_const_sudo: p1 = gins(optoas(OCMP, types[TUINT32]), N, &n2); p1->from = *a; p1 = gbranch(optoas(OGT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); a->offset -= Array_nel; } diff --git a/src/cmd/6g/reg.c b/src/cmd/6g/reg.c index c8dd9a3ee..10a00b38d 100644 --- a/src/cmd/6g/reg.c +++ b/src/cmd/6g/reg.c @@ -1555,10 +1555,10 @@ noreturn(Prog *p) int i; if(symlist[0] == S) { - symlist[0] = pkglookup("throwindex", runtimepkg); - symlist[1] = pkglookup("throwslice", runtimepkg); + symlist[0] = pkglookup("panicindex", runtimepkg); + symlist[1] = pkglookup("panicslice", runtimepkg); symlist[2] = pkglookup("throwinit", runtimepkg); - symlist[3] = pkglookup("panicl", runtimepkg); + symlist[3] = pkglookup("panic", runtimepkg); } s = p->to.sym; diff --git a/src/cmd/8g/cgen.c b/src/cmd/8g/cgen.c index 6a2122507..d7a5ab33a 100644 --- a/src/cmd/8g/cgen.c +++ b/src/cmd/8g/cgen.c @@ -549,7 +549,7 @@ agen(Node *n, Node *res) nodconst(&n2, types[TUINT32], v); gins(optoas(OCMP, types[TUINT32]), &n1, &n2); p1 = gbranch(optoas(OGT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } @@ -595,7 +595,7 @@ agen(Node *n, Node *res) nodconst(&n1, types[TUINT32], nl->type->bound); gins(optoas(OCMP, types[TUINT32]), &n2, &n1); p1 = gbranch(optoas(OLT, types[TUINT32]), T); - ginscall(throwindex, 0); + ginscall(panicindex, 0); patch(p1, pc); } diff --git a/src/cmd/8g/gg.h b/src/cmd/8g/gg.h index fcef11c3e..a00d69711 100644 --- a/src/cmd/8g/gg.h +++ b/src/cmd/8g/gg.h @@ -64,8 +64,8 @@ EXTERN Node* curfn; EXTERN Node* newproc; EXTERN Node* deferproc; EXTERN Node* deferreturn; -EXTERN Node* throwindex; -EXTERN Node* throwslice; +EXTERN Node* panicindex; +EXTERN Node* panicslice; EXTERN Node* throwreturn; EXTERN int maxstksize; extern uint32 unmappedzero; diff --git a/src/cmd/8g/ggen.c b/src/cmd/8g/ggen.c index 193058e20..c1cad74be 100644 --- a/src/cmd/8g/ggen.c +++ b/src/cmd/8g/ggen.c @@ -23,8 +23,8 @@ compile(Node *fn) newproc = sysfunc("newproc"); deferproc = sysfunc("deferproc"); deferreturn = sysfunc("deferreturn"); - throwindex = sysfunc("throwindex"); - throwslice = sysfunc("throwslice"); + panicindex = sysfunc("panicindex"); + panicslice = sysfunc("panicslice"); throwreturn = sysfunc("throwreturn"); } @@ -824,7 +824,7 @@ cmpandthrow(Node *nl, Node *nr) if(cl > cr) { if(throwpc == nil) { throwpc = pc; - ginscall(throwslice, 0); + ginscall(panicslice, 0); } else patch(gbranch(AJMP, T), throwpc); } @@ -842,7 +842,7 @@ cmpandthrow(Node *nl, Node *nr) if(throwpc == nil) { p1 = gbranch(optoas(op, types[TUINT32]), T); throwpc = pc; - ginscall(throwslice, 0); + ginscall(panicslice, 0); patch(p1, pc); } else { op = brcom(op); diff --git a/src/cmd/8g/reg.c b/src/cmd/8g/reg.c index 50f47d9ca..e23205c68 100644 --- a/src/cmd/8g/reg.c +++ b/src/cmd/8g/reg.c @@ -1447,10 +1447,10 @@ noreturn(Prog *p) int i; if(symlist[0] == S) { - symlist[0] = pkglookup("throwindex", runtimepkg); - symlist[1] = pkglookup("throwslice", runtimepkg); + symlist[0] = pkglookup("panicindex", runtimepkg); + symlist[1] = pkglookup("panicslice", runtimepkg); symlist[2] = pkglookup("throwinit", runtimepkg); - symlist[3] = pkglookup("panicl", runtimepkg); + symlist[3] = pkglookup("panic", runtimepkg); } s = p->to.sym; diff --git a/src/cmd/cov/main.c b/src/cmd/cov/main.c index 899d8163f..1b3138a7f 100644 --- a/src/cmd/cov/main.c +++ b/src/cmd/cov/main.c @@ -201,10 +201,10 @@ missing(uvlong pc, uvlong epc) } if(epc - pc == 5) { - // check for CALL sys.throwindex + // check for CALL sys.panicindex buf[0] = 0; machdata->das(text, pc, 0, buf, sizeof buf); - if(strstr(buf, "throwindex")) + if(strstr(buf, "panicindex")) return; } diff --git a/src/cmd/gc/builtin.c.boot b/src/cmd/gc/builtin.c.boot index 59a917a9a..94efa412b 100644 --- a/src/cmd/gc/builtin.c.boot +++ b/src/cmd/gc/builtin.c.boot @@ -1,7 +1,8 @@ char *runtimeimport = "package runtime\n" "func \"\".mal (? int32) *any\n" - "func \"\".throwindex ()\n" + "func \"\".panicindex ()\n" + "func \"\".panicslice ()\n" "func \"\".throwreturn ()\n" "func \"\".throwinit ()\n" "func \"\".panic (? interface { })\n" diff --git a/src/cmd/gc/print.c b/src/cmd/gc/print.c index 79c0e3720..f9799c523 100644 --- a/src/cmd/gc/print.c +++ b/src/cmd/gc/print.c @@ -276,7 +276,10 @@ exprfmt(Fmt *f, Node *n, int prec) case ODOTTYPE: exprfmt(f, n->left, 7); fmtprint(f, ".("); - exprfmt(f, n->right, 0); + if(n->right != N) + exprfmt(f, n->right, 0); + else + fmtprint(f, "%T", n->type); fmtprint(f, ")"); break; diff --git a/src/cmd/gc/runtime.go b/src/cmd/gc/runtime.go index ba79ab92d..e08e1f601 100644 --- a/src/cmd/gc/runtime.go +++ b/src/cmd/gc/runtime.go @@ -11,7 +11,8 @@ package PACKAGE // emitted by compiler, not referred to by go programs func mal(int32) *any -func throwindex() +func panicindex() +func panicslice() func throwreturn() func throwinit() diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 37b5efa6f..ced798e6b 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -1846,8 +1846,6 @@ walkprint(Node *nn, NodeList **init, int defer) if(defer) { if(op == OPRINTN) fmtprint(&fmt, "\n"); - if(op == OPANIC) - fmtprint(&fmt, "%%!"); on = syslook("printf", 1); on->type = functype(nil, intypes, nil); args->n = nod(OLITERAL, N, N); @@ -1863,10 +1861,7 @@ walkprint(Node *nn, NodeList **init, int defer) typechecklist(calls, Etop); walkexprlist(calls, init); - if(op == OPANIC) - r = mkcall("panicl", T, nil); - else - r = nod(OEMPTY, N, N); + r = nod(OEMPTY, N, N); typecheck(&r, Etop); walkexpr(&r, init); r->ninit = calls; |
