Mercurial > cpython-lru_cache-weakref
diff Modules/parsermodule.c @ 15506:ac830c9e9a83 legacy-trunk
validate_varargslist(): Fix two bugs in this function, one that affected
it when *args and/or **kw are used, and one when
they are not.
This closes bug #125375: "parser.tuple2ast() failure on valid parse tree".
| author | Fred Drake <fdrake@acm.org> |
|---|---|
| date | Mon, 11 Dec 2000 22:08:27 +0000 |
| parents | 8aa947e1eee8 |
| children | 939b8fffc452 |
line wrap: on
line diff
--- a/Modules/parsermodule.c Mon Dec 11 20:57:13 2000 +0000 +++ b/Modules/parsermodule.c Mon Dec 11 22:08:27 2000 +0000 @@ -1098,12 +1098,17 @@ int res = validate_ntype(tree, varargslist) && (nch != 0); int sym; + if (!res) + return 0; if (nch < 1) { err_string("varargslist missing child nodes"); return 0; } sym = TYPE(CHILD(tree, 0)); if (sym == STAR || sym == DOUBLESTAR) + /* whole thing matches: + * '*' NAME [',' '**' NAME] | '**' NAME + */ res = validate_varargslist_trailer(tree, 0); else if (sym == fpdef) { int i = 0; @@ -1127,11 +1132,16 @@ } if (res && i < nch) { res = validate_comma(CHILD(tree, i)); - if (res) - ++i; + ++i; + if (res && i < nch + && (TYPE(CHILD(tree, i)) == DOUBLESTAR + || TYPE(CHILD(tree, i)) == STAR)) + break; } } - /* handle '*' NAME [',' '**' NAME] | '**' NAME */ + /* ... '*' NAME [',' '**' NAME] | '**' NAME + * i --^^^ + */ if (res) res = validate_varargslist_trailer(tree, i); } @@ -1139,6 +1149,7 @@ /* * fpdef ['=' test] (',' fpdef ['=' test])* [','] */ + /* strip trailing comma node */ if (sym == COMMA) { res = validate_comma(CHILD(tree, nch-1)); if (!res) @@ -1150,9 +1161,9 @@ */ res = validate_fpdef(CHILD(tree, 0)); ++i; - if (res && (i+2 < nch) && TYPE(CHILD(tree, 1)) == EQUAL) { - res = (validate_equal(CHILD(tree, 1)) - && validate_test(CHILD(tree, 2))); + if (res && (i+2 <= nch) && TYPE(CHILD(tree, i)) == EQUAL) { + res = (validate_equal(CHILD(tree, i)) + && validate_test(CHILD(tree, i+1))); i += 2; } /* @@ -1163,12 +1174,10 @@ res = (validate_comma(CHILD(tree, i)) && validate_fpdef(CHILD(tree, i+1))); i += 2; - if (res && (nch - i) >= 2 - && TYPE(CHILD(tree, i)) == COMMA) { - res = (validate_comma(CHILD(tree, i)) + if (res && (nch - i) >= 2 && TYPE(CHILD(tree, i)) == EQUAL) { + res = (validate_equal(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); - if (res) - i += 2; + i += 2; } } if (res && nch - i != 0) {
