Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 4 additions & 13 deletions Objects/codeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -1008,13 +1008,14 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
* source location tracking (co_lines/co_positions)
******************/

static int
_PyCode_Addr2Line(PyCodeObject *co, int addrq)
int
PyCode_Addr2Line(PyCodeObject *co, int addrq)
{
if (addrq < 0) {
return co->co_firstlineno;
}
if (co->_co_monitoring && co->_co_monitoring->lines) {
if (FT_ATOMIC_LOAD_PTR_ACQUIRE(co->_co_monitoring) &&
FT_ATOMIC_LOAD_PTR_ACQUIRE(co->_co_monitoring->lines)) {
return _Py_Instrumentation_GetLine(co, addrq/sizeof(_Py_CODEUNIT));
}
assert(addrq >= 0 && addrq < _PyCode_NBYTES(co));
Expand All @@ -1040,16 +1041,6 @@ _PyCode_SafeAddr2Line(PyCodeObject *co, int addrq)
return _PyCode_CheckLineNumber(addrq, &bounds);
}

int
PyCode_Addr2Line(PyCodeObject *co, int addrq)
{
int lineno;
Py_BEGIN_CRITICAL_SECTION(co);
lineno = _PyCode_Addr2Line(co, addrq);
Py_END_CRITICAL_SECTION();
return lineno;
}

void
_PyLineTable_InitAddressRange(const char *linetable, Py_ssize_t length, int firstlineno, PyCodeAddressRange *range)
{
Expand Down
30 changes: 15 additions & 15 deletions Python/instrumentation.c
Original file line number Diff line number Diff line change
Expand Up @@ -1511,11 +1511,9 @@ initialize_tools(PyCodeObject *code)
}

static void
initialize_lines(PyCodeObject *code, int bytes_per_entry)
initialize_lines(_PyCoLineInstrumentationData *line_data, PyCodeObject *code, int bytes_per_entry)
{
ASSERT_WORLD_STOPPED_OR_LOCKED(code);
_PyCoLineInstrumentationData *line_data = code->_co_monitoring->lines;

assert(line_data != NULL);
line_data->bytes_per_entry = bytes_per_entry;
int code_len = (int)Py_SIZE(code);
Expand Down Expand Up @@ -1635,6 +1633,7 @@ initialize_lines(PyCodeObject *code, int bytes_per_entry)
set_original_opcode(line_data, handler, original_opcode);
}
}
FT_ATOMIC_STORE_PTR_RELEASE(code->_co_monitoring->lines, line_data);
}

static void
Expand All @@ -1656,18 +1655,19 @@ allocate_instrumentation_data(PyCodeObject *code)
ASSERT_WORLD_STOPPED_OR_LOCKED(code);

if (code->_co_monitoring == NULL) {
code->_co_monitoring = PyMem_Malloc(sizeof(_PyCoMonitoringData));
if (code->_co_monitoring == NULL) {
_PyCoMonitoringData *monitoring = PyMem_Malloc(sizeof(_PyCoMonitoringData));
if (monitoring == NULL) {
PyErr_NoMemory();
return -1;
}
code->_co_monitoring->local_monitors = (_Py_LocalMonitors){ 0 };
code->_co_monitoring->active_monitors = (_Py_LocalMonitors){ 0 };
code->_co_monitoring->tools = NULL;
code->_co_monitoring->lines = NULL;
code->_co_monitoring->line_tools = NULL;
code->_co_monitoring->per_instruction_opcodes = NULL;
code->_co_monitoring->per_instruction_tools = NULL;
monitoring->local_monitors = (_Py_LocalMonitors){ 0 };
monitoring->active_monitors = (_Py_LocalMonitors){ 0 };
monitoring->tools = NULL;
monitoring->lines = NULL;
monitoring->line_tools = NULL;
monitoring->per_instruction_opcodes = NULL;
monitoring->per_instruction_tools = NULL;
FT_ATOMIC_STORE_PTR_RELEASE(code->_co_monitoring, monitoring);
}
return 0;
}
Expand Down Expand Up @@ -1732,12 +1732,12 @@ update_instrumentation_data(PyCodeObject *code, PyInterpreterState *interp)
else {
bytes_per_entry = 5;
}
code->_co_monitoring->lines = PyMem_Malloc(1 + code_len * bytes_per_entry);
if (code->_co_monitoring->lines == NULL) {
_PyCoLineInstrumentationData *lines = PyMem_Malloc(1 + code_len * bytes_per_entry);
if (lines == NULL) {
PyErr_NoMemory();
return -1;
}
initialize_lines(code, bytes_per_entry);
initialize_lines(lines, code, bytes_per_entry);
}
if (multitools && code->_co_monitoring->line_tools == NULL) {
code->_co_monitoring->line_tools = PyMem_Malloc(code_len);
Expand Down
Loading