diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2014-10-08 18:00:09 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2014-10-08 18:00:09 (GMT) |
commit | 0ddbf4795f40d2d3386dc56ffa264b50a015f6c9 (patch) | |
tree | ad87573215721b20a0160dacbe8dc0f423e56c1c /Python/traceback.c | |
parent | b2fdafe3d2ac643b635d3b89429818e6036e8925 (diff) | |
download | cpython-0ddbf4795f40d2d3386dc56ffa264b50a015f6c9.zip cpython-0ddbf4795f40d2d3386dc56ffa264b50a015f6c9.tar.gz cpython-0ddbf4795f40d2d3386dc56ffa264b50a015f6c9.tar.bz2 |
Issue #22462: Fix pyexpat's creation of a dummy frame to make it appear in exception tracebacks.
Initial patch by Mark Shannon.
Diffstat (limited to 'Python/traceback.c')
-rw-r--r-- | Python/traceback.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/Python/traceback.c b/Python/traceback.c index 2ece192..bbe6f2e 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -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) { |