mirror of
https://github.com/python/cpython.git
synced 2025-07-19 17:25:54 +00:00
bpo-45056: Remove trailing unused constants from co_consts (GH-28109)
This commit is contained in:
parent
19ba2122ac
commit
55c4a92fc1
7 changed files with 6369 additions and 6331 deletions
|
@ -7573,6 +7573,9 @@ normalize_basic_block(basicblock *bb);
|
|||
static int
|
||||
optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts);
|
||||
|
||||
static int
|
||||
trim_unused_consts(struct compiler *c, struct assembler *a, PyObject *consts);
|
||||
|
||||
/* Duplicates exit BBs, so that line numbers can be propagated to them */
|
||||
static int
|
||||
duplicate_exits_without_lineno(struct compiler *c);
|
||||
|
@ -7870,6 +7873,9 @@ assemble(struct compiler *c, int addNone)
|
|||
if (duplicate_exits_without_lineno(c)) {
|
||||
return NULL;
|
||||
}
|
||||
if (trim_unused_consts(c, &a, consts)) {
|
||||
goto error;
|
||||
}
|
||||
propagate_line_numbers(&a);
|
||||
guarantee_lineno_for_exits(&a, c->u->u_firstlineno);
|
||||
int maxdepth = stackdepth(c);
|
||||
|
@ -8599,6 +8605,33 @@ optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts)
|
|||
return 0;
|
||||
}
|
||||
|
||||
// Remove trailing unused constants.
|
||||
static int
|
||||
trim_unused_consts(struct compiler *c, struct assembler *a, PyObject *consts)
|
||||
{
|
||||
assert(PyList_CheckExact(consts));
|
||||
|
||||
// The first constant may be docstring; keep it always.
|
||||
int max_const_index = 0;
|
||||
for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
|
||||
for (int i = 0; i < b->b_iused; i++) {
|
||||
if (b->b_instr[i].i_opcode == LOAD_CONST &&
|
||||
b->b_instr[i].i_oparg > max_const_index) {
|
||||
max_const_index = b->b_instr[i].i_oparg;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (max_const_index+1 < PyList_GET_SIZE(consts)) {
|
||||
//fprintf(stderr, "removing trailing consts: max=%d, size=%d\n",
|
||||
// max_const_index, (int)PyList_GET_SIZE(consts));
|
||||
if (PyList_SetSlice(consts, max_const_index+1,
|
||||
PyList_GET_SIZE(consts), NULL) < 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
is_exit_without_lineno(basicblock *b) {
|
||||
return b->b_exit && b->b_instr[0].i_lineno < 0;
|
||||
|
|
4101
Python/frozen_modules/importlib__bootstrap.h
generated
4101
Python/frozen_modules/importlib__bootstrap.h
generated
File diff suppressed because it is too large
Load diff
6242
Python/frozen_modules/importlib__bootstrap_external.h
generated
6242
Python/frozen_modules/importlib__bootstrap_external.h
generated
File diff suppressed because it is too large
Load diff
2306
Python/frozen_modules/zipimport.h
generated
2306
Python/frozen_modules/zipimport.h
generated
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue