/** API for traversing the line number table. */
extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range);
extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range);
+// This is used in dump_frame() in traceback.c without an attached tstate.
+extern int _PyCode_Addr2LineNoTstate(PyCodeObject *co, int addr);
/** API for executors */
extern void _PyCode_Clear_Executors(PyCodeObject *code);
******************/
int
-PyCode_Addr2Line(PyCodeObject *co, int addrq)
+_PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq)
{
if (addrq < 0) {
return co->co_firstlineno;
return _PyCode_CheckLineNumber(addrq, &bounds);
}
+int
+PyCode_Addr2Line(PyCodeObject *co, int addrq)
+{
+ int lineno;
+ Py_BEGIN_CRITICAL_SECTION(co);
+ lineno = _PyCode_Addr2LineNoTstate(co, addrq);
+ Py_END_CRITICAL_SECTION();
+ return lineno;
+}
+
void
_PyLineTable_InitAddressRange(const char *linetable, Py_ssize_t length, int firstlineno, PyCodeAddressRange *range)
{
} else {
PUTS(fd, "???");
}
-
- int lineno = PyUnstable_InterpreterFrame_GetLine(frame);
+ int lasti = PyUnstable_InterpreterFrame_GetLasti(frame);
+ int lineno = _PyCode_Addr2LineNoTstate(code, lasti);
PUTS(fd, ", line ");
if (lineno >= 0) {
_Py_DumpDecimal(fd, (size_t)lineno);