[pypy-commit] pypy op_malloc_gc: - fix call_stub_r

arigo noreply at buildbot.pypy.org
Sun Dec 18 20:43:19 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: op_malloc_gc
Changeset: r50680:8f9b2eb1ff42
Date: 2011-12-18 20:22 +0100
http://bitbucket.org/pypy/pypy/changeset/8f9b2eb1ff42/

Log:	- fix call_stub_r
	- test and fix for malloc_array_nonstandard

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
@@ -368,7 +368,8 @@
             result = 'rffi.cast(lltype.Signed, res)'
             category = 'i'
         elif result_type == history.REF:
-            result = 'lltype.cast_opaque_ptr(llmemory.GCREF, res)'
+            assert RESULT == llmemory.GCREF   # should be ensured by the caller
+            result = 'res'
             category = 'r'
         elif result_type == history.FLOAT:
             result = 'longlong.getfloatstorage(res)'
@@ -437,7 +438,11 @@
         result_size = symbolic.get_size(RESULT, gccache.translate_support_code)
         result_signed = get_type_flag(RESULT) == FLAG_SIGNED
         if isinstance(RESULT, lltype.Ptr):
-            RESULT_ERASED = llmemory.Address  # avoid too many CallDescrs
+            # avoid too many CallDescrs
+            if result_type == 'r':
+                RESULT_ERASED = llmemory.GCREF
+            else:
+                RESULT_ERASED = llmemory.Address
     key = (arg_classes, result_type, result_signed, RESULT_ERASED, extrainfo)
     cache = gccache._cache_call
     try:
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
@@ -719,19 +719,19 @@
         self.generate_function('malloc_array', malloc_array,
                                [lltype.Signed] * 3)
 
-        def malloc_array_nonstandard(arraydescr_gcref, num_elem):
+        def malloc_array_nonstandard(basesize, itemsize, lengthofs, tid,
+                                     num_elem):
             """For the rare case of non-standard arrays, i.e. arrays where
             self.standard_array_{basesize,length_ofs} is wrong.  It can
             occur e.g. with arrays of floats on Win32."""
-            arraydescr = xxxxxxx
             type_id = llop.extract_ushort(llgroup.HALFWORD, tid)
             check_typeid(type_id)
             return llop1.do_malloc_varsize_clear(
                 llmemory.GCREF,
-                type_id, num_elem, xxx, itemsize, xxx)
+                type_id, num_elem, basesize, itemsize, lengthofs)
         self.generate_function('malloc_array_nonstandard',
                                malloc_array_nonstandard,
-                               [llmemory.GCREF, lltype.Signed])
+                               [lltype.Signed] * 5)
 
         def malloc_str(length):
             return llop1.do_malloc_varsize_clear(
diff --git a/pypy/jit/backend/llsupport/rewrite.py b/pypy/jit/backend/llsupport/rewrite.py
--- a/pypy/jit/backend/llsupport/rewrite.py
+++ b/pypy/jit/backend/llsupport/rewrite.py
@@ -178,9 +178,12 @@
                     v_num_elem]
             calldescr = self.gc_ll_descr.malloc_array_descr
         else:
-            arraydescr_gcref = xxx
+            # rare case, so don't care too much about the number of arguments
             args = [self.gc_ll_descr.c_malloc_array_nonstandard_fn,
-                    ConstPtr(arraydescr_gcref),
+                    ConstInt(arraydescr.basesize),
+                    ConstInt(arraydescr.itemsize),
+                    ConstInt(arraydescr.lendescr.offset),
+                    ConstInt(arraydescr.tid),
                     v_num_elem]
             calldescr = self.gc_ll_descr.malloc_array_nonstandard_descr
         self._gen_call_malloc_gc(args, v_result, calldescr)
