summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2005-01-26 12:50:05 (GMT)
committerRaymond Hettinger <python@rcn.com>2005-01-26 12:50:05 (GMT)
commit9feb267cafb9452826694e5e098317c8b2799fe8 (patch)
tree88b364b176d24a45a472dd6ef10383771272deeb /Python
parentc560a00966e035fad3499067dc6a4d7b7dbc9d7e (diff)
downloadcpython-9feb267cafb9452826694e5e098317c8b2799fe8.zip
cpython-9feb267cafb9452826694e5e098317c8b2799fe8.tar.gz
cpython-9feb267cafb9452826694e5e098317c8b2799fe8.tar.bz2
Do not fold a constant if a large sequence will result.
Saves space in the presence of code like: (None,)*10000
Diffstat (limited to 'Python')
-rw-r--r--Python/compile.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/Python/compile.c b/Python/compile.c
index 545042f..acfbfe1 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -444,12 +444,16 @@ tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
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 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
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 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
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 @@ optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *linen
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: