mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
gh-91276: Make JUMP_IF_TRUE_OR_POP/JUMP_IF_FALSE_OR_POP relative (GH-32215)
This commit is contained in:
parent
5d421d7342
commit
ea2ae02607
8 changed files with 38 additions and 12 deletions
|
@ -4081,7 +4081,7 @@ handle_eval_breaker:
|
|||
DISPATCH();
|
||||
}
|
||||
if (Py_IsFalse(cond)) {
|
||||
JUMPTO(oparg);
|
||||
JUMPBY(oparg);
|
||||
DISPATCH();
|
||||
}
|
||||
err = PyObject_IsTrue(cond);
|
||||
|
@ -4090,7 +4090,7 @@ handle_eval_breaker:
|
|||
Py_DECREF(cond);
|
||||
}
|
||||
else if (err == 0)
|
||||
JUMPTO(oparg);
|
||||
JUMPBY(oparg);
|
||||
else
|
||||
goto error;
|
||||
DISPATCH();
|
||||
|
@ -4105,12 +4105,12 @@ handle_eval_breaker:
|
|||
DISPATCH();
|
||||
}
|
||||
if (Py_IsTrue(cond)) {
|
||||
JUMPTO(oparg);
|
||||
JUMPBY(oparg);
|
||||
DISPATCH();
|
||||
}
|
||||
err = PyObject_IsTrue(cond);
|
||||
if (err > 0) {
|
||||
JUMPTO(oparg);
|
||||
JUMPBY(oparg);
|
||||
}
|
||||
else if (err == 0) {
|
||||
STACK_SHRINK(1);
|
||||
|
|
|
@ -7672,6 +7672,21 @@ normalize_jumps(struct assembler *a)
|
|||
last->i_opcode = is_forward ?
|
||||
POP_JUMP_FORWARD_IF_TRUE : POP_JUMP_BACKWARD_IF_TRUE;
|
||||
break;
|
||||
case JUMP_IF_TRUE_OR_POP:
|
||||
case JUMP_IF_FALSE_OR_POP:
|
||||
if (!is_forward) {
|
||||
/* As far as we can tell, the compiler never emits
|
||||
* these jumps with a backwards target. If/when this
|
||||
* exception is raised, we have found a use case for
|
||||
* a backwards version of this jump (or to replace
|
||||
* it with the sequence (COPY 1, POP_JUMP_IF_T/F, POP)
|
||||
*/
|
||||
PyErr_Format(PyExc_SystemError,
|
||||
"unexpected %s jumping backwards",
|
||||
last->i_opcode == JUMP_IF_TRUE_OR_POP ?
|
||||
"JUMP_IF_TRUE_OR_POP" : "JUMP_IF_FALSE_OR_POP");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue