From: Brandt Bucher Date: Fri, 25 Aug 2023 19:12:59 +0000 (-0700) Subject: GH-106581: Fix instrumentation in tier 2 (GH-108493) X-Git-Tag: v3.13.0a1~767 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4eae1e53425d3a816a26760f28d128a4f05c1da4;p=thirdparty%2FPython%2Fcpython.git GH-106581: Fix instrumentation in tier 2 (GH-108493) --- diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-08-10-00-00-48.gh-issue-106581.o7zDty.rst b/Misc/NEWS.d/next/Core and Builtins/2023-08-10-00-00-48.gh-issue-106581.o7zDty.rst new file mode 100644 index 000000000000..dff1ebd9cf70 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-08-10-00-00-48.gh-issue-106581.o7zDty.rst @@ -0,0 +1,2 @@ +Fix possible assertion failures and missing instrumentation events when +:envvar:`PYTHONUOPS` or :option:`-X uops <-X>` is enabled. diff --git a/Python/bytecodes.c b/Python/bytecodes.c index a5cb117c7631..a55460afea75 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -133,17 +133,19 @@ dummy_func( } inst(RESUME, (--)) { - #if TIER_ONE assert(frame == tstate->current_frame); /* Possibly combine this with eval breaker */ if (_PyFrame_GetCode(frame)->_co_instrumentation_version != tstate->interp->monitoring_version) { int err = _Py_Instrument(_PyFrame_GetCode(frame), tstate->interp); ERROR_IF(err, error); + #if TIER_ONE next_instr--; + #endif + #if TIER_TWO + goto deoptimize; + #endif } - else - #endif - if (oparg < 2) { + else if (oparg < 2) { CHECK_EVAL_BREAKER(); } } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 85c60c276e02..1283cc7ebbf9 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -8,17 +8,19 @@ } case RESUME: { - #if TIER_ONE assert(frame == tstate->current_frame); /* Possibly combine this with eval breaker */ if (_PyFrame_GetCode(frame)->_co_instrumentation_version != tstate->interp->monitoring_version) { int err = _Py_Instrument(_PyFrame_GetCode(frame), tstate->interp); if (err) goto error; + #if TIER_ONE next_instr--; + #endif + #if TIER_TWO + goto deoptimize; + #endif } - else - #endif - if (oparg < 2) { + else if (oparg < 2) { CHECK_EVAL_BREAKER(); } break; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 4aa16f8311a2..3f46f1a10a24 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -8,17 +8,19 @@ } TARGET(RESUME) { - #if TIER_ONE assert(frame == tstate->current_frame); /* Possibly combine this with eval breaker */ if (_PyFrame_GetCode(frame)->_co_instrumentation_version != tstate->interp->monitoring_version) { int err = _Py_Instrument(_PyFrame_GetCode(frame), tstate->interp); if (err) goto error; + #if TIER_ONE next_instr--; + #endif + #if TIER_TWO + goto deoptimize; + #endif } - else - #endif - if (oparg < 2) { + else if (oparg < 2) { CHECK_EVAL_BREAKER(); } DISPATCH();