summaryrefslogtreecommitdiffstats
path: root/Python/compile.c
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2021-09-14 08:53:32 (GMT)
committerGitHub <noreply@github.com>2021-09-14 08:53:32 (GMT)
commitc2f1e953371c25f6c42b599ba3d8797effbb503e (patch)
tree96c6c27edc2fbd765014187431df79acbf26c271 /Python/compile.c
parent9f93018b69d72cb48d3444554261ae3b0ea00c93 (diff)
downloadcpython-c2f1e953371c25f6c42b599ba3d8797effbb503e.zip
cpython-c2f1e953371c25f6c42b599ba3d8797effbb503e.tar.gz
cpython-c2f1e953371c25f6c42b599ba3d8797effbb503e.tar.bz2
bpo-45152: Add HAS_CONST macro and get_const_value() function and useā€¦ (#28262)
Diffstat (limited to 'Python/compile.c')
-rw-r--r--Python/compile.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/Python/compile.c b/Python/compile.c
index 389b3e0..fdc2ce6 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -1638,14 +1638,14 @@ compiler_addop_j_noline(struct compiler *c, int opcode, basicblock *b)
}
#define ADDOP_O(C, OP, O, TYPE) { \
- assert((OP) != LOAD_CONST); /* use ADDOP_LOAD_CONST */ \
+ assert(!HAS_CONST(OP)); /* use ADDOP_LOAD_CONST */ \
if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
return 0; \
}
/* Same as ADDOP_O, but steals a reference. */
#define ADDOP_N(C, OP, O, TYPE) { \
- assert((OP) != LOAD_CONST); /* use ADDOP_LOAD_CONST_NEW */ \
+ assert(!HAS_CONST(OP)); /* use ADDOP_LOAD_CONST_NEW */ \
if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
Py_DECREF((O)); \
return 0; \
@@ -7951,6 +7951,24 @@ assemble(struct compiler *c, int addNone)
return co;
}
+static PyObject*
+get_const_value(int opcode, int oparg, PyObject *co_consts)
+{
+ PyObject *constant = NULL;
+ assert(HAS_CONST(opcode));
+ if (opcode == LOAD_CONST) {
+ constant = PyList_GET_ITEM(co_consts, oparg);
+ }
+
+ if (constant == NULL) {
+ PyErr_SetString(PyExc_SystemError,
+ "Internal error: failed to get value of a constant");
+ return NULL;
+ }
+ Py_INCREF(constant);
+ return constant;
+}
+
/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n
with LOAD_CONST (c1, c2, ... cn).
The consts table must still be in list form so that the
@@ -7968,7 +7986,7 @@ fold_tuple_on_constants(struct compiler *c,
assert(inst[n].i_oparg == n);
for (int i = 0; i < n; i++) {
- if (inst[i].i_opcode != LOAD_CONST) {
+ if (!HAS_CONST(inst[i].i_opcode)) {
return 0;
}
}
@@ -7979,9 +7997,12 @@ fold_tuple_on_constants(struct compiler *c,
return -1;
}
for (int i = 0; i < n; i++) {
+ int op = inst[i].i_opcode;
int arg = inst[i].i_oparg;
- PyObject *constant = PyList_GET_ITEM(consts, arg);
- Py_INCREF(constant);
+ PyObject *constant = get_const_value(op, arg, consts);
+ if (constant == NULL) {
+ return -1;
+ }
PyTuple_SET_ITEM(newconst, i, constant);
}
if (merge_const_one(c, &newconst) == 0) {
@@ -8107,8 +8128,12 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
switch(nextop) {
case POP_JUMP_IF_FALSE:
case POP_JUMP_IF_TRUE:
- cnt = PyList_GET_ITEM(consts, oparg);
+ cnt = get_const_value(inst->i_opcode, oparg, consts);
+ if (cnt == NULL) {
+ goto error;
+ }
is_true = PyObject_IsTrue(cnt);
+ Py_DECREF(cnt);
if (is_true == -1) {
goto error;
}
@@ -8124,8 +8149,12 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
break;
case JUMP_IF_FALSE_OR_POP:
case JUMP_IF_TRUE_OR_POP:
- cnt = PyList_GET_ITEM(consts, oparg);
+ cnt = get_const_value(inst->i_opcode, oparg, consts);
+ if (cnt == NULL) {
+ goto error;
+ }
is_true = PyObject_IsTrue(cnt);
+ Py_DECREF(cnt);
if (is_true == -1) {
goto error;
}
@@ -8310,6 +8339,9 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
fold_rotations(inst - oparg + 1, oparg);
}
break;
+ default:
+ /* All HAS_CONST opcodes should be handled with LOAD_CONST */
+ assert (!HAS_CONST(inst->i_opcode));
}
}
return 0;