Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3k
Changeset: r52042:873f1a85f982
Date: 2012-02-02 21:47 +0100
http://bitbucket.org/pypy/pypy/changeset/873f1a85f982/

Log:    Assign correct scope for expressions used in the class header class
        X(__metaclass=expr1, *expr2, **expr3)

        Remember to do the same thing when we add argument annotations!

diff --git a/pypy/interpreter/astcompiler/symtable.py 
b/pypy/interpreter/astcompiler/symtable.py
--- a/pypy/interpreter/astcompiler/symtable.py
+++ b/pypy/interpreter/astcompiler/symtable.py
@@ -370,6 +370,11 @@
     def visit_ClassDef(self, clsdef):
         self.note_symbol(clsdef.name, SYM_ASSIGNED)
         self.visit_sequence(clsdef.bases)
+        self.visit_sequence(clsdef.keywords)
+        if clsdef.starargs:
+            clsdef.starargs.walkabout(self)
+        if clsdef.kwargs:
+            clsdef.kwargs.walkabout(self)
         self.visit_sequence(clsdef.decorator_list)
         self.push_scope(ClassScope(clsdef), clsdef)
         self.note_symbol('@__class__', SYM_ASSIGNED)
diff --git a/pypy/interpreter/astcompiler/test/test_symtable.py 
b/pypy/interpreter/astcompiler/test/test_symtable.py
--- a/pypy/interpreter/astcompiler/test/test_symtable.py
+++ b/pypy/interpreter/astcompiler/test/test_symtable.py
@@ -217,6 +217,15 @@
         xscp = cscp.children[1]
         assert xscp.lookup("n") == symtable.SCOPE_FREE
 
+    def test_class_kwargs(self):
+        scp = self.func_scope("""def f(n):
+            class X(meta=Z, *args, **kwargs):
+                 pass""")
+        assert scp.lookup("X") == symtable.SCOPE_LOCAL
+        assert scp.lookup("Z") == symtable.SCOPE_GLOBAL_IMPLICIT
+        assert scp.lookup("args") == symtable.SCOPE_GLOBAL_IMPLICIT
+        assert scp.lookup("kwargs") == symtable.SCOPE_GLOBAL_IMPLICIT
+
     def test_lambda(self):
         scp = self.mod_scope("lambda x: y")
         self.check_unknown(scp, "x", "y")
diff --git a/pypy/interpreter/astcompiler/tools/Python.asdl 
b/pypy/interpreter/astcompiler/tools/Python.asdl
--- a/pypy/interpreter/astcompiler/tools/Python.asdl
+++ b/pypy/interpreter/astcompiler/tools/Python.asdl
@@ -1,4 +1,4 @@
--- ASDL's five builtin types are identifier, int, string, object, bool
+-- ASDL's four builtin types are identifier, int, string, object
 
 module Python version "$Revision: 43614 $"
 {
@@ -103,7 +103,7 @@
 
        -- not sure what to call the first argument for raise and except
        excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)
-                       attributes(int lineno, int col_offset)
+                       attributes (int lineno, int col_offset)
 
        arguments = (expr* args, identifier? vararg, expr* kwonlyargs, 
                     identifier? kwarg, expr* defaults)
@@ -114,3 +114,4 @@
         -- import name with optional 'as' alias.
         alias = (identifier name, identifier? asname)
 }
+
diff --git a/pypy/module/cpyext/test/test_cpyext.py 
b/pypy/module/cpyext/test/test_cpyext.py
--- a/pypy/module/cpyext/test/test_cpyext.py
+++ b/pypy/module/cpyext/test/test_cpyext.py
@@ -204,7 +204,8 @@
         filename.
         """
         name = name.encode()
-        init = init.encode()
+        if init is not None:
+            init = init.encode()
         body = body.encode()
         if init is not None:
             code = """
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to