diff options
author | Fred Drake <fdrake@acm.org> | 2000-12-11 22:08:27 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2000-12-11 22:08:27 (GMT) |
commit | b6429a202011c92e34062930fc3e3818053a126d (patch) | |
tree | fec7c2b1efc1b896ac27dabed9522cefeb63704c /Modules/parsermodule.c | |
parent | ed911b8cfbcad2ff44fdaea10ac1daad5628800a (diff) | |
download | cpython-b6429a202011c92e34062930fc3e3818053a126d.zip cpython-b6429a202011c92e34062930fc3e3818053a126d.tar.gz cpython-b6429a202011c92e34062930fc3e3818053a126d.tar.bz2 |
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".
Diffstat (limited to 'Modules/parsermodule.c')
-rw-r--r-- | Modules/parsermodule.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index e6e1456..8019c3a 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -1098,12 +1098,17 @@ validate_varargslist(node *tree) 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 @@ validate_varargslist(node *tree) } 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 @@ validate_varargslist(node *tree) /* * fpdef ['=' test] (',' fpdef ['=' test])* [','] */ + /* strip trailing comma node */ if (sym == COMMA) { res = validate_comma(CHILD(tree, nch-1)); if (!res) @@ -1150,9 +1161,9 @@ validate_varargslist(node *tree) */ 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 @@ validate_varargslist(node *tree) 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) { |