[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