Removed another occurrence of PyInt_ExactCheck()

I've modified the semantic of PyTraceBack_Print and sys.tracebacklimit slightly. Overfloats or values <= 0 are replaced with a default value to avoid infinite recursion and other issues.
This commit is contained in:
Christian Heimes 2007-12-04 21:55:18 +00:00
parent 3267f8725a
commit 0fbab7ff8d
1 changed files with 23 additions and 4 deletions

View File

@ -242,12 +242,15 @@ tb_printinternal(PyTracebackObject *tb, PyObject *f, int limit)
return err;
}
#define PyTraceBack_LIMIT 1000
int
PyTraceBack_Print(PyObject *v, PyObject *f)
{
int err;
PyObject *limitv;
int limit = 1000;
int limit = PyTraceBack_LIMIT;
if (v == NULL)
return 0;
if (!PyTraceBack_Check(v)) {
@ -255,10 +258,26 @@ PyTraceBack_Print(PyObject *v, PyObject *f)
return -1;
}
limitv = PySys_GetObject("tracebacklimit");
if (limitv && PyInt_CheckExact(limitv)) {
if (limitv) {
PyObject *exc_type, *exc_value, *exc_tb;
PyErr_Fetch(&exc_type, &exc_value, &exc_tb);
limit = PyLong_AsLong(limitv);
if (limit <= 0)
return 0;
if (limit == -1 && PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
limit = PyTraceBack_LIMIT;
}
else {
Py_XDECREF(exc_type);
Py_XDECREF(exc_value);
Py_XDECREF(exc_tb);
return 0;
}
}
else if (limit <= 0) {
limit = PyTraceBack_LIMIT;
}
PyErr_Restore(exc_type, exc_value, exc_tb);
}
err = PyFile_WriteString("Traceback (most recent call last):\n", f);
if (!err)