diff options
Diffstat (limited to 'Python/compile.c')
-rw-r--r-- | Python/compile.c | 44 |
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: |