summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2022-04-15 19:19:24 (GMT)
committerGitHub <noreply@github.com>2022-04-15 19:19:24 (GMT)
commitea2ae026078b328ddeab060940568a4d3bf1b417 (patch)
treefba97e66d949767124286ee10bfd64fc56e60a99 /Python
parent5d421d7342fc0d278c129c05bea7028430e94a4e (diff)
downloadcpython-ea2ae026078b328ddeab060940568a4d3bf1b417.zip
cpython-ea2ae026078b328ddeab060940568a4d3bf1b417.tar.gz
cpython-ea2ae026078b328ddeab060940568a4d3bf1b417.tar.bz2
gh-91276: Make JUMP_IF_TRUE_OR_POP/JUMP_IF_FALSE_OR_POP relative (GH-32215)
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c8
-rw-r--r--Python/compile.c15
2 files changed, 19 insertions, 4 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 7891547..66856e5 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -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);
diff --git a/Python/compile.c b/Python/compile.c
index 718b521..3b91566 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -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;
}
}
}