Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 34506:bda933873758 legacy-trunk
Do not fold a constant if a large sequence will result.
Saves space in the presence of code like: (None,)*10000
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Wed, 26 Jan 2005 12:50:05 +0000 |
| parents | d81b6173f050 |
| children | 835b645a168f |
line wrap: on
line diff
--- a/Python/compile.c Tue Jan 25 12:40:01 2005 +0000 +++ b/Python/compile.c Wed Jan 26 12:50:05 2005 +0000 @@ -444,12 +444,16 @@ The consts table must still be in list form so that the new constant can be appended. Called with codestr pointing to the first LOAD_CONST. - Abandons the transformation if the folding fails (i.e. 1+'a'). */ + Abandons the transformation if the folding fails (i.e. 1+'a'). + If the new constant is a sequence, only folds when the size + is below a threshold value. That keeps pyc files from + becoming large in the presence of code like: (None,)*1000. +*/ static int fold_binops_on_constants(unsigned char *codestr, PyObject *consts) { PyObject *newconst, *v, *w; - int len_consts, opcode; + int len_consts, opcode, size; /* Pre-conditions */ assert(PyList_CheckExact(consts)); @@ -468,8 +472,8 @@ newconst = PyNumber_Multiply(v, w); break; case BINARY_DIVIDE: - /* XXX care is needed to fold this operation statically: - the result might depend on the run-time presence of the -Qnew flag */ + /* Cannot fold this operation statically since + the result can depend on the run-time presence of the -Qnew flag */ return 0; case BINARY_TRUE_DIVIDE: newconst = PyNumber_TrueDivide(v, w); @@ -513,6 +517,13 @@ PyErr_Clear(); return 0; } + size = PyObject_Size(newconst); + if (size == -1) + PyErr_Clear(); + else if (size > 20) { + Py_DECREF(newconst); + return 0; + } /* Append folded constant into consts table */ len_consts = PyList_GET_SIZE(consts); @@ -733,7 +744,6 @@ LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */ case BINARY_POWER: case BINARY_MULTIPLY: - case BINARY_DIVIDE: case BINARY_TRUE_DIVIDE: case BINARY_FLOOR_DIVIDE: case BINARY_MODULO:
