mirror of
https://github.com/python/cpython
synced 2024-09-18 21:51:40 +00:00
bpo-41323: compiler: Reuse tuple in constant tuple folding (GH-25419)
This commit is contained in:
parent
ff3d9c0f1a
commit
8a232c7b17
|
@ -0,0 +1,2 @@
|
|||
Constant tuple folding in bytecode optimizer now reuses tuple in constant
|
||||
table.
|
|
@ -6751,7 +6751,7 @@ static int
|
|||
normalize_basic_block(basicblock *bb);
|
||||
|
||||
static int
|
||||
optimize_cfg(struct assembler *a, PyObject *consts);
|
||||
optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts);
|
||||
|
||||
static int
|
||||
ensure_exits_have_lineno(struct compiler *c);
|
||||
|
@ -6850,7 +6850,7 @@ assemble(struct compiler *c, int addNone)
|
|||
if (consts == NULL) {
|
||||
goto error;
|
||||
}
|
||||
if (optimize_cfg(&a, consts)) {
|
||||
if (optimize_cfg(c, &a, consts)) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -6898,7 +6898,8 @@ assemble(struct compiler *c, int addNone)
|
|||
Called with codestr pointing to the first LOAD_CONST.
|
||||
*/
|
||||
static int
|
||||
fold_tuple_on_constants(struct instr *inst,
|
||||
fold_tuple_on_constants(struct compiler *c,
|
||||
struct instr *inst,
|
||||
int n, PyObject *consts)
|
||||
{
|
||||
/* Pre-conditions */
|
||||
|
@ -6923,15 +6924,27 @@ fold_tuple_on_constants(struct instr *inst,
|
|||
Py_INCREF(constant);
|
||||
PyTuple_SET_ITEM(newconst, i, constant);
|
||||
}
|
||||
Py_ssize_t index = PyList_GET_SIZE(consts);
|
||||
if ((size_t)index >= (size_t)INT_MAX - 1) {
|
||||
if (merge_const_one(c, &newconst) == 0) {
|
||||
Py_DECREF(newconst);
|
||||
PyErr_SetString(PyExc_OverflowError, "too many constants");
|
||||
return -1;
|
||||
}
|
||||
if (PyList_Append(consts, newconst)) {
|
||||
Py_DECREF(newconst);
|
||||
return -1;
|
||||
|
||||
Py_ssize_t index;
|
||||
for (index = 0; index < PyList_GET_SIZE(consts); index++) {
|
||||
if (PyList_GET_ITEM(consts, index) == newconst) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (index == PyList_GET_SIZE(consts)) {
|
||||
if ((size_t)index >= (size_t)INT_MAX - 1) {
|
||||
Py_DECREF(newconst);
|
||||
PyErr_SetString(PyExc_OverflowError, "too many constants");
|
||||
return -1;
|
||||
}
|
||||
if (PyList_Append(consts, newconst)) {
|
||||
Py_DECREF(newconst);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
Py_DECREF(newconst);
|
||||
for (int i = 0; i < n; i++) {
|
||||
|
@ -6968,7 +6981,7 @@ eliminate_jump_to_jump(basicblock *bb, int opcode) {
|
|||
|
||||
/* Optimization */
|
||||
static int
|
||||
optimize_basic_block(basicblock *bb, PyObject *consts)
|
||||
optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
|
||||
{
|
||||
assert(PyList_CheckExact(consts));
|
||||
struct instr nop;
|
||||
|
@ -7056,7 +7069,7 @@ optimize_basic_block(basicblock *bb, PyObject *consts)
|
|||
break;
|
||||
}
|
||||
if (i >= oparg) {
|
||||
if (fold_tuple_on_constants(inst-oparg, oparg, consts)) {
|
||||
if (fold_tuple_on_constants(c, inst-oparg, oparg, consts)) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
@ -7390,10 +7403,10 @@ propogate_line_numbers(struct assembler *a) {
|
|||
*/
|
||||
|
||||
static int
|
||||
optimize_cfg(struct assembler *a, PyObject *consts)
|
||||
optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts)
|
||||
{
|
||||
for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
|
||||
if (optimize_basic_block(b, consts)) {
|
||||
if (optimize_basic_block(c, b, consts)) {
|
||||
return -1;
|
||||
}
|
||||
clean_basic_block(b, -1);
|
||||
|
|
1326
Python/importlib.h
generated
1326
Python/importlib.h
generated
File diff suppressed because it is too large
Load diff
4190
Python/importlib_external.h
generated
4190
Python/importlib_external.h
generated
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue