diff options
author | Guido van Rossum <guido@python.org> | 1997-01-24 04:19:24 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-01-24 04:19:24 (GMT) |
commit | 8c5df06ec7f11e5a219cc1457de2a962ec6925c7 (patch) | |
tree | c919396dce63ce71565d47fe7178cc9079399b29 /Python | |
parent | 43f1b8d6e4813f171d74c3c5e2c495e041afabef (diff) | |
download | cpython-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')
-rw-r--r-- | Python/ceval.c | 40 |
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; } |