summaryrefslogtreecommitdiffstats
path: root/Modules/parsermodule.c
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2000-12-11 22:08:27 (GMT)
committerFred Drake <fdrake@acm.org>2000-12-11 22:08:27 (GMT)
commitb6429a202011c92e34062930fc3e3818053a126d (patch)
treefec7c2b1efc1b896ac27dabed9522cefeb63704c /Modules/parsermodule.c
parented911b8cfbcad2ff44fdaea10ac1daad5628800a (diff)
downloadcpython-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.c31
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) {