summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-01-24 04:19:24 (GMT)
committerGuido van Rossum <guido@python.org>1997-01-24 04:19:24 (GMT)
commit8c5df06ec7f11e5a219cc1457de2a962ec6925c7 (patch)
treec919396dce63ce71565d47fe7178cc9079399b29 /Python/ceval.c
parent43f1b8d6e4813f171d74c3c5e2c495e041afabef (diff)
downloadcpython-8c5df06ec7f11e5a219cc1457de2a962ec6925c7.zip
cpython-8c5df06ec7f11e5a219cc1457de2a962ec6925c7.tar.gz
cpython-8c5df06ec7f11e5a219cc1457de2a962ec6925c7.tar.bz2
Change the control flow for error handling in the function prelude to
jump to the "Kill locals" section at the end. Add #ifdef macintosh bandaid to make sure we call sigcheck() on the Mac.
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c40
1 files changed, 17 insertions, 23 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 3d2375c..5b97244 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -409,6 +409,10 @@ eval_code2(co, globals, locals,
kwdict = newmappingobject();
if (kwdict == NULL)
goto fail;
+ i = co->co_argcount;
+ if (co->co_flags & CO_VARARGS)
+ i++;
+ SETLOCAL(i, kwdict);
}
if (argcount > co->co_argcount) {
if (!(co->co_flags & CO_VARARGS)) {
@@ -424,12 +428,14 @@ eval_code2(co, globals, locals,
}
if (co->co_flags & CO_VARARGS) {
u = newtupleobject(argcount - n);
+ if (u == NULL)
+ goto fail;
+ SETLOCAL(co->co_argcount, u);
for (i = n; i < argcount; i++) {
x = args[i];
INCREF(x);
SETTUPLEITEM(u, i-n, x);
}
- SETLOCAL(co->co_argcount, u);
}
for (i = 0; i < kwcount; i++) {
object *keyword = kws[2*i];
@@ -479,25 +485,11 @@ eval_code2(co, globals, locals,
}
}
}
- if (kwdict != NULL) {
- i = co->co_argcount;
- if (co->co_flags & CO_VARARGS)
- i++;
- SETLOCAL(i, kwdict);
- }
- if (0) {
- fail:
- XDECREF(kwdict);
- goto fail2;
- }
}
else {
if (argcount > 0 || kwcount > 0) {
err_setstr(TypeError, "no arguments expected");
- fail2:
- current_frame = f->f_back;
- DECREF(f);
- return NULL;
+ goto fail;
}
}
@@ -517,9 +509,7 @@ eval_code2(co, globals, locals,
if (call_trace(&sys_trace, &f->f_trace, f, "call",
None/*XXX how to compute arguments now?*/)) {
/* Trace function raised an error */
- current_frame = f->f_back;
- DECREF(f);
- return NULL;
+ goto fail;
}
}
@@ -528,9 +518,7 @@ eval_code2(co, globals, locals,
itself and isn't called for "line" events */
if (call_trace(&sys_profile, (object**)0, f, "call",
None/*XXX*/)) {
- current_frame = f->f_back;
- DECREF(f);
- return NULL;
+ goto fail;
}
}
@@ -567,6 +555,9 @@ eval_code2(co, globals, locals,
goto on_error;
}
}
+#ifdef macintosh
+#undef HAVE_SIGNAL_H
+#endif
#ifndef HAVE_SIGNAL_H /* Is this the right #define? */
/* If we have true signals, the signal handler will call
Py_AddPendingCall() so we don't have to call sigcheck().
@@ -1697,6 +1688,10 @@ eval_code2(co, globals, locals,
}
}
+ --recursion_depth;
+
+ fail: /* Jump here from prelude on failure */
+
/* Kill all local variables */
{
@@ -1713,7 +1708,6 @@ eval_code2(co, globals, locals,
current_frame = f->f_back;
DECREF(f);
- --recursion_depth;
return retval;
}