Author: Amaury Forgeot d'Arc <amaur...@gmail.com>
Branch: py3.5
Changeset: r87699:25f86076fa10
Date: 2016-10-11 00:53 +0200
http://bitbucket.org/pypy/pypy/changeset/25f86076fa10/

Log:    Add weakref.__callback__

diff --git a/pypy/module/_weakref/interp__weakref.py 
b/pypy/module/_weakref/interp__weakref.py
--- a/pypy/module/_weakref/interp__weakref.py
+++ b/pypy/module/_weakref/interp__weakref.py
@@ -2,7 +2,7 @@
 from pypy.interpreter.baseobjspace import W_Root
 from pypy.interpreter.error import oefmt
 from pypy.interpreter.gateway import interp2app, ObjSpace
-from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.typedef import TypeDef, GetSetProperty
 from pypy.interpreter.executioncontext import AsyncAction, report_error
 from rpython.rlib import jit, rgc
 from rpython.rlib.rshrinklist import AbstractShrinkList
@@ -150,6 +150,7 @@
                 except Exception as e:
                     report_error(self.space, e,
                                  "weakref callback ", w_ref.w_callable)
+                w_ref.w_callable = None
 
 
 # ____________________________________________________________
@@ -187,6 +188,9 @@
                 state = u"; to '%s'" % (typename,)
         return self.getrepr(space, unicode(self.typedef.name), state)
 
+    def descr_callback(self, space):
+        return self.w_callable
+
 
 class W_Weakref(W_WeakrefBase):
     def __init__(self, space, w_obj, w_callable):
@@ -256,6 +260,7 @@
     __hash__ = interp2app(W_Weakref.descr_hash),
     __call__ = interp2app(W_Weakref.descr_call),
     __repr__ = interp2app(W_WeakrefBase.descr__repr__),
+    __callback__ = GetSetProperty(W_WeakrefBase.descr_callback),
 )
 
 
diff --git a/pypy/module/_weakref/test/test_weakref.py 
b/pypy/module/_weakref/test/test_weakref.py
--- a/pypy/module/_weakref/test/test_weakref.py
+++ b/pypy/module/_weakref/test/test_weakref.py
@@ -32,10 +32,13 @@
             a2.ref = ref()
         ref1 = _weakref.ref(a1, callback)
         ref2 = _weakref.ref(a1)
+        assert ref1.__callback__ is callback
+        assert ref2.__callback__ is None
         assert _weakref.getweakrefcount(a1) == 2
         del a1
         gc.collect()
         assert ref1() is None
+        assert ref1.__callback__ is None
         assert a2.ref is None
 
     def test_callback_order(self):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to