python/dist/src/Python compile.c,2.339,2.340
Update of /cvsroot/python/python/dist/src/Python In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23965/python Modified Files: compile.c Log Message: Do not fold a constant if a large sequence will result. Saves space in the presence of code like: (None,)*10000 Index: compile.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v retrieving revision 2.339 retrieving revision 2.340 diff -u -d -r2.339 -r2.340 --- compile.c 7 Jan 2005 18:10:51 -0000 2.339 +++ compile.c 26 Jan 2005 12:50:04 -0000 2.340 @@ -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:
participants (1)
-
rhettingerīŧ users.sourceforge.net