]> granicus.if.org Git - python/commitdiff
Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
authorJeremy Hylton <jeremy@alum.mit.edu>
Thu, 25 Jan 2001 17:01:49 +0000 (17:01 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Thu, 25 Jan 2001 17:01:49 +0000 (17:01 +0000)
parameters that contained both anonymous tuples and *arg or **arg. Ex:
def f(a, (b, c), *d): pass

Fix the symtable_params() to generate names in the right order for
co_varnames slot of code object.  Consider *arg and **arg before the
"complex" names introduced by anonymous tuples.

Python/compile.c

index 131f97beb2ccbf6222426a5763c41d309ee0e812..7c42479ac8b4d643b238eeda3b04745250194d8d 100644 (file)
@@ -4284,7 +4284,7 @@ symtable_default_args(struct symtable *st, node *n)
 static void
 symtable_params(struct symtable *st, node *n)
 {
-       int i, complex = 0, ext = 0;
+       int i, complex = -1, ext = 0;
        node *c = NULL;
 
        if (TYPE(n) == parameters) {
@@ -4308,17 +4308,9 @@ symtable_params(struct symtable *st, node *n)
                        char nbuf[10];
                        sprintf(nbuf, ".%d", i);
                        symtable_add_def(st, nbuf, DEF_PARAM);
-                       complex = 1;
+                       complex = i;
                }
        }
-       if (complex) {
-               int j;
-               for (j = 0; j < i; j += 2) {
-                       c = CHILD(n, j);
-                       if (TYPE(CHILD(c, 0)) == LPAR)
-                               symtable_params_fplist(st, CHILD(c, 1));
-               } 
-       }
        if (ext) {
                c = CHILD(n, i);
                if (TYPE(c) == STAR) {
@@ -4327,15 +4319,26 @@ symtable_params(struct symtable *st, node *n)
                                         DEF_PARAM | DEF_STAR);
                        i += 2;
                        if (i >= NCH(n))
-                               return;
+                               c = NULL;
+                       else
                        c = CHILD(n, i);
                }
-               if (TYPE(c) == DOUBLESTAR) {
+               if (c && TYPE(c) == DOUBLESTAR) {
                        i++;
                        symtable_add_def(st, STR(CHILD(n, i)), 
                                         DEF_PARAM | DEF_DOUBLESTAR);
                }
        }
+       if (complex >= 0) {
+               int j;
+               for (j = 0; j <= complex; j++) {
+                       c = CHILD(n, j);
+                       if (TYPE(c) == COMMA)
+                           c = CHILD(n, ++j);
+                       if (TYPE(CHILD(c, 0)) == LPAR)
+                               symtable_params_fplist(st, CHILD(c, 1));
+               } 
+       }
 }
 
 static void