Skip to content

Commit

Permalink
pythongh-122247: Move instruction instrumentation sanity check after …
Browse files Browse the repository at this point in the history
…tracing check (python#122251)
  • Loading branch information
gaogaotiantian authored Aug 8, 2024
1 parent e006c73 commit 57d7c3e
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
15 changes: 15 additions & 0 deletions Lib/test/test_monitoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -1863,6 +1863,21 @@ def f(a=1, b=2):
self.assertEqual(call_data[0], (f, 1))
self.assertEqual(call_data[1], (f, sys.monitoring.MISSING))

def test_instruction_explicit_callback(self):
# gh-122247
# Calling the instruction event callback explicitly should not
# crash CPython
def callback(code, instruction_offset):
pass

sys.monitoring.use_tool_id(0, "test")
self.addCleanup(sys.monitoring.free_tool_id, 0)
sys.monitoring.register_callback(0, sys.monitoring.events.INSTRUCTION, callback)
sys.monitoring.set_events(0, sys.monitoring.events.INSTRUCTION)
callback(None, 0) # call the *same* handler while it is registered
sys.monitoring.restart_events()
sys.monitoring.set_events(0, 0)


class TestOptimizer(MonitoringTestBase, unittest.TestCase):

Expand Down
2 changes: 1 addition & 1 deletion Python/instrumentation.c
Original file line number Diff line number Diff line change
Expand Up @@ -1344,14 +1344,14 @@ int
_Py_call_instrumentation_instruction(PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr)
{
PyCodeObject *code = _PyFrame_GetCode(frame);
assert(debug_check_sanity(tstate->interp, code));
int offset = (int)(instr - _PyCode_CODE(code));
_PyCoMonitoringData *instrumentation_data = code->_co_monitoring;
assert(instrumentation_data->per_instruction_opcodes);
int next_opcode = instrumentation_data->per_instruction_opcodes[offset];
if (tstate->tracing) {
return next_opcode;
}
assert(debug_check_sanity(tstate->interp, code));
PyInterpreterState *interp = tstate->interp;
uint8_t tools = instrumentation_data->per_instruction_tools != NULL ?
instrumentation_data->per_instruction_tools[offset] :
Expand Down

0 comments on commit 57d7c3e

Please sign in to comment.