summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2003-10-25 14:29:27 (GMT)
committerArmin Rigo <arigo@tunes.org>2003-10-25 14:29:27 (GMT)
commit092381a9799ebadba1199eb83e40f880a9bb58ee (patch)
treeaf171af09cf5f404fc9a6101953b8f5038e95b5e /Python/ceval.c
parent8ed69e3389f7caf4a4f9f6ba5a09a618a528484b (diff)
downloadcpython-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.c48
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;