[Python-checkins] cpython (merge 3.2 -> default): Issue #14696: Merge from 3.2

mark.dickinson python-checkins at python.org
Sun Apr 29 23:20:07 CEST 2012


http://hg.python.org/cpython/rev/5acddc7c666d
changeset: 76648:5acddc7c666d
parent: 76646:e14ed98fc33c
parent: 76647:b7e491b9094f
user: Mark Dickinson <mdickinson at enthought.com>
date: Sun Apr 29 22:20:01 2012 +0100
summary:
 Issue #14696: Merge from 3.2
files:
 Lib/test/test_parser.py | 10 +++++++
 Misc/NEWS | 2 +
 Modules/parsermodule.c | 41 +++++++++++++++++++++++++---
 3 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py
--- a/Lib/test/test_parser.py
+++ b/Lib/test/test_parser.py
@@ -61,6 +61,16 @@
 " if (yield):\n"
 " yield x\n")
 
+ def test_nonlocal_statement(self):
+ self.check_suite("def f():\n"
+ " x = 0\n"
+ " def g():\n"
+ " nonlocal x\n")
+ self.check_suite("def f():\n"
+ " x = y = 0\n"
+ " def g():\n"
+ " nonlocal x, y\n")
+
 def test_expressions(self):
 self.check_expr("foo(1)")
 self.check_expr("[1, 2, 3]")
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -84,6 +84,8 @@
 Library
 -------
 
+- Issue #14696: Fix parser module to understand 'nonlocal' declarations.
+
 - Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
 the DST transition. Patch by Joe Peterson.
 
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -956,7 +956,8 @@
 VALIDATER(return_stmt); VALIDATER(raise_stmt);
 VALIDATER(import_stmt); VALIDATER(import_stmt);
 VALIDATER(import_name); VALIDATER(yield_stmt);
-VALIDATER(global_stmt); VALIDATER(assert_stmt);
+VALIDATER(global_stmt); VALIDATER(nonlocal_stmt);
+VALIDATER(assert_stmt);
 VALIDATER(compound_stmt); VALIDATER(test_or_star_expr);
 VALIDATER(while); VALIDATER(for);
 VALIDATER(try); VALIDATER(except_clause);
@@ -1480,6 +1481,7 @@
 || (ntype == flow_stmt)
 || (ntype == import_stmt)
 || (ntype == global_stmt)
+ || (ntype == nonlocal_stmt)
 || (ntype == assert_stmt))
 res = validate_node(CHILD(tree, 0));
 else {
@@ -1864,8 +1866,10 @@
 }
 
 
-
-
+/* global_stmt:
+ *
+ * 'global' NAME (',' NAME)*
+ */
 static int
 validate_global_stmt(node *tree)
 {
@@ -1887,6 +1891,30 @@
 return (res);
 }
 
+/* nonlocal_stmt:
+ *
+ * 'nonlocal' NAME (',' NAME)*
+ */
+static int
+validate_nonlocal_stmt(node *tree)
+{
+ int j;
+ int nch = NCH(tree);
+ int res = (validate_ntype(tree, nonlocal_stmt)
+ && is_even(nch) && (nch >= 2));
+
+ if (!res && !PyErr_Occurred())
+ err_string("illegal nonlocal statement");
+
+ if (res)
+ res = (validate_name(CHILD(tree, 0), "nonlocal")
+ && validate_ntype(CHILD(tree, 1), NAME));
+ for (j = 2; res && (j < nch); j += 2)
+ res = (validate_comma(CHILD(tree, j))
+ && validate_ntype(CHILD(tree, j + 1), NAME));
+
+ return res;
+}
 
 /* assert_stmt:
 *
@@ -2951,8 +2979,8 @@
 break;
 case small_stmt:
 /*
- * expr_stmt | del_stmt | pass_stmt | flow_stmt
- * | import_stmt | global_stmt | assert_stmt
+ * expr_stmt | del_stmt | pass_stmt | flow_stmt |
+ * import_stmt | global_stmt | nonlocal_stmt | assert_stmt
 */
 res = validate_small_stmt(tree);
 break;
@@ -3019,6 +3047,9 @@
 case global_stmt:
 res = validate_global_stmt(tree);
 break;
+ case nonlocal_stmt:
+ res = validate_nonlocal_stmt(tree);
+ break;
 case assert_stmt:
 res = validate_assert_stmt(tree);
 break;
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /