summaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-04-01 22:31:27 -0700
committerRuss Cox <rsc@golang.org>2010-04-01 22:31:27 -0700
commitfb96dda6e66ab75e6cbcdfad2575fddd49eb5857 (patch)
tree285fdef711a90a79f5cabf60b35dfe3b877702a0 /src/cmd
parentc536850d434ae3dd242417175287cd74c47d9063 (diff)
downloadgolang-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.c4
-rw-r--r--src/cmd/5g/gg.h4
-rw-r--r--src/cmd/5g/ggen.c80
-rw-r--r--src/cmd/5g/gsubr.c4
-rw-r--r--src/cmd/6g/cgen.c4
-rw-r--r--src/cmd/6g/gg.h4
-rw-r--r--src/cmd/6g/ggen.c8
-rw-r--r--src/cmd/6g/gsubr.c6
-rw-r--r--src/cmd/6g/reg.c6
-rw-r--r--src/cmd/8g/cgen.c4
-rw-r--r--src/cmd/8g/gg.h4
-rw-r--r--src/cmd/8g/ggen.c8
-rw-r--r--src/cmd/8g/reg.c6
-rw-r--r--src/cmd/cov/main.c4
-rw-r--r--src/cmd/gc/builtin.c.boot3
-rw-r--r--src/cmd/gc/print.c5
-rw-r--r--src/cmd/gc/runtime.go3
-rw-r--r--src/cmd/gc/walk.c7
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;