diff Python/compile.c @ 33272:bac997b79b19 legacy-trunk

Bypass peepholing of code with lineno tables having intervals >= 255. Allows the lineno fixup code to remain simple and not have to deal with multibyte codings. * Add an assertion to that effect. * Remove the XXX comment on the subject.
author Raymond Hettinger <python@rcn.com>
date Wed, 25 Aug 2004 17:19:38 +0000
parents 3dbdbd572d94
children f7474d31ba3f
line wrap: on
line diff
--- a/Python/compile.c	Wed Aug 25 15:15:56 2004 +0000
+++ b/Python/compile.c	Wed Aug 25 17:19:38 2004 +0000
@@ -435,6 +435,13 @@
 	unsigned int *blocks;
 	char *name;
 
+	/* Bypass optimization when the lineno table is too complex */
+	assert(PyString_Check(lineno_obj));
+	lineno = PyString_AS_STRING(lineno_obj);
+	tabsiz = PyString_GET_SIZE(lineno_obj);
+	if (memchr(lineno, 255, tabsiz) != NULL)
+		goto exitUnchanged;
+
 	if (!PyString_Check(code))
 		goto exitUnchanged;
 
@@ -614,15 +621,12 @@
 	}
 
 	/* Fixup linenotab */
-	/* XXX make sure this handles intervals > 256 */
-	assert(PyString_Check(lineno_obj));
-	lineno = PyString_AS_STRING(lineno_obj);
-	tabsiz = PyString_GET_SIZE(lineno_obj);
 	cum_orig_line = 0;
 	last_line = 0;
 	for (i=0 ; i < tabsiz ; i+=2) {
 		cum_orig_line += lineno[i];
 		new_line = addrmap[cum_orig_line];
+		assert (new_line - last_line < 255);
 		lineno[i] =((unsigned char)(new_line - last_line));
 		last_line = new_line;
 	}