[pypy-svn] r74409 - pypy/trunk/pypy/module/cpyext
afa at codespeak.net
afa at codespeak.net
Thu May 6 13:51:14 CEST 2010
Author: afa
Date: Thu May 6 13:51:10 2010
New Revision: 74409
Modified:
pypy/trunk/pypy/module/cpyext/pyobject.py
Log:
Actually a dict(w_container: set of w_borrowees) makes things easier
Modified: pypy/trunk/pypy/module/cpyext/pyobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/pyobject.py (original)
+++ pypy/trunk/pypy/module/cpyext/pyobject.py Thu May 6 13:51:10 2010
@@ -151,7 +151,7 @@
self.space = space
self.py_objects_w2r = {} # { w_obj -> raw PyObject }
self.py_objects_r2w = {} # { addr of raw PyObject -> w_obj }
- self.borrow_mapping = {} # { addr of container -> { w_containee -> None } }
+ self.borrow_mapping = {} # { w_container -> { w_containee -> None } }
self.borrowed_objects = {} # { addr of containee -> None }
self.non_heaptypes_w = []
@@ -295,8 +295,8 @@
if not space.is_w(w_typetype, space.gettypeobject(W_PyCTypeObject.typedef)):
_Py_Dealloc(space, obj)
del state.py_objects_w2r[w_obj]
- # if the object was a container for borrowed references
- delete_borrower(space, obj)
+ # if the object was a container for borrowed references
+ delete_borrower(space, w_obj)
else:
if not we_are_translated() and obj.c_ob_refcnt < 0:
message = "Negative refcount for obj %s with type %s" % (
@@ -344,12 +344,9 @@
else:
Py_DecRef(space, ref) # already in borrowed list
- container = make_ref(space, w_container)
- if not container: # self-managed
+ if w_container is None: # self-managed
return ref
- Py_DecRef(space, container)
- container_ptr = rffi.cast(ADDR, container)
- borrowees = state.borrow_mapping.setdefault(container_ptr, {})
+ borrowees = state.borrow_mapping.setdefault(w_container, {})
borrowees[w_borrowed] = None
return ref
@@ -385,17 +382,16 @@
else:
Py_DecRef(space, ref)
-def delete_borrower(space, py_obj):
+def delete_borrower(space, w_obj):
"""
Called when a potential container for borrowed references has lost its
last reference. Removes the borrowed references it contains.
"""
- ptr = rffi.cast(ADDR, py_obj)
state = space.fromcache(RefcountState)
- if ptr in state.borrow_mapping: # move to lifeline __del__
- for w_containee in state.borrow_mapping[ptr]:
+ if w_obj in state.borrow_mapping: # move to lifeline __del__
+ for w_containee in state.borrow_mapping[w_obj]:
forget_borrowee(space, w_containee)
- del state.borrow_mapping[ptr]
+ del state.borrow_mapping[w_obj]
#___________________________________________________________
More information about the Pypy-commit
mailing list