diff --git a/pypy/jit/backend/llsupport/test/test_rewrite.py b/pypy/jit/backend/llsupport/test/test_rewrite.py
--- a/pypy/jit/backend/llsupport/test/test_rewrite.py
+++ b/pypy/jit/backend/llsupport/test/test_rewrite.py
@@ -14,7 +14,7 @@
 
 
 class RewriteTests(object):
-    def check_rewrite(self, frm_operations, to_operations):
+    def check_rewrite(self, frm_operations, to_operations, **namespace):
         S = lltype.GcStruct('S', ('x', lltype.Signed),
                                  ('y', lltype.Signed))
         sdescr = get_size_descr(self.gc_ll_descr, S)
@@ -42,13 +42,6 @@
         cdescr.tid = 8111
         clendescr = cdescr.lendescr
         #
-        INTERIOR = lltype.GcArray(('z', lltype.Ptr(S)))
-        interiordescr = get_array_descr(self.gc_ll_descr, INTERIOR)
-        interiordescr.tid = 1291
-        interiorlendescr = interiordescr.lendescr
-        interiorzdescr = get_interiorfield_descr(self.gc_ll_descr,
-                                                 INTERIOR, 'z')
-        #
         E = lltype.GcStruct('Empty')
         edescr = get_size_descr(self.gc_ll_descr, E)
         edescr.tid = 9000
@@ -68,7 +61,7 @@
         strlendescr     = strdescr.lendescr
         unicodelendescr = unicodedescr.lendescr
         #
-        namespace = locals().copy()
+        namespace.update(locals())
         #
         for funcname in self.gc_ll_descr._generated_functions:
             namespace[funcname] = getattr(self.gc_ll_descr, '%s_fn' % funcname)
@@ -344,6 +337,29 @@
             jump(i0)
         """)
 
+    def test_rewrite_assembler_nonstandard_array(self):
+        # a non-standard array is a bit hard to get; e.g. GcArray(Float)
+        # is like that on Win32, but not on Linux.  Build one manually...
+        NONSTD = lltype.GcArray(lltype.Float)
+        nonstd_descr = get_array_descr(self.gc_ll_descr, NONSTD)
+        nonstd_descr.tid = 6464
+        nonstd_descr.basesize = 64      # <= hacked
+        nonstd_descr.itemsize = 8
+        nonstd_descr_gcref = 123
+        self.check_rewrite("""
+            [i0]
+            p0 = new_array(i0, descr=nonstd_descr)
+            jump(i0)
+        """, """
+            [i0]
+            p0 = call_malloc_gc(ConstClass(malloc_array_nonstandard), \
+                                64, 8,                                \
+                                %(nonstd_descr.lendescr.offset)d,     \
+                                6464, i0,                             \
+                                descr=malloc_array_nonstandard_descr)
+            jump(i0)
+        """, nonstd_descr=nonstd_descr)
+
     def test_rewrite_assembler_maximal_size_1(self):
         self.gc_ll_descr.max_size_of_young_obj = 100
         self.check_rewrite("""
@@ -534,6 +550,13 @@
         """)
 
     def test_write_barrier_before_setinteriorfield_gc(self):
+        S1 = lltype.GcStruct('S1')
+        INTERIOR = lltype.GcArray(('z', lltype.Ptr(S1)))
+        interiordescr = get_array_descr(self.gc_ll_descr, INTERIOR)
+        interiordescr.tid = 1291
+        interiorlendescr = interiordescr.lendescr
+        interiorzdescr = get_interiorfield_descr(self.gc_ll_descr,
+                                                 INTERIOR, 'z')
         self.check_rewrite("""
             [p1, p2]
             setinteriorfield_gc(p1, 0, p2, descr=interiorzdescr)
@@ -543,7 +566,7 @@
             cond_call_gc_wb(p1, p2, descr=wbdescr)
             setinteriorfield_raw(p1, 0, p2, descr=interiorzdescr)
             jump(p1, p2)
-        """)
+        """, interiorzdescr=interiorzdescr)
 
     def test_initialization_store(self):
         self.check_rewrite("""


More information about the pypy-commit mailing list