diff options
author | Armin Rigo <arigo@tunes.org> | 2003-10-25 14:29:27 (GMT) |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2003-10-25 14:29:27 (GMT) |
commit | 092381a9799ebadba1199eb83e40f880a9bb58ee (patch) | |
tree | af171af09cf5f404fc9a6101953b8f5038e95b5e /Python/ceval.c | |
parent | 8ed69e3389f7caf4a4f9f6ba5a09a618a528484b (diff) | |
download | cpython-092381a9799ebadba1199eb83e40f880a9bb58ee.zip cpython-092381a9799ebadba1199eb83e40f880a9bb58ee.tar.gz cpython-092381a9799ebadba1199eb83e40f880a9bb58ee.tar.bz2 |
Made function declaration a proper C prototype
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index e6b7424..59054a6 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -510,6 +510,29 @@ Py_SetRecursionLimit(int new_limit) recursion_limit = new_limit; } +int +_Py_CheckRecursiveCall(char *where) +{ + PyThreadState *tstate = PyThreadState_GET(); + +#ifdef USE_STACKCHECK + if (PyOS_CheckStack()) { + --tstate->recursion_depth; + PyErr_SetString(PyExc_MemoryError, "Stack overflow"); + return -1; + } +#endif + if (tstate->recursion_depth > recursion_limit) { + --tstate->recursion_depth; + PyErr_Format(PyExc_RuntimeError, + "maximum recursion depth exceeded%s", + where); + return -1; + } + return 0; +} + + /* Status code for main loop (reason for stack unwind) */ enum why_code { @@ -674,21 +697,9 @@ eval_frame(PyFrameObject *f) if (f == NULL) return NULL; -#ifdef USE_STACKCHECK - if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) { - PyErr_SetString(PyExc_MemoryError, "Stack overflow"); - return NULL; - } -#endif - /* push frame */ - if (++tstate->recursion_depth > recursion_limit) { - --tstate->recursion_depth; - PyErr_SetString(PyExc_RuntimeError, - "maximum recursion depth exceeded"); - tstate->frame = f->f_back; + if (Py_EnterRecursiveCall("")) return NULL; - } tstate->frame = f; @@ -710,9 +721,7 @@ eval_frame(PyFrameObject *f) if (call_trace(tstate->c_tracefunc, tstate->c_traceobj, f, PyTrace_CALL, Py_None)) { /* Trace function raised an error */ - --tstate->recursion_depth; - tstate->frame = f->f_back; - return NULL; + goto exit_eval_frame; } } if (tstate->c_profilefunc != NULL) { @@ -722,9 +731,7 @@ eval_frame(PyFrameObject *f) tstate->c_profileobj, f, PyTrace_CALL, Py_None)) { /* Profile function raised an error */ - --tstate->recursion_depth; - tstate->frame = f->f_back; - return NULL; + goto exit_eval_frame; } } } @@ -2428,7 +2435,8 @@ eval_frame(PyFrameObject *f) reset_exc_info(tstate); /* pop frame */ - --tstate->recursion_depth; + exit_eval_frame: + Py_LeaveRecursiveCall(); tstate->frame = f->f_back; return retval; |