[Python-checkins] r67365 - in python/trunk: Lib/test/test_parser.py Misc/NEWS Modules/parsermodule.c
benjamin.peterson
python-checkins at python.org
Mon Nov 24 05:09:03 CET 2008
Author: benjamin.peterson
Date: Mon Nov 24 05:09:03 2008
New Revision: 67365
Log:
#4396 make the parser module correctly validate the with syntax
Modified:
python/trunk/Lib/test/test_parser.py
python/trunk/Misc/NEWS
python/trunk/Modules/parsermodule.c
Modified: python/trunk/Lib/test/test_parser.py
==============================================================================
--- python/trunk/Lib/test/test_parser.py (original)
+++ python/trunk/Lib/test/test_parser.py Mon Nov 24 05:09:03 2008
@@ -196,6 +196,10 @@
def test_assert(self):
self.check_suite("assert alo < ahi and blo < bhi\n")
+ def test_with(self):
+ self.check_suite("with open('x'): pass\n")
+ self.check_suite("with open('x') as f: pass\n")
+
def test_position(self):
# An absolutely minimal test of position information. Better
# tests would be a big project.
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS (original)
+++ python/trunk/Misc/NEWS Mon Nov 24 05:09:03 2008
@@ -106,6 +106,11 @@
- Issue #4122: On Windows, fix a compilation error when using the
Py_UNICODE_ISSPACE macro in an extension module.
+Extension Modules
+-----------------
+
+- Issue #4396: The parser module now correctly validates the with statement.
+
What's New in Python 2.6 final
==============================
Modified: python/trunk/Modules/parsermodule.c
==============================================================================
--- python/trunk/Modules/parsermodule.c (original)
+++ python/trunk/Modules/parsermodule.c Mon Nov 24 05:09:03 2008
@@ -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;
More information about the Python-checkins
mailing list