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