From e7ebb628443b18b4057d91e05c68a8fbf63cf02e Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 25 Aug 2023 23:22:55 +0900 Subject: [PATCH] Update --- Python/instrumentation.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 46e33173637993..5e64b5523bf065 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -566,7 +566,12 @@ de_instrument(PyCodeObject *code, int i, int event) _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; uint8_t *opcode_ptr = &instr->op.code; int opcode = *opcode_ptr; - assert(opcode != ENTER_EXECUTOR); + if (opcode == ENTER_EXECUTOR) { + int oparg = instr->op.arg; + _PyExecutorObject *exec = code->co_executors->executors[oparg]; + opcode_ptr = &exec->vm_data.opcode; + opcode = *opcode_ptr; + } if (opcode == INSTRUMENTED_LINE) { opcode_ptr = &code->_co_monitoring->lines[i].original_opcode; opcode = *opcode_ptr; @@ -575,6 +580,7 @@ de_instrument(PyCodeObject *code, int i, int event) opcode_ptr = &code->_co_monitoring->per_instruction_opcodes[i]; opcode = *opcode_ptr; } + assert(opcode != ENTER_EXECUTOR); int deinstrumented = DE_INSTRUMENT[opcode]; if (deinstrumented == 0) { return; @@ -711,7 +717,21 @@ remove_tools(PyCodeObject * code, int offset, int event, int tools) assert(event != PY_MONITORING_EVENT_LINE); assert(event != PY_MONITORING_EVENT_INSTRUCTION); assert(PY_MONITORING_IS_INSTRUMENTED_EVENT(event)); - assert(opcode_has_event(_Py_GetBaseOpcode(code, offset))); + _Py_CODEUNIT co_instr = _PyCode_CODE(code)[offset]; + uint8_t co_code = co_instr.op.code; + uint8_t co_arg = co_instr.op.arg; + if (co_code == ENTER_EXECUTOR) { + _PyExecutorObject *exec = code->co_executors->executors[co_arg]; + assert(exec != NULL); + assert(exec->vm_data.opcode != ENTER_EXECUTOR); + co_code = _PyOpcode_Deopt[exec->vm_data.opcode]; + co_arg = exec->vm_data.oparg; + } + else { + co_code = _Py_GetBaseOpcode(code, offset); + } + assert(co_code != ENTER_EXECUTOR); + assert(opcode_has_event(co_code)); _PyCoMonitoringData *monitoring = code->_co_monitoring; if (monitoring && monitoring->tools) { monitoring->tools[offset] &= ~tools;