summaryrefslogtreecommitdiffstats
path: root/Python/generated_cases.c.h
diff options
context:
space:
mode:
Diffstat (limited to 'Python/generated_cases.c.h')
-rw-r--r--Python/generated_cases.c.h28
1 files changed, 20 insertions, 8 deletions
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 34cea84..84f83db 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -8,24 +8,36 @@
}
TARGET(RESUME) {
+ PREDICTED(RESUME);
+ static_assert(0 == 0, "incorrect cache size");
+ TIER_ONE_ONLY
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 if (oparg < 2) {
- CHECK_EVAL_BREAKER();
+ else {
+ if (oparg < 2) {
+ CHECK_EVAL_BREAKER();
+ }
+ next_instr[-1].op.code = RESUME_CHECK;
}
DISPATCH();
}
+ TARGET(RESUME_CHECK) {
+#if defined(__EMSCRIPTEN__)
+ DEOPT_IF(emscripten_signal_clock == 0, RESUME);
+ emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
+#endif
+ /* Possibly combine these two checks */
+ DEOPT_IF(_PyFrame_GetCode(frame)->_co_instrumentation_version
+ != tstate->interp->monitoring_version, RESUME);
+ DEOPT_IF(_Py_atomic_load_relaxed_int32(&tstate->interp->ceval.eval_breaker), RESUME);
+ DISPATCH();
+ }
+
TARGET(INSTRUMENTED_RESUME) {
/* Possible performance enhancement:
* We need to check the eval breaker anyway, can we