void PyErr_SyntaxLocation(const char *filename, int lineno) { PyObject *exc, *v, *tb, *tmp; /* add attributes for the line number and filename for the error */ PyErr_Fetch(&exc, &v, &tb); PyErr_NormalizeException(&exc, &v, &tb); /* XXX check that it is, indeed, a syntax error. It might not * be, though. */ tmp = PyInt_FromLong(lineno); if (tmp == NULL) PyErr_Clear(); else { if (PyObject_SetAttrString(v, "lineno", tmp)) PyErr_Clear(); Py_DECREF(tmp); } if (filename != NULL) { tmp = PyString_FromString(filename); if (tmp == NULL) PyErr_Clear(); else { if (PyObject_SetAttrString(v, "filename", tmp)) PyErr_Clear(); Py_DECREF(tmp); } tmp = PyErr_ProgramText(filename, lineno); if (tmp) { if (PyObject_SetAttrString(v, "text", tmp)) PyErr_Clear(); Py_DECREF(tmp); } } if (PyObject_SetAttrString(v, "offset", Py_None)) { PyErr_Clear(); } if (exc != PyExc_SyntaxError) { if (!PyObject_HasAttrString(v, "msg")) { tmp = PyObject_Str(v); if (tmp) { if (PyObject_SetAttrString(v, "msg", tmp)) PyErr_Clear(); Py_DECREF(tmp); } else { PyErr_Clear(); } } if (!PyObject_HasAttrString(v, "print_file_and_line")) { if (PyObject_SetAttrString(v, "print_file_and_line", Py_None)) PyErr_Clear(); } } PyErr_Restore(exc, v, tb); }
static void ast_error_finish(const char *filename) { PyObject *type, *value, *tback, *errstr, *loc, *tmp; long lineno; loc = PyErr_ProgramText(filename, lineno); if (!loc) { Py_INCREF(Py_None); loc = Py_None; } tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc); PyErr_Restore(type, value, tback); }
std::string format_python_traceback(PyObject *tb) { PyTracebackObject *trace = (PyTracebackObject *)tb; std::string stack; stack = "Traceback:\n"; while (trace && trace->tb_frame) { PyFrameObject *frame = (PyFrameObject *)trace->tb_frame; stack += base::strfmt(" File \"%s\", line %i, in %s\n", PyString_AsString(frame->f_code->co_filename), trace->tb_lineno, PyString_AsString(frame->f_code->co_name)); PyObject *code = PyErr_ProgramText(PyString_AsString(frame->f_code->co_filename), trace->tb_lineno); if (code) { stack += base::strfmt(" %s", PyString_AsString(code)); Py_DECREF(code); } trace = trace->tb_next; } return stack; }