From 4d4831303078f30e4cb3db66ddb13d3056ad54a9 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 25 Aug 2023 22:59:48 +0900 Subject: [PATCH 1/6] gh-107265: Fix initialize_tools for ENTER_EXECUTOR case --- Python/instrumentation.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 8c7a3a06c9b938..46e33173637993 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -1282,9 +1282,16 @@ initialize_tools(PyCodeObject *code) for (int i = 0; i < code_len; i++) { _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; int opcode = instr->op.code; + int oparg = instr->op.arg; + if (opcode == ENTER_EXECUTOR) { + _PyExecutorObject *exec = code->co_executors->executors[oparg]; + opcode = exec->vm_data.opcode; + oparg = exec->vm_data.oparg; + } if (opcode == INSTRUMENTED_LINE) { opcode = code->_co_monitoring->lines[i].original_opcode; } + assert(opcode != ENTER_EXECUTOR); bool instrumented = is_instrumented(opcode); if (instrumented) { opcode = DE_INSTRUMENT[opcode]; @@ -1295,7 +1302,7 @@ initialize_tools(PyCodeObject *code) if (instrumented) { int8_t event; if (opcode == RESUME) { - event = instr->op.arg != 0; + event = oparg != 0; } else { event = EVENT_FOR_OPCODE[opcode]; From e7ebb628443b18b4057d91e05c68a8fbf63cf02e Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 25 Aug 2023 23:22:55 +0900 Subject: [PATCH 2/6] 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; From 61aadfd7a5bb87b66534d75456e7b89ff3a828fa Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 25 Aug 2023 23:31:38 +0900 Subject: [PATCH 3/6] nit --- Python/instrumentation.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 5e64b5523bf065..3997131011f2c6 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -1308,7 +1308,7 @@ initialize_tools(PyCodeObject *code) opcode = exec->vm_data.opcode; oparg = exec->vm_data.oparg; } - if (opcode == INSTRUMENTED_LINE) { + else if (opcode == INSTRUMENTED_LINE) { opcode = code->_co_monitoring->lines[i].original_opcode; } assert(opcode != ENTER_EXECUTOR); From 93f43c15e4719b52a3431d5239849ab27b232a76 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sat, 26 Aug 2023 10:39:50 +0900 Subject: [PATCH 4/6] Address code review --- Python/instrumentation.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 3997131011f2c6..181c944cb16af6 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -571,6 +571,7 @@ de_instrument(PyCodeObject *code, int i, int event) _PyExecutorObject *exec = code->co_executors->executors[oparg]; opcode_ptr = &exec->vm_data.opcode; opcode = *opcode_ptr; + assert(opcode != ENTER_EXECUTOR); } if (opcode == INSTRUMENTED_LINE) { opcode_ptr = &code->_co_monitoring->lines[i].original_opcode; @@ -580,7 +581,6 @@ 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; @@ -717,22 +717,23 @@ 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)); - _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; + #ifndef NDEBUG + _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->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; + #endif if (monitoring && monitoring->tools) { monitoring->tools[offset] &= ~tools; if (monitoring->tools[offset] == 0) { From 4b17bb9569324ca2390b5acdaf50ac20730b0722 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sat, 26 Aug 2023 10:44:48 +0900 Subject: [PATCH 5/6] fix --- Python/instrumentation.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 181c944cb16af6..b33b3f9bb6e340 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -732,8 +732,8 @@ remove_tools(PyCodeObject * code, int offset, int event, int tools) } assert(co_code != ENTER_EXECUTOR); assert(opcode_has_event(co_code)); - _PyCoMonitoringData *monitoring = code->_co_monitoring; #endif + _PyCoMonitoringData *monitoring = code->_co_monitoring; if (monitoring && monitoring->tools) { monitoring->tools[offset] &= ~tools; if (monitoring->tools[offset] == 0) { From 46d879d27d14d363c0b97c2267e495f71806b79f Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sat, 26 Aug 2023 16:06:42 +0900 Subject: [PATCH 6/6] Address code review --- Python/instrumentation.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index b33b3f9bb6e340..36459687be7936 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -718,20 +718,20 @@ remove_tools(PyCodeObject * code, int offset, int event, int tools) assert(event != PY_MONITORING_EVENT_INSTRUCTION); assert(PY_MONITORING_IS_INSTRUMENTED_EVENT(event)); #ifndef NDEBUG - _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->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)); + _Py_CODEUNIT co_instr = _PyCode_CODE(code)[offset]; + uint8_t opcode = co_instr.op.code; + uint8_t oparg = co_instr.op.arg; + if (opcode == ENTER_EXECUTOR) { + _PyExecutorObject *exec = code->co_executors->executors[oparg]; + assert(exec->vm_data.opcode != ENTER_EXECUTOR); + opcode = _PyOpcode_Deopt[exec->vm_data.opcode]; + opcode = exec->vm_data.oparg; + } + else { + opcode = _Py_GetBaseOpcode(code, offset); + } + assert(opcode != ENTER_EXECUTOR); + assert(opcode_has_event(opcode)); #endif _PyCoMonitoringData *monitoring = code->_co_monitoring; if (monitoring && monitoring->tools) {