gh-91276: Make JUMP_IF_TRUE_OR_POP/JUMP_IF_FALSE_OR_POP relative (GH-32215)

This commit is contained in:
Irit Katriel 2022-04-15 20:19:24 +01:00 committed by GitHub
parent 5d421d7342
commit ea2ae02607
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 38 additions and 12 deletions

View file

@ -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);

View file

@ -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;
}
}
}