[pypy-svn] pypy 32ptr-on-64bit: Finish call descrs.

arigo commits-noreply at bitbucket.org
Sat Apr 16 22:11:56 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: 32ptr-on-64bit
Changeset: r43405:ac4ae9746e4e
Date: 2011-04-16 10:13 -0700
http://bitbucket.org/pypy/pypy/changeset/ac4ae9746e4e/

Log:	Finish call descrs.

diff --git a/pypy/jit/backend/llsupport/test/test_descr.py b/pypy/jit/backend/llsupport/test/test_descr.py
--- a/pypy/jit/backend/llsupport/test/test_descr.py
+++ b/pypy/jit/backend/llsupport/test/test_descr.py
@@ -346,6 +346,23 @@
             descr1 = get_call_descr(c2, [], RESTYPE)
             assert descr1.is_result_signed() == signed
 
+def test_call_descr_hiddengcref32():
+    if sys.maxint == 2147483647:
+        py.test.skip("HiddenGcRef32: for 64-bit only")
+    for tsc in [False, True]:
+        c0 = GcCache(tsc)
+        descr = get_call_descr(c0, [llmemory.HiddenGcRef32], lltype.Void)
+        assert descr.get_arg_types() == 'H'
+        #
+        descr = get_call_descr(c0, [], llmemory.HiddenGcRef32)
+        assert descr.get_return_type() == 'H'
+        sz = descr.get_result_size(tsc)
+        if not tsc:
+            assert sz == 4
+        else:
+            assert isinstance(sz, Symbolic)
+            assert sz.TYPE == llmemory.HiddenGcRef32
+
 
 def test_repr_of_descr():
     c0 = GcCache(False)

diff --git a/pypy/jit/backend/llsupport/descr.py b/pypy/jit/backend/llsupport/descr.py
--- a/pypy/jit/backend/llsupport/descr.py
+++ b/pypy/jit/backend/llsupport/descr.py
@@ -332,6 +332,8 @@
             result = 'rffi.cast(lltype.SignedLongLong, res)'
         elif self.get_return_type() == history.VOID:
             result = 'None'
+        elif self.get_return_type() == 'H':
+            result = 'llop.show_from_ptr32(llmemory.GCREF, res)'
         else:
             assert 0
         source = py.code.Source("""
@@ -409,6 +411,12 @@
     def get_result_size(self, translate_support_code):
         return symbolic.get_size_of_ptr(translate_support_code)
 
+class GcPtrHidden32CallDescr(BaseCallDescr):
+    _clsname = 'GcPtrHidden32CallDescr'
+    _return_type = 'H'
+    def get_result_size(self, translate_support_code):
+        return symbolic.get_size(llmemory.HiddenGcRef32,translate_support_code)
+
 class FloatCallDescr(BaseCallDescr):
     _clsname = 'FloatCallDescr'
     _return_type = history.FLOAT
@@ -437,7 +445,8 @@
     return getDescrClass(RESULT, BaseIntCallDescr, GcPtrCallDescr,
                          NonGcPtrCallDescr, 'Call', 'get_result_size',
                          Ellipsis,  # <= floatattrname should not be used here
-                         '_is_result_signed')
+                         '_is_result_signed',
+                         GcPtrHidden32CallDescr)
 
 def get_call_descr(gccache, ARGS, RESULT, extrainfo=None):
     arg_classes = []

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
@@ -44,7 +44,8 @@
                 if (isinstance(op.getdescr(), GcPtrHidden32FieldDescr) or
                     isinstance(op.getdescr(), GcPtrHidden32ArrayDescr) or
                     (isinstance(op.getdescr(), BaseCallDescr) and
-                     'H' in op.getdescr().get_arg_types())):
+                     ('H' in op.getdescr().get_arg_types() or
+                      op.getdescr().get_return_type() == 'H'))):
                     from pypy.jit.metainterp.test.support import SkipThisRun
                     raise SkipThisRun("non-translated test with compressptr")
     def can_inline_malloc(self, descr):
@@ -885,6 +886,11 @@
                                                    [v1], v2))
                         args[i] = v2
                         op = op.copy_and_change(op.getopnum(), args=args)
+                if descr.get_return_type() == 'H':
+                    v1 = BoxInt()
+                    v2 = op.result
+                    newops.append(op.copy_and_change(op.getopnum(), result=v1))
+                    op = ResOperation(rop.SHOW_FROM_PTR32, [v1], v2)
             # ----------
             newops.append(op)
         del operations[:]


More information about the Pypy-commit mailing list