[Python-checkins] r67366 - in python/branches/release26-maint: Lib/test/test_parser.py Misc/NEWS Modules/parsermodule.c

benjamin.peterson python-checkins at python.org
Mon Nov 24 05:19:50 CET 2008


Author: benjamin.peterson
Date: Mon Nov 24 05:19:49 2008
New Revision: 67366

Log:
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
........


Modified:
   python/branches/release26-maint/   (props changed)
   python/branches/release26-maint/Lib/test/test_parser.py
   python/branches/release26-maint/Misc/NEWS
   python/branches/release26-maint/Modules/parsermodule.c

Modified: python/branches/release26-maint/Lib/test/test_parser.py
==============================================================================
--- python/branches/release26-maint/Lib/test/test_parser.py	(original)
+++ python/branches/release26-maint/Lib/test/test_parser.py	Mon Nov 24 05:19:49 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/branches/release26-maint/Misc/NEWS
==============================================================================
--- python/branches/release26-maint/Misc/NEWS	(original)
+++ python/branches/release26-maint/Misc/NEWS	Mon Nov 24 05:19:49 2008
@@ -96,6 +96,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/branches/release26-maint/Modules/parsermodule.c
==============================================================================
--- python/branches/release26-maint/Modules/parsermodule.c	(original)
+++ python/branches/release26-maint/Modules/parsermodule.c	Mon Nov 24 05:19:49 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