mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
Issue #22462: Fix pyexpat's creation of a dummy frame to make it appear in exception tracebacks.
Initial patch by Mark Shannon.
This commit is contained in:
commit
94262ebc9c
8 changed files with 63 additions and 161 deletions
|
@ -142,6 +142,39 @@ PyTraceBack_Here(PyFrameObject *frame)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Insert a frame into the traceback for (funcname, filename, lineno). */
|
||||
void _PyTraceback_Add(char *funcname, char *filename, int lineno)
|
||||
{
|
||||
PyObject *globals = NULL;
|
||||
PyCodeObject *code = NULL;
|
||||
PyFrameObject *frame = NULL;
|
||||
PyObject *exception, *value, *tb;
|
||||
|
||||
/* Save and clear the current exception. Python functions must not be
|
||||
called with an exception set. Calling Python functions happens when
|
||||
the codec of the filesystem encoding is implemented in pure Python. */
|
||||
PyErr_Fetch(&exception, &value, &tb);
|
||||
|
||||
globals = PyDict_New();
|
||||
if (!globals)
|
||||
goto done;
|
||||
code = PyCode_NewEmpty(filename, funcname, lineno);
|
||||
if (!code)
|
||||
goto done;
|
||||
frame = PyFrame_New(PyThreadState_Get(), code, globals, NULL);
|
||||
if (!frame)
|
||||
goto done;
|
||||
frame->f_lineno = lineno;
|
||||
|
||||
PyErr_Restore(exception, value, tb);
|
||||
PyTraceBack_Here(frame);
|
||||
|
||||
done:
|
||||
Py_XDECREF(globals);
|
||||
Py_XDECREF(code);
|
||||
Py_XDECREF(frame);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
_Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *io)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue