]> granicus.if.org Git - python/commitdiff
Bypass peepholing of code with lineno tables having intervals >= 255.
authorRaymond Hettinger <python@rcn.com>
Wed, 25 Aug 2004 17:19:38 +0000 (17:19 +0000)
committerRaymond Hettinger <python@rcn.com>
Wed, 25 Aug 2004 17:19:38 +0000 (17:19 +0000)
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.

Python/compile.c

index 1de249f6c597cafe5d7a6de2b230d0353718c36b..4653ff7bc33b6fbbbc68bb81a0510dea5796ae4a 100644 (file)
@@ -435,6 +435,13 @@ optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *linen
        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 @@ optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *linen
        }
 
        /* 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;
        }