[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