[pypy-commit] pypy py3.5: Minimal changes to pass these tests

arigo pypy.commits at gmail.com
Fri Dec 2 04:52:54 EST 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5
Changeset: r88811:d1edc5aca1da
Date: 2016-12-02 10:52 +0100
http://bitbucket.org/pypy/pypy/changeset/d1edc5aca1da/

Log:	Minimal changes to pass these tests

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
@@ -213,7 +213,7 @@
             try:
                 role_here = self.roles[name]
             except KeyError:
-                if name in bound:
+                if bound and name in bound:
                     self.symbols[name] = SCOPE_FREE
                     self.free_vars[name] = None
             else:
@@ -330,7 +330,7 @@
         return misc.mangle(name, self.name)
 
     def _pass_special_names(self, local, new_bound):
-        assert '__class__' in local
+        #assert '__class__' in local
         new_bound['__class__'] = None
 
     def _finalize_cells(self, free):
@@ -485,7 +485,9 @@
     def visit_Global(self, glob):
         for name in glob.names:
             old_role = self.scope.lookup_role(name)
-            if old_role & (SYM_USED | SYM_ASSIGNED):
+            if (old_role & (SYM_USED | SYM_ASSIGNED) and not
+                    (name == '__class__' and
+                     self.scope._hide_bound_from_nested_scopes)):
                 if old_role & SYM_ASSIGNED:
                     msg = "name '%s' is assigned to before global declaration" \
                         % (name,)
@@ -499,7 +501,9 @@
     def visit_Nonlocal(self, nonl):
         for name in nonl.names:
             old_role = self.scope.lookup_role(name)
-            if old_role & (SYM_USED | SYM_ASSIGNED):
+            if (old_role & (SYM_USED | SYM_ASSIGNED) and not
+                    (name == '__class__' and
+                     self.scope._hide_bound_from_nested_scopes)):
                 if old_role & SYM_ASSIGNED:
                     msg = "name '%s' is assigned to before nonlocal declaration" \
                         % (name,)
diff --git a/pypy/interpreter/test/test_compiler.py b/pypy/interpreter/test/test_compiler.py
--- a/pypy/interpreter/test/test_compiler.py
+++ b/pypy/interpreter/test/test_compiler.py
@@ -399,8 +399,11 @@
     class X:
         nonlocal __class__
         __class__ = 42
+    assert locals()['__class__'] == 42
+    # ^^^ but at the same place, reading '__class__' gives a NameError
+    # in CPython 3.5.2.  Looks like a bug to me
 def testing():
-    return 42   # 'Y.__class__' is *not* set to 42, at least on CPython 3.5.2
+    return 42
 '''
         ]:
             space.call_args(w_filterwarnings, filter_arg)


More information about the pypy-commit mailing list