[pypy-commit] pypy reverse-debugger: Write down both implementations for cffi callbacks: the old one which

arigo pypy.commits at gmail.com
Fri Jul 1 14:21:00 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: reverse-debugger
Changeset: r85503:59aff804be9c
Date: 2016-07-01 20:22 +0200
http://bitbucket.org/pypy/pypy/changeset/59aff804be9c/

Log:	Write down both implementations for cffi callbacks: the old one
	which uses RWeakList, and the new one which uses direct casts of gc
	pointers to addresses (but doesn't work e.g. with the reverse
	debugger)

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
@@ -3,9 +3,9 @@
 """
 import sys, os, py
 
-from rpython.rlib import clibffi, jit, rgc, objectmodel
+from rpython.rlib import clibffi, jit, objectmodel
 from rpython.rlib.objectmodel import keepalive_until_here
-from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
+from rpython.rtyper.lltypesystem import lltype, rffi
 
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.module._cffi_backend import cerrno, misc, parse_c_type
@@ -13,6 +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
 
 BIG_ENDIAN = sys.byteorder == 'big'
 
@@ -30,9 +31,7 @@
     return cdata
 
 def reveal_callback(raw_ptr):
-    addr = rffi.cast(llmemory.Address, raw_ptr)
-    gcref = rgc.reveal_gcref(addr)
-    return rgc.try_cast_gcref_to_instance(W_ExternPython, gcref)
+    return hide_reveal().reveal_object(W_ExternPython, raw_ptr)
 
 
 class Closure(object):
@@ -92,9 +91,7 @@
         return ctype
 
     def hide_object(self):
-        gcref = rgc.cast_instance_to_gcref(self)
-        raw = rgc.hide_nonmovable_gcref(gcref)
-        return rffi.cast(rffi.VOIDP, raw)
+        return hide_reveal().hide_object(self)
 
     def _repr_extra(self):
         space = self.space
diff --git a/pypy/module/_cffi_backend/hide_reveal.py b/pypy/module/_cffi_backend/hide_reveal.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_cffi_backend/hide_reveal.py
@@ -0,0 +1,54 @@
+from rpython.rlib import rgc
+from rpython.rlib.rweaklist import RWeakListMixin
+from rpython.rlib.objectmodel import fetch_translated_config
+from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
+
+
+class HideRevealRWeakList:
+    """Slow implementation of HideReveal: uses a RWeakListMixin."""
+
+    def __init__(self):
+        class GlobGcrefs(RWeakListMixin):
+            pass
+        self.glob_gcrefs = GlobGcrefs()
+        self.glob_gcrefs.initialize()
+
+    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(llmemory.Address, 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 _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)
+
+
+hide_reveal_slow = HideRevealRWeakList()
+hide_reveal_fast = HideRevealCast()
+
+def hide_reveal():
+    config = fetch_translated_config()
+    if config is not None and config.translation.split_gc_address_space:
+        return hide_reveal_slow
+    else:
+        return hide_reveal_fast


More information about the pypy-commit mailing list