aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Python/compile.c')
-rw-r--r--Python/compile.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/Python/compile.c b/Python/compile.c
index a0a257fa6ba..386c552cd8d 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -5806,14 +5806,12 @@ compute_code_flags(struct compiler *c)
return flags;
}
-// Merge *tuple* with constant cache.
+// Merge *obj* with constant cache.
// Unlike merge_consts_recursive(), this function doesn't work recursively.
static int
-merge_const_tuple(struct compiler *c, PyObject **tuple)
+merge_const_one(struct compiler *c, PyObject **obj)
{
- assert(PyTuple_CheckExact(*tuple));
-
- PyObject *key = _PyCode_ConstantKey(*tuple);
+ PyObject *key = _PyCode_ConstantKey(*obj);
if (key == NULL) {
return 0;
}
@@ -5824,14 +5822,18 @@ merge_const_tuple(struct compiler *c, PyObject **tuple)
if (t == NULL) {
return 0;
}
- if (t == key) { // tuple is new constant.
+ if (t == key) { // obj is new constant.
return 1;
}
- PyObject *u = PyTuple_GET_ITEM(t, 1);
- Py_INCREF(u);
- Py_DECREF(*tuple);
- *tuple = u;
+ if (PyTuple_CheckExact(t)) {
+ // t is still borrowed reference
+ t = PyTuple_GET_ITEM(t, 1);
+ }
+
+ Py_INCREF(t);
+ Py_DECREF(*obj);
+ *obj = t;
return 1;
}
@@ -5861,10 +5863,10 @@ makecode(struct compiler *c, struct assembler *a, PyObject *consts)
if (!freevars)
goto error;
- if (!merge_const_tuple(c, &names) ||
- !merge_const_tuple(c, &varnames) ||
- !merge_const_tuple(c, &cellvars) ||
- !merge_const_tuple(c, &freevars))
+ if (!merge_const_one(c, &names) ||
+ !merge_const_one(c, &varnames) ||
+ !merge_const_one(c, &cellvars) ||
+ !merge_const_one(c, &freevars))
{
goto error;
}
@@ -5881,7 +5883,7 @@ makecode(struct compiler *c, struct assembler *a, PyObject *consts)
if (consts == NULL) {
goto error;
}
- if (!merge_const_tuple(c, &consts)) {
+ if (!merge_const_one(c, &consts)) {
Py_DECREF(consts);
goto error;
}
@@ -6028,10 +6030,18 @@ assemble(struct compiler *c, int addNone)
goto error;
}
- if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
+ if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) {
goto error;
- if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
+ }
+ if (!merge_const_one(c, &a.a_lnotab)) {
goto error;
+ }
+ if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) {
+ goto error;
+ }
+ if (!merge_const_one(c, &a.a_bytecode)) {
+ goto error;
+ }
co = makecode(c, &a, consts);
error: