[pypy-svn] pypy 32ptr-on-64bit: Phew. More and more cases, until the test half-passes.
arigo
commits-noreply at bitbucket.org
Fri Apr 15 11:45:22 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: 32ptr-on-64bit
Changeset: r43381:dd9738a16aec
Date: 2011-04-15 11:44 +0200
http://bitbucket.org/pypy/pypy/changeset/dd9738a16aec/
Log: Phew. More and more cases, until the test half-passes.
diff --git a/pypy/jit/metainterp/test/test_rcompressed.py b/pypy/jit/metainterp/test/test_rcompressed.py
--- a/pypy/jit/metainterp/test/test_rcompressed.py
+++ b/pypy/jit/metainterp/test/test_rcompressed.py
@@ -30,8 +30,9 @@
('c', lltype.Char))
SPTR = lltype.Ptr(S)
@jit.dont_look_inside
- def escape(p):
- return p
+ def escape(ptr):
+ assert llop.show_from_ptr32(SPTR, ptr.p).n == 42
+ return ptr
def f(n):
y = lltype.malloc(S)
y.n = n
diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -24,6 +24,7 @@
class GcLLDescription(GcCache):
minimal_size_in_nursery = 0
get_malloc_slowpath_addr = None
+ supports_compressed_ptrs = False
def __init__(self, gcdescr, translator=None, rtyper=None):
GcCache.__init__(self, translator is not None, rtyper)
@@ -44,8 +45,6 @@
return None
def freeing_block(self, start, stop):
pass
- def is_compressed_ptr(self, size):
- return False
# ____________________________________________________________
@@ -578,9 +577,9 @@
self.gcrootmap = gcrootmap
self.gcrefs = GcRefList()
self.single_gcref_descr = GcPtrFieldDescr('', 0)
- self.compressptr = gcdescr.config.translation.compressptr
- if self.compressptr:
- assert rffi.sizeof(rffi.INT) == rffi.sizeof(llmemory.HiddenGcRef32)
+ self.supports_compressed_ptrs = gcdescr.config.translation.compressptr
+ if self.supports_compressed_ptrs:
+ assert rffi.sizeof(rffi.UINT)==rffi.sizeof(llmemory.HiddenGcRef32)
# make a TransformerLayoutBuilder and save it on the translator
# where it can be fished and reused by the FrameworkGCTransformer
@@ -869,13 +868,6 @@
def freeing_block(self, start, stop):
self.gcrootmap.freeing_block(start, stop)
- def is_compressed_ptr(self, size):
- if self.compressptr: # constant-folded away
- ptrsize = symbolic.get_size_of_ptr(self.translate_support_code)
- return size != ptrsize
- else:
- return False
-
# ____________________________________________________________
def get_ll_description(gcdescr, translator=None, rtyper=None):
diff --git a/pypy/rpython/lltypesystem/ll2ctypes.py b/pypy/rpython/lltypesystem/ll2ctypes.py
--- a/pypy/rpython/lltypesystem/ll2ctypes.py
+++ b/pypy/rpython/lltypesystem/ll2ctypes.py
@@ -1271,11 +1271,14 @@
def _cast_to_ptr(self, PTRTYPE):
return force_cast(PTRTYPE, self.intval)
-## def _cast_to_int(self):
-## return self.intval
-
-## def _cast_to_adr(self):
-## return _lladdress(self.intval)
+ def _cast_to_hiddengcref32(self):
+ try:
+ result = _hiddengcref32[self]
+ except KeyError:
+ result = 1000 + len(_hiddengcref32)
+ _hiddengcref32[self] = result
+ _hiddengcref32back[result] = self
+ return _llgcopaque32(result)
def cast_adr_to_int(addr):
if isinstance(addr, llmemory.fakeaddress):
@@ -1335,11 +1338,20 @@
return not self == other
def _cast_to_ptr(self, PTRTYPE):
+ # this is supposed to be cast back to GcStruct, not to a plain
+ # Struct or to any kind of Array, because HiddenGcRef32s are
+ # supposed to be taken only to GcStructs.
+ assert isinstance(PTRTYPE.TO, lltype.GcStruct)
if self.uint32val == 0:
return lltype.nullptr(PTRTYPE.TO)
obj = _hiddengcref32back[self.uint32val]
return force_cast(PTRTYPE, obj._as_ptr())
+ def _cast_to_gcref(self):
+ obj = _hiddengcref32back[self.uint32val]
+ assert isinstance(obj, _llgcopaque)
+ return obj
+
# ____________________________________________________________
# errno
diff --git a/pypy/rpython/lltypesystem/opimpl.py b/pypy/rpython/lltypesystem/opimpl.py
--- a/pypy/rpython/lltypesystem/opimpl.py
+++ b/pypy/rpython/lltypesystem/opimpl.py
@@ -579,15 +579,21 @@
return False
def op_hide_into_ptr32(ptr):
+ if not ptr:
+ return lltype.nullptr(llmemory.HiddenGcRef32.TO)
if lltype.typeOf(ptr) == llmemory.Address:
- if not ptr:
- return lltype.nullptr(llmemory.HiddenGcRef32.TO)
ptr = ptr.ptr
if isinstance(lltype.typeOf(ptr).TO, lltype.GcOpaqueType):
- ptr = ptr._obj.container._as_ptr()
+ try:
+ ptr = ptr._obj.container._as_ptr()
+ except AttributeError:
+ # for _llgcopaque objects
+ return ptr._obj._cast_to_hiddengcref32()._as_ptr()
return lltype.cast_opaque_ptr(llmemory.HiddenGcRef32, ptr)
def op_show_from_ptr32(RESTYPE, ptr32):
+ if not ptr32:
+ return lltype.nullptr(RESTYPE.TO)
if RESTYPE == llmemory.Address:
if not ptr32:
return llmemory.NULL
@@ -595,7 +601,11 @@
ptr = lltype.cast_opaque_ptr(PTRTYPE, ptr32)
return llmemory.cast_ptr_to_adr(ptr)
if isinstance(RESTYPE.TO, lltype.GcOpaqueType):
- ptr32 = ptr32._obj.container._as_ptr()
+ try:
+ ptr32 = ptr32._obj.container._as_ptr()
+ except AttributeError:
+ # for _llgcopaque32 objects
+ return ptr32._obj._cast_to_gcref()._as_ptr()
return lltype.cast_opaque_ptr(RESTYPE, ptr32)
op_show_from_ptr32.need_result_type = True
diff --git a/pypy/jit/backend/llsupport/test/test_runner.py b/pypy/jit/backend/llsupport/test/test_runner.py
--- a/pypy/jit/backend/llsupport/test/test_runner.py
+++ b/pypy/jit/backend/llsupport/test/test_runner.py
@@ -9,11 +9,6 @@
class MyLLCPU(AbstractLLCPU):
supports_floats = True
- def __init__(self, *args, **kwds):
- super(MyLLCPU, self).__init__(*args, **kwds)
- self.gc_ll_descr.is_compressed_ptr = (
- lambda size: sys.maxint > 2147483647 and size == 4)
-
def compile_loop(self, inputargs, operations, looptoken):
py.test.skip("llsupport test: cannot compile operations")
diff --git a/pypy/jit/backend/llsupport/llmodel.py b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -221,6 +221,12 @@
x = llop.hide_into_ptr32(llmemory.HiddenGcRef32, x)
return rffi.cast(rffi.UINT, x)
+ def is_compressed_ptr(self, size):
+ if we_are_translated():
+ if not self.gc_ll_descr.supports_compressed_ptrs:
+ return False # nicely constant-foldable
+ return WORD == 8 and size == 4
+
@staticmethod
def cast_int_to_adr(x):
return rffi.cast(llmemory.Address, x)
@@ -303,7 +309,7 @@
def bh_getarrayitem_gc_r(self, arraydescr, gcref, itemindex):
ofs, size, _ = self.unpack_arraydescr(arraydescr)
- icp = self.gc_ll_descr.is_compressed_ptr(size)
+ icp = self.is_compressed_ptr(size)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
if icp:
@@ -341,7 +347,7 @@
def bh_setarrayitem_gc_r(self, arraydescr, gcref, itemindex, newvalue):
ofs, size, _ = self.unpack_arraydescr(arraydescr)
- icp = self.gc_ll_descr.is_compressed_ptr(size)
+ icp = self.is_compressed_ptr(size)
self.gc_ll_descr.do_write_barrier(gcref, newvalue)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
@@ -408,7 +414,7 @@
@specialize.argtype(1)
def _base_do_getfield_r(self, struct, fielddescr):
ofs, size, _ = self.unpack_fielddescr(fielddescr)
- icp = self.gc_ll_descr.is_compressed_ptr(size)
+ icp = self.is_compressed_ptr(size)
# --- start of GC unsafe code (no GC operation!) ---
fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
if icp:
@@ -455,7 +461,7 @@
ofs, size, _ = self.unpack_fielddescr(fielddescr)
assert lltype.typeOf(struct) is not lltype.Signed, (
"can't handle write barriers for setfield_raw")
- icp = self.gc_ll_descr.is_compressed_ptr(size)
+ icp = self.is_compressed_ptr(size)
self.gc_ll_descr.do_write_barrier(struct, newvalue)
# --- start of GC unsafe code (no GC operation!) ---
fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
More information about the Pypy-commit
mailing list