Author: Philip Jenvey <pjen...@underboss.org>
Branch: py3k
Changeset: r84553:ccfc9fe7d495
Date: 2016-05-21 12:43 -0700
http://bitbucket.org/pypy/pypy/changeset/ccfc9fe7d495/

Log:    __qualname__ for getset_descriptors

diff --git a/lib-python/3/test/test_descr.py b/lib-python/3/test/test_descr.py
--- a/lib-python/3/test/test_descr.py
+++ b/lib-python/3/test/test_descr.py
@@ -4526,6 +4526,10 @@
 
         # make sure we have an example of each type of descriptor
         for d, n in zip(descriptors, types):
+            if (support.check_impl_detail(pypy=True) and
+                n in ('method', 'member', 'wrapper')):
+                # PyPy doesn't have these
+                continue
             self.assertEqual(type(d).__name__, n + '_descriptor')
 
         for d in descriptors:
@@ -4539,7 +4543,7 @@
 
         class X:
             pass
-        with self.assertRaises(TypeError):
+        with self.assertRaises((AttributeError, TypeError)):
             del X.__qualname__
 
         self.assertRaises(TypeError, type.__dict__['__qualname__'].__set__,
diff --git a/pypy/interpreter/test/test_typedef.py 
b/pypy/interpreter/test/test_typedef.py
--- a/pypy/interpreter/test/test_typedef.py
+++ b/pypy/interpreter/test/test_typedef.py
@@ -60,6 +60,7 @@
     def test_descr_getsetproperty(self):
         from types import FrameType
         assert FrameType.f_lineno.__name__ == 'f_lineno'
+        assert FrameType.f_lineno.__qualname__ == 'frame.f_lineno'
         assert FrameType.f_lineno.__objclass__ is FrameType
         class A(object):
             pass
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -263,6 +263,7 @@
         self.doc = doc
         self.reqcls = cls
         self.name = '<generic property>'
+        self.qualname = None
         self.objclass_getter = objclass_getter
         self.use_closure = use_closure
 
@@ -313,6 +314,21 @@
                 self.reqcls, Arguments(space, [w_obj,
                                                space.wrap(self.name)]))
 
+    def descr_get_qualname(self, space):
+        if self.qualname is None:
+            self.qualname = self._calculate_qualname(space)
+        return self.qualname
+
+    def _calculate_qualname(self, space):
+        if self.reqcls is None:
+            type_qualname = u'?'
+        else:
+            w_type = space.gettypeobject(self.reqcls.typedef)
+            type_qualname = space.unicode_w(
+                space.getattr(w_type, space.wrap('__qualname__')))
+        qualname = u"%s.%s" % (type_qualname, self.name.decode('utf-8'))
+        return space.wrap(qualname)
+
     def descr_get_objclass(space, property):
         return property.objclass_getter(space)
 
@@ -351,6 +367,7 @@
     __set__ = interp2app(GetSetProperty.descr_property_set),
     __delete__ = interp2app(GetSetProperty.descr_property_del),
     __name__ = interp_attrproperty('name', cls=GetSetProperty),
+    __qualname__ = GetSetProperty(GetSetProperty.descr_get_qualname),
     __objclass__ = GetSetProperty(GetSetProperty.descr_get_objclass),
     __doc__ = interp_attrproperty('doc', cls=GetSetProperty),
     )
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to