mirror of
https://github.com/python/cpython.git
synced 2026-01-06 15:32:22 +00:00
GH-113853: Guarantee forward progress in executors (GH-113854)
This commit is contained in:
parent
0d8fec79ca
commit
55824d01f8
5 changed files with 120 additions and 73 deletions
18
Python/generated_cases.c.h
generated
18
Python/generated_cases.c.h
generated
|
|
@ -2384,10 +2384,12 @@
|
|||
GOTO_TIER_TWO();
|
||||
}
|
||||
else {
|
||||
code->co_executors->executors[oparg & 255] = NULL;
|
||||
/* ENTER_EXECUTOR will be the first code unit of the instruction */
|
||||
assert(oparg < 256);
|
||||
code->co_executors->executors[oparg] = NULL;
|
||||
opcode = this_instr->op.code = executor->vm_data.opcode;
|
||||
this_instr->op.arg = executor->vm_data.oparg;
|
||||
oparg = (oparg & (~255)) | executor->vm_data.oparg;
|
||||
oparg = executor->vm_data.oparg;
|
||||
Py_DECREF(executor);
|
||||
next_instr = this_instr;
|
||||
DISPATCH_GOTO();
|
||||
|
|
@ -3289,12 +3291,18 @@
|
|||
// Double-check that the opcode isn't instrumented or something:
|
||||
if (ucounter > threshold && this_instr->op.code == JUMP_BACKWARD) {
|
||||
OPT_STAT_INC(attempts);
|
||||
int optimized = _PyOptimizer_BackEdge(frame, this_instr, next_instr, stack_pointer);
|
||||
_Py_CODEUNIT *start = this_instr;
|
||||
/* Back up over EXTENDED_ARGs so optimizer sees the whole instruction */
|
||||
while (oparg > 255) {
|
||||
oparg >>= 8;
|
||||
start--;
|
||||
}
|
||||
int optimized = _PyOptimizer_Optimize(frame, start, stack_pointer);
|
||||
if (optimized < 0) goto error;
|
||||
if (optimized) {
|
||||
// Rewind and enter the executor:
|
||||
assert(this_instr->op.code == ENTER_EXECUTOR);
|
||||
next_instr = this_instr;
|
||||
assert(start->op.code == ENTER_EXECUTOR);
|
||||
next_instr = start;
|
||||
this_instr[1].cache &= ((1 << OPTIMIZER_BITS_IN_COUNTER) - 1);
|
||||
}
|
||||
else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue