[Python-checkins] cpython (merge 3.2 -> default): Issue #13343: Fix a SystemError when a lambda expression uses a global

amaury.forgeotdarc python-checkins at python.org
Fri Nov 4 22:29:49 CET 2011


http://hg.python.org/cpython/rev/bddb455439d0
changeset:   73367:bddb455439d0
parent:      73365:ca78ed7393bf
parent:      73366:1e0e821d2626
user:        Amaury Forgeot d'Arc <amauryfa at gmail.com>
date:        Fri Nov 04 22:29:24 2011 +0100
summary:
  Issue #13343: Fix a SystemError when a lambda expression uses a global
variable in the default value of a keyword-only argument:
(lambda *, arg=GLOBAL_NAME: None)

files:
  Lib/test/test_keywordonlyarg.py |  8 ++++++++
  Misc/NEWS                       |  4 ++++
  Python/symtable.c               |  3 +++
  3 files changed, 15 insertions(+), 0 deletions(-)


diff --git a/Lib/test/test_keywordonlyarg.py b/Lib/test/test_keywordonlyarg.py
--- a/Lib/test/test_keywordonlyarg.py
+++ b/Lib/test/test_keywordonlyarg.py
@@ -162,6 +162,14 @@
         self.assertEqual(Example.f(Example(), k1=1, k2=2), (1, 2))
         self.assertRaises(TypeError, Example.f, k1=1, k2=2)
 
+    def test_issue13343(self):
+        # The Python compiler must scan all symbols of a function to
+        # determine their scope: global, local, cell...
+        # This was not done for the default values of keyword
+        # arguments in a lambda definition, and the following line
+        # used to fail with a SystemError.
+        lambda *, k1=unittest: None
+
 def test_main():
     run_unittest(KeywordOnlyArgTestCase)
 
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,10 @@
 Core and Builtins
 -----------------
 
+- Issue #13343: Fix a SystemError when a lambda expression uses a global
+  variable in the default value of a keyword-only argument:
+  (lambda *, arg=GLOBAL_NAME: None)
+
 - Issue #12797: Added custom opener parameter to builtin open() and
   FileIO.open().
 
diff --git a/Python/symtable.c b/Python/symtable.c
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -1300,6 +1300,9 @@
             return 0;
         if (e->v.Lambda.args->defaults)
             VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
+        if (e->v.Lambda.args->kw_defaults)
+            VISIT_KWONLYDEFAULTS(st,
+                                 e->v.Lambda.args->kw_defaults);
         if (!symtable_enter_block(st, lambda,
                                   FunctionBlock, (void *)e, e->lineno,
                                   e->col_offset))

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list