Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit