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: