mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-42217: compiler: merge same co_code and co_linetable objects (GH-23056)
This commit is contained in:
parent
dbb228189b
commit
bdb941be42
5 changed files with 3849 additions and 3849 deletions
|
@ -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:
|
||||
|
|
3144
Python/importlib.h
generated
3144
Python/importlib.h
generated
File diff suppressed because it is too large
Load diff
4498
Python/importlib_external.h
generated
4498
Python/importlib_external.h
generated
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue