Mercurial > cpython-lru_cache-weakref
diff Modules/parsermodule.c @ 49836:99598a61cc35 2.6
Merged revisions 67365 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r67365 | benjamin.peterson | 2008-11-23 22:09:03 -0600 (Sun, 23 Nov 2008) | 1 line
#4396 make the parser module correctly validate the with syntax
........
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Mon, 24 Nov 2008 04:19:49 +0000 |
| parents | 2ed3f8926bb8 |
| children | ae98681058b2 |
line wrap: on
line diff
--- a/Modules/parsermodule.c Mon Nov 24 00:42:44 2008 +0000 +++ b/Modules/parsermodule.c Mon Nov 24 04:19:49 2008 +0000 @@ -1559,7 +1559,7 @@ /* compound_stmt: - * if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef | decorated + * if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated */ static int validate_compound_stmt(node *tree) @@ -1577,6 +1577,7 @@ || (ntype == while_stmt) || (ntype == for_stmt) || (ntype == try_stmt) + || (ntype == with_stmt) || (ntype == funcdef) || (ntype == classdef) || (ntype == decorated)) @@ -2617,6 +2618,38 @@ return ok; } +/* with_var +with_var: 'as' expr + */ +static int +validate_with_var(node *tree) +{ + int nch = NCH(tree); + int ok = (validate_ntype(tree, with_var) + && (nch == 2) + && validate_name(CHILD(tree, 0), "as") + && validate_expr(CHILD(tree, 1))); + return ok; +} + +/* with_stmt + * 0 1 2 -2 -1 +with_stmt: 'with' test [ with_var ] ':' suite + */ +static int +validate_with_stmt(node *tree) +{ + int nch = NCH(tree); + int ok = (validate_ntype(tree, with_stmt) + && ((nch == 4) || (nch == 5)) + && validate_name(CHILD(tree, 0), "with") + && validate_test(CHILD(tree, 1)) + && (nch == 4 || validate_with_var(CHILD(tree, 2))) + && validate_colon(RCHILD(tree, -2)) + && validate_suite(RCHILD(tree, -1))); + return ok; +} + /* funcdef: * * -5 -4 -3 -2 -1 @@ -2993,6 +3026,9 @@ case funcdef: res = validate_funcdef(tree); break; + case with_stmt: + res = validate_with_stmt(tree); + break; case classdef: res = validate_class(tree); break;
