Author: Armin Rigo <ar...@tunes.org>
Branch: reverse-debugger
Changeset: r85510:0b7b98628f9f
Date: 2016-07-02 00:19 +0200
http://bitbucket.org/pypy/pypy/changeset/0b7b98628f9f/

Log:    A second place with hide/reveal

diff --git a/pypy/module/_cffi_backend/ccallback.py 
b/pypy/module/_cffi_backend/ccallback.py
--- a/pypy/module/_cffi_backend/ccallback.py
+++ b/pypy/module/_cffi_backend/ccallback.py
@@ -13,7 +13,7 @@
 from pypy.module._cffi_backend.ctypefunc import SIZE_OF_FFI_ARG, W_CTypeFunc
 from pypy.module._cffi_backend.ctypeprim import W_CTypePrimitiveSigned
 from pypy.module._cffi_backend.ctypevoid import W_CTypeVoid
-from pypy.module._cffi_backend.hide_reveal import hide_reveal
+from pypy.module._cffi_backend.hide_reveal import hide_reveal1
 
 BIG_ENDIAN = sys.byteorder == 'big'
 
@@ -31,7 +31,7 @@
     return cdata
 
 def reveal_callback(raw_ptr):
-    return hide_reveal().reveal_object(W_ExternPython, raw_ptr)
+    return hide_reveal1().reveal_object(W_ExternPython, raw_ptr)
 
 
 class Closure(object):
@@ -91,7 +91,7 @@
         return ctype
 
     def hide_object(self):
-        return hide_reveal().hide_object(self)
+        return hide_reveal1().hide_object(rffi.VOIDP, self)
 
     def _repr_extra(self):
         space = self.space
diff --git a/pypy/module/_cffi_backend/handle.py 
b/pypy/module/_cffi_backend/handle.py
--- a/pypy/module/_cffi_backend/handle.py
+++ b/pypy/module/_cffi_backend/handle.py
@@ -3,8 +3,9 @@
 from pypy.interpreter.gateway import unwrap_spec
 from pypy.interpreter.baseobjspace import W_Root
 from pypy.module._cffi_backend import ctypeobj, ctypeptr, cdataobj
+from pypy.module._cffi_backend.hide_reveal import hide_reveal2
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
-from rpython.rlib import rgc, objectmodel, jit
+from rpython.rlib import objectmodel, jit
 
 # ____________________________________________________________
 
@@ -15,9 +16,7 @@
     # we can cast the CCHARP back to a W_CDataHandle with reveal_gcref().
     new_cdataobj = objectmodel.instantiate(cdataobj.W_CDataHandle,
                                            nonmovable=True)
-    gcref = rgc.cast_instance_to_gcref(new_cdataobj)
-    _cdata = rgc.hide_nonmovable_gcref(gcref)
-    _cdata = rffi.cast(rffi.CCHARP, _cdata)
+    _cdata = hide_reveal2().hide_object(rffi.CCHARP, new_cdataobj)
     cdataobj.W_CDataHandle.__init__(new_cdataobj, space, _cdata, w_ctype, w_x)
     return new_cdataobj
 
@@ -43,11 +42,10 @@
 @jit.dont_look_inside
 def _reveal(space, ptr):
     addr = rffi.cast(llmemory.Address, ptr)
-    gcref = rgc.reveal_gcref(addr)
-    if not gcref:
+    if not addr:
         raise oefmt(space.w_RuntimeError,
                     "cannot use from_handle() on NULL pointer")
-    cd = rgc.try_cast_gcref_to_instance(cdataobj.W_CDataHandle, gcref)
+    cd = hide_reveal2().reveal_object(cdataobj.W_CDataHandle, addr)
     if cd is None:
         raise oefmt(space.w_SystemError,
                     "ffi.from_handle(): dead or bogus object handle")
diff --git a/pypy/module/_cffi_backend/hide_reveal.py 
b/pypy/module/_cffi_backend/hide_reveal.py
--- a/pypy/module/_cffi_backend/hide_reveal.py
+++ b/pypy/module/_cffi_backend/hide_reveal.py
@@ -9,44 +9,58 @@
     def __init__(self):
         class GlobGcrefs(RWeakListMixin):
             pass
-        self.glob_gcrefs = GlobGcrefs()
-        self.glob_gcrefs.initialize()
+        glob_gcrefs = GlobGcrefs()
+        glob_gcrefs.initialize()
+
+        def hide_object(PTR, obj):
+            # XXX leaks if we call this function often on the same object
+            index = glob_gcrefs.add_handle(obj)
+            return rffi.cast(PTR, index + 1)
+
+        def reveal_object(Class, addr):
+            index = rffi.cast(lltype.Signed, addr) - 1
+            return glob_gcrefs.fetch_handle(index)
+
+        self.hide_object = hide_object
+        self.reveal_object = reveal_object
 
     def _freeze_(self):
         return True
 
-    def hide_object(self, obj):
-        # XXX leaks if we call this function often on the same object
-        index = self.glob_gcrefs.add_handle(obj)
-        return rffi.cast(rffi.VOIDP, index)
-
-    def reveal_object(self, Class, addr):
-        index = rffi.cast(lltype.Signed, addr)
-        return self.glob_gcrefs.fetch_handle(index)
-
 
 class HideRevealCast:
     """Fast implementation of HideReveal: just a cast."""
 
+    def __init__(self):
+
+        def hide_object(PTR, obj):
+            gcref = rgc.cast_instance_to_gcref(obj)
+            raw = rgc.hide_nonmovable_gcref(gcref)
+            return rffi.cast(PTR, raw)
+
+        def reveal_object(Class, raw_ptr):
+            addr = rffi.cast(llmemory.Address, raw_ptr)
+            gcref = rgc.reveal_gcref(addr)
+            return rgc.try_cast_gcref_to_instance(Class, gcref)
+
+        self.hide_object = hide_object
+        self.reveal_object = reveal_object
+
     def _freeze_(self):
         return True
 
-    def hide_object(self, obj):
-        gcref = rgc.cast_instance_to_gcref(obj)
-        raw = rgc.hide_nonmovable_gcref(gcref)
-        return rffi.cast(rffi.VOIDP, raw)
 
-    def reveal_object(self, Class, raw_ptr):
-        addr = rffi.cast(llmemory.Address, raw_ptr)
-        gcref = rgc.reveal_gcref(addr)
-        return rgc.try_cast_gcref_to_instance(Class, gcref)
+def make_hide_reveal():
+    hide_reveal_slow = HideRevealRWeakList()
+    hide_reveal_fast = HideRevealCast()
 
+    def hide_reveal():
+        if rgc.must_split_gc_address_space():
+            return hide_reveal_slow
+        else:
+            return hide_reveal_fast
 
-hide_reveal_slow = HideRevealRWeakList()
-hide_reveal_fast = HideRevealCast()
+    return hide_reveal
 
-def hide_reveal():
-    if rgc.must_split_gc_address_space():
-        return hide_reveal_slow
-    else:
-        return hide_reveal_fast
+hide_reveal1 = make_hide_reveal()    # for ccallback.py
+hide_reveal2 = make_hide_reveal()    # for handles.py
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to