summaryrefslogtreecommitdiffstats
path: root/Python/executor_cases.c.h
diff options
context:
space:
mode:
Diffstat (limited to 'Python/executor_cases.c.h')
-rw-r--r--Python/executor_cases.c.h93
1 files changed, 56 insertions, 37 deletions
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 76b7a9b..d70a57a 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -4824,7 +4824,51 @@
}
case _EXIT_TRACE: {
- EXIT_TO_TRACE();
+ oparg = CURRENT_OPARG();
+ _PyExitData *exit = &current_executor->exits[oparg];
+ PyCodeObject *code = _PyFrame_GetCode(frame);
+ _Py_CODEUNIT *target = _PyCode_CODE(code) + exit->target;
+ #if defined(Py_DEBUG) && !defined(_Py_JIT)
+ OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
+ if (lltrace >= 2) {
+ printf("SIDE EXIT: [UOp ");
+ _PyUOpPrint(&next_uop[-1]);
+ printf(", exit %u, temp %d, target %d -> %s]\n",
+ oparg, exit->temperature.as_counter,
+ (int)(target - _PyCode_CODE(code)),
+ _PyOpcode_OpName[target->op.code]);
+ }
+ #endif
+ if (exit->executor == NULL) {
+ _Py_BackoffCounter temperature = exit->temperature;
+ if (!backoff_counter_triggers(temperature)) {
+ exit->temperature = advance_backoff_counter(temperature);
+ tstate->previous_executor = (PyObject *)current_executor;
+ GOTO_TIER_ONE(target);
+ }
+ _PyExecutorObject *executor;
+ if (target->op.code == ENTER_EXECUTOR) {
+ executor = code->co_executors->executors[target->op.arg];
+ Py_INCREF(executor);
+ }
+ else {
+ int optimized = _PyOptimizer_Optimize(frame, target, stack_pointer, &executor);
+ if (optimized <= 0) {
+ exit->temperature = restart_backoff_counter(temperature);
+ if (optimized < 0) {
+ Py_DECREF(current_executor);
+ tstate->previous_executor = Py_None;
+ GOTO_UNWIND();
+ }
+ tstate->previous_executor = (PyObject *)current_executor;
+ GOTO_TIER_ONE(target);
+ }
+ }
+ exit->executor = executor;
+ }
+ Py_INCREF(exit->executor);
+ tstate->previous_executor = (PyObject *)current_executor;
+ GOTO_TIER_TWO(exit->executor);
break;
}
@@ -4913,47 +4957,22 @@
break;
}
- case _COLD_EXIT: {
- oparg = CURRENT_OPARG();
- _PyExecutorObject *previous = (_PyExecutorObject *)tstate->previous_executor;
- _PyExitData *exit = &previous->exits[oparg];
- PyCodeObject *code = _PyFrame_GetCode(frame);
- _Py_CODEUNIT *target = _PyCode_CODE(code) + exit->target;
- _Py_BackoffCounter temperature = exit->temperature;
- if (!backoff_counter_triggers(temperature)) {
- exit->temperature = advance_backoff_counter(temperature);
- GOTO_TIER_ONE(target);
- }
- _PyExecutorObject *executor;
- if (target->op.code == ENTER_EXECUTOR) {
- executor = code->co_executors->executors[target->op.arg];
- Py_INCREF(executor);
- }
- else {
- int optimized = _PyOptimizer_Optimize(frame, target, stack_pointer, &executor);
- if (optimized <= 0) {
- exit->temperature = restart_backoff_counter(temperature);
- if (optimized < 0) {
- Py_DECREF(previous);
- tstate->previous_executor = Py_None;
- GOTO_UNWIND();
- }
- GOTO_TIER_ONE(target);
- }
- }
- /* We need two references. One to store in exit->executor and
- * one to keep the executor alive when executing. */
- Py_INCREF(executor);
- exit->executor = executor;
- GOTO_TIER_TWO(executor);
- break;
- }
-
case _DYNAMIC_EXIT: {
oparg = CURRENT_OPARG();
tstate->previous_executor = (PyObject *)current_executor;
_PyExitData *exit = (_PyExitData *)&current_executor->exits[oparg];
_Py_CODEUNIT *target = frame->instr_ptr;
+ #if defined(Py_DEBUG) && !defined(_Py_JIT)
+ OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
+ if (lltrace >= 2) {
+ printf("DYNAMIC EXIT: [UOp ");
+ _PyUOpPrint(&next_uop[-1]);
+ printf(", exit %u, temp %d, target %d -> %s]\n",
+ oparg, exit->temperature.as_counter,
+ (int)(target - _PyCode_CODE(_PyFrame_GetCode(frame))),
+ _PyOpcode_OpName[target->op.code]);
+ }
+ #endif
_PyExecutorObject *executor;
if (target->op.code == ENTER_EXECUTOR) {
PyCodeObject *code = (PyCodeObject *)frame->f_executable;