[pypy-commit] pypy op_malloc_gc: Attach a descr to call_malloc_gc(). Remove the function pointer

arigo noreply at buildbot.pypy.org
Sun Dec 18 18:50:38 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: op_malloc_gc
Changeset: r50662:c7acd213b15b
Date: 2011-12-18 16:18 +0100
http://bitbucket.org/pypy/pypy/changeset/c7acd213b15b/

Log:	Attach a descr to call_malloc_gc(). Remove the function pointer in
	call_malloc_nursery(), because there can be only one.

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
@@ -17,8 +17,7 @@
 from pypy.jit.backend.llsupport.descr import SizeDescr, ArrayDescr
 from pypy.jit.backend.llsupport.descr import GcCache, get_field_descr
 from pypy.jit.backend.llsupport.descr import get_array_descr
-##from pypy.jit.backend.llsupport.descr import GcPtrFieldDescr
-##from pypy.jit.backend.llsupport.descr import get_call_descr
+from pypy.jit.backend.llsupport.descr import get_call_descr
 from pypy.jit.backend.llsupport.rewrite import GcRewriterAssembler
 from pypy.rpython.memory.gctransform import asmgcroot
 
@@ -49,9 +48,11 @@
         ll_func = llhelper(FUNCPTR, func)
         c_ll_func = ConstInt(
             heaptracker.adr2int(llmemory.cast_ptr_to_adr(ll_func)))
+        descr = get_call_descr(self, ARGS, RESULT)
         setattr(self, '%s'      % funcname, func)
         setattr(self, '%s_fn'   % funcname, ll_func)
         setattr(self, 'c_%s_fn' % funcname, c_ll_func)
+        setattr(self, '%s_descr' % funcname, descr)
         self._generated_functions.append(funcname)
 
     def _freeze_(self):
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
@@ -138,10 +138,10 @@
         self._op_malloc_nursery = None
         self.recent_mallocs.clear()
 
-    def _gen_call_malloc_gc(self, args, v_result):
+    def _gen_call_malloc_gc(self, args, v_result, descr):
         """Generate a CALL_MALLOC_GC with the given args."""
         self.emitting_an_operation_that_can_collect()
-        op = ResOperation(rop.CALL_MALLOC_GC, args, v_result)
+        op = ResOperation(rop.CALL_MALLOC_GC, args, v_result, descr)
         self.newops.append(op)
         # mark 'v_result' as freshly malloced
         self.recent_mallocs[v_result] = None
@@ -151,7 +151,8 @@
         Note that with the framework GC, this should be called very rarely.
         """
         self._gen_call_malloc_gc([self.gc_ll_descr.c_malloc_fixedsize_fn,
-                                  ConstInt(size)], v_result)
+                                  ConstInt(size)], v_result,
+                                 self.gc_ll_descr.malloc_fixedsize_descr)
 
     def gen_boehm_malloc_array(self, arraydescr, v_num_elem, v_result):
         """Generate a CALL_MALLOC_GC(malloc_array_fn, ...) for Boehm."""
@@ -160,7 +161,8 @@
                                   v_num_elem,
                                   ConstInt(arraydescr.itemsize),
                                   ConstInt(arraydescr.lendescr.offset)],
-                                 v_result)
+                                 v_result,
+                                 self.gc_ll_descr.malloc_array_descr)
 
     def gen_malloc_array(self, arraydescr, v_num_elem, v_result):
         """Generate a CALL_MALLOC_GC(malloc_array_fn, ...) going either
@@ -174,22 +176,26 @@
                     ConstInt(arraydescr.itemsize),
                     ConstInt(arraydescr.tid),
                     v_num_elem]
+            calldescr = self.gc_ll_descr.malloc_array_descr
         else:
             arraydescr_gcref = xxx
             args = [self.gc_ll_descr.c_malloc_array_nonstandard_fn,
                     ConstPtr(arraydescr_gcref),
                     v_num_elem]
-        self._gen_call_malloc_gc(args, v_result)
+            calldescr = self.gc_ll_descr.malloc_array_nonstandard_descr
+        self._gen_call_malloc_gc(args, v_result, calldescr)
 
     def gen_malloc_str(self, v_num_elem, v_result):
         """Generate a CALL_MALLOC_GC(malloc_str_fn, ...)."""
         self._gen_call_malloc_gc([self.gc_ll_descr.c_malloc_str_fn,
-                                  v_num_elem], v_result)
+                                  v_num_elem], v_result,
+                                 self.gc_ll_descr.malloc_str_descr)
 
     def gen_malloc_unicode(self, v_num_elem, v_result):
         """Generate a CALL_MALLOC_GC(malloc_unicode_fn, ...)."""
         self._gen_call_malloc_gc([self.gc_ll_descr.c_malloc_unicode_fn,
-                                  v_num_elem], v_result)
+                                  v_num_elem], v_result,
+                                 self.gc_ll_descr.malloc_unicode_descr)
 
     def gen_malloc_nursery(self, size, v_result):
         """Try to generate or update a CALL_MALLOC_NURSERY.
@@ -203,11 +209,11 @@
         #
         if self._op_malloc_nursery is not None:
             # already a MALLOC_NURSERY: increment its total size
-            total_size = self._op_malloc_nursery.getarg(1).getint()
+            total_size = self._op_malloc_nursery.getarg(0).getint()
             total_size += size
             if self.gc_ll_descr.can_use_nursery_malloc(total_size):
                 # if the total size is still reasonable, merge it
-                self._op_malloc_nursery.setarg(1, ConstInt(total_size))
+                self._op_malloc_nursery.setarg(0, ConstInt(total_size))
                 op = ResOperation(rop.INT_ADD,
                                   [self._v_last_malloced_nursery,
                                    ConstInt(self._previous_size)],
@@ -216,8 +222,7 @@
             # if we failed to merge with a previous MALLOC_NURSERY, emit one
             self.emitting_an_operation_that_can_collect()
             op = ResOperation(rop.CALL_MALLOC_NURSERY,
-                              [self.gc_ll_descr.c_malloc_nursery_fn,
-                               ConstInt(size)],
+                              [ConstInt(size)],
                               v_result)
             self._op_malloc_nursery = op
         #
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
@@ -72,6 +72,8 @@
         #
         for funcname in self.gc_ll_descr._generated_functions:
             namespace[funcname] = getattr(self.gc_ll_descr, '%s_fn' % funcname)
+            namespace[funcname + '_descr'] = getattr(self.gc_ll_descr,
+                                                     '%s_descr' % funcname)
         #
         ops = parse(frm_operations, namespace=namespace)
         expected = parse(to_operations % Evaluator(namespace),
@@ -97,7 +99,8 @@
             jump()
         """, """
             [p1]
-            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), %(sdescr.size)d)
+            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), %(sdescr.size)d,\
+                                descr=malloc_fixedsize_descr)
             jump()
         """)
 
@@ -109,8 +112,10 @@
             jump()
         """, """
             []
-            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), %(sdescr.size)d)
-            p1 = call_malloc_gc(ConstClass(malloc_fixedsize), %(sdescr.size)d)
+            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), %(sdescr.size)d,\
+                                descr=malloc_fixedsize_descr)
+            p1 = call_malloc_gc(ConstClass(malloc_fixedsize), %(sdescr.size)d,\
+                                descr=malloc_fixedsize_descr)
             jump()
         """)
 
@@ -122,7 +127,8 @@
         """, """
             []
             p0 = call_malloc_gc(ConstClass(malloc_fixedsize), \
-                                %(adescr.basesize + 10 * adescr.itemsize)d)
+                                %(adescr.basesize + 10 * adescr.itemsize)d, \
+                                descr=malloc_fixedsize_descr)
             setfield_gc(p0, 10, descr=alendescr)
             jump()
         """)
@@ -134,11 +140,12 @@
             jump()
         """, """
             [i1]
-            p0 = call_malloc_gc(ConstClass(malloc_array), \
-                                %(adescr.basesize)d,      \
-                                i1,                       \
-                                %(adescr.itemsize)d,      \
-                                %(adescr.lendescr.offset)d)
+            p0 = call_malloc_gc(ConstClass(malloc_array),   \
+                                %(adescr.basesize)d,        \
+                                i1,                         \
+                                %(adescr.itemsize)d,        \
+                                %(adescr.lendescr.offset)d, \
+                                descr=malloc_array_descr)
             jump()
         """)
 
@@ -149,7 +156,8 @@
             jump()
         """, """
             [p1]
-            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), 102)
+            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), 102, \
+                                descr=malloc_fixedsize_descr)
             setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
             jump()
         """)
@@ -165,7 +173,8 @@
                                 %(strdescr.basesize)d,    \
                                 i1,                       \
                                 %(strdescr.itemsize)d,    \
-                                %(strlendescr.offset)d)
+                                %(strlendescr.offset)d,   \
+                                descr=malloc_array_descr)
             jump()
         """)
 
@@ -176,9 +185,10 @@
             jump()
         """, """
             [i1]
-            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), \
-                                %(unicodedescr.basesize +     \
-                                  10 * unicodedescr.itemsize)d)
+            p0 = call_malloc_gc(ConstClass(malloc_fixedsize),   \
+                                %(unicodedescr.basesize +       \
+                                  10 * unicodedescr.itemsize)d, \
+                                descr=malloc_fixedsize_descr)
             setfield_gc(p0, 10, descr=unicodelendescr)
             jump()
         """)
@@ -212,8 +222,7 @@
             jump()
         """, """
             [p1]
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
-                                     %(sdescr.size)d)
+            p0 = call_malloc_nursery(%(sdescr.size)d)
             setfield_gc(p0, 1234, descr=tiddescr)
             jump()
         """)
@@ -227,7 +236,7 @@
             jump()
         """, """
             []
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
+            p0 = call_malloc_nursery(   \
                                %(sdescr.size + tdescr.size + sdescr.size)d)
             setfield_gc(p0, 1234, descr=tiddescr)
             p1 = int_add(p0, %(sdescr.size)d)
@@ -244,7 +253,7 @@
             jump()
         """, """
             []
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
+            p0 = call_malloc_nursery(    \
                                 %(adescr.basesize + 10 * adescr.itemsize)d)
             setfield_gc(p0, 4321, descr=tiddescr)
             setfield_gc(p0, 10, descr=alendescr)
@@ -259,7 +268,7 @@
             jump()
         """, """
             []
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery),       \
+            p0 = call_malloc_nursery(                                  \
                                 %(sdescr.size +                        \
                                   adescr.basesize + 10 * adescr.itemsize)d)
             setfield_gc(p0, 1234, descr=tiddescr)
@@ -276,8 +285,7 @@
             jump()
         """, """
             []
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery),   \
-                                     %(bdescr.basesize + 8)d)
+            p0 = call_malloc_nursery(%(bdescr.basesize + 8)d)
             setfield_gc(p0, 8765, descr=tiddescr)
             setfield_gc(p0, 6, descr=blendescr)
             jump()
@@ -293,8 +301,7 @@
             jump()
         """, """
             []
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
-                                     %(4 * (bdescr.basesize + 8))d)
+            p0 = call_malloc_nursery(%(4 * (bdescr.basesize + 8))d)
             setfield_gc(p0, 8765, descr=tiddescr)
             setfield_gc(p0, 5, descr=blendescr)
             p1 = int_add(p0, %(bdescr.basesize + 8)d)
@@ -317,7 +324,7 @@
             jump()
         """, """
             []
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), %(4*WORD)d)
+            p0 = call_malloc_nursery(%(4*WORD)d)
             setfield_gc(p0, 9000, descr=tiddescr)
             p1 = int_add(p0, %(2*WORD)d)
             setfield_gc(p1, 9000, descr=tiddescr)
@@ -332,7 +339,8 @@
         """, """
             [i0]
             p0 = call_malloc_gc(ConstClass(malloc_array), 1,  \
-                                %(bdescr.tid)d, i0)
+                                %(bdescr.tid)d, i0,           \
+                                descr=malloc_array_descr)
             jump(i0)
         """)
 
@@ -345,7 +353,8 @@
         """, """
             []
             p0 = call_malloc_gc(ConstClass(malloc_fixedsize), \
-                                %(bdescr.basesize + 100)d)
+                                %(bdescr.basesize + 100)d,    \
+                                descr=malloc_fixedsize_descr)
             setfield_gc(p0, 8765, descr=tiddescr)
             setfield_gc(p0, 100, descr=blendescr)
             jump()
@@ -361,14 +370,14 @@
             jump()
         """, """
             []
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
+            p0 = call_malloc_nursery(    \
                               %(2 * (bdescr.basesize + 104))d)
             setfield_gc(p0, 8765, descr=tiddescr)
             setfield_gc(p0, 101, descr=blendescr)
             p1 = int_add(p0, %(bdescr.basesize + 104)d)
             setfield_gc(p1, 8765, descr=tiddescr)
             setfield_gc(p1, 102, descr=blendescr)
-            p2 = call_malloc_nursery(ConstClass(malloc_nursery), \
+            p2 = call_malloc_nursery(    \
                               %(bdescr.basesize + 104)d)
             setfield_gc(p2, 8765, descr=tiddescr)
             setfield_gc(p2, 103, descr=blendescr)
@@ -382,8 +391,7 @@
             jump()
         """, """
             [p1]
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
-                                     104)      # rounded up
+            p0 = call_malloc_nursery(104)      # rounded up
             setfield_gc(p0, 9315, descr=tiddescr)
             setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
             jump()
@@ -397,7 +405,8 @@
             jump()
         """, """
             [p1]
-            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), 102)
+            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), 102, \
+                                descr=malloc_fixedsize_descr)
             setfield_gc(p0, 9315, descr=tiddescr)
             setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
             jump()
@@ -413,7 +422,7 @@
             jump()
         """, """
             [i2]
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery),     \
+            p0 = call_malloc_nursery(                                \
                       %(strdescr.basesize + 16 * strdescr.itemsize + \
                         unicodedescr.basesize + 10 * unicodedescr.itemsize)d)
             setfield_gc(p0, %(strdescr.tid)d, descr=tiddescr)
@@ -421,8 +430,10 @@
             p1 = int_add(p0, %(strdescr.basesize + 16 * strdescr.itemsize)d)
             setfield_gc(p1, %(unicodedescr.tid)d, descr=tiddescr)
             setfield_gc(p1, 10, descr=unicodelendescr)
-            p2 = call_malloc_gc(ConstClass(malloc_unicode), i2)
-            p3 = call_malloc_gc(ConstClass(malloc_str), i2)
+            p2 = call_malloc_gc(ConstClass(malloc_unicode), i2, \
+                                descr=malloc_unicode_descr)
+            p3 = call_malloc_gc(ConstClass(malloc_str), i2, \
+                                descr=malloc_str_descr)
             jump()
         """)
 
@@ -461,7 +472,7 @@
             jump()
         """, """
             [i2, p3]
-            p1 = call_malloc_nursery(ConstClass(malloc_nursery), \
+            p1 = call_malloc_nursery(    \
                                 %(cdescr.basesize + 129 * cdescr.itemsize)d)
             setfield_gc(p1, 8111, descr=tiddescr)
             setfield_gc(p1, 129, descr=clendescr)
@@ -481,7 +492,7 @@
             jump()
         """, """
             [i2, p3]
-            p1 = call_malloc_nursery(ConstClass(malloc_nursery), \
+            p1 = call_malloc_nursery(    \
                                 %(cdescr.basesize + 130 * cdescr.itemsize)d)
             setfield_gc(p1, 8111, descr=tiddescr)
             setfield_gc(p1, 130, descr=clendescr)
@@ -512,7 +523,7 @@
             jump()
         """, """
             [i2, p3]
-            p1 = call_malloc_nursery(ConstClass(malloc_nursery), \
+            p1 = call_malloc_nursery(    \
                                 %(cdescr.basesize + 5 * cdescr.itemsize)d)
             setfield_gc(p1, 8111, descr=tiddescr)
             setfield_gc(p1, 5, descr=clendescr)
@@ -542,8 +553,7 @@
             jump()
         """, """
             [p1]
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
-                                     %(tdescr.size)d)
+            p0 = call_malloc_nursery(%(tdescr.size)d)
             setfield_gc(p0, 5678, descr=tiddescr)
             setfield_gc(p0, p1, descr=tzdescr)
             jump()
@@ -558,8 +568,7 @@
             jump()
         """, """
             []
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
-                                     %(tdescr.size + sdescr.size)d)
+            p0 = call_malloc_nursery(%(tdescr.size + sdescr.size)d)
             setfield_gc(p0, 5678, descr=tiddescr)
             p1 = int_add(p0, %(tdescr.size)d)
             setfield_gc(p1, 1234, descr=tiddescr)
@@ -576,7 +585,7 @@
             jump()
         """, """
             [p1, i2]
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
+            p0 = call_malloc_nursery(    \
                                 %(cdescr.basesize + 5 * cdescr.itemsize)d)
             setfield_gc(p0, 8111, descr=tiddescr)
             setfield_gc(p0, 5, descr=clendescr)
@@ -593,10 +602,10 @@
             jump()
         """, """
             [i0]
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
-                                     %(tdescr.size)d)
+            p0 = call_malloc_nursery(%(tdescr.size)d)
             setfield_gc(p0, 5678, descr=tiddescr)
-            p1 = call_malloc_gc(ConstClass(malloc_str), i0)
+            p1 = call_malloc_gc(ConstClass(malloc_str), i0, \
+                                descr=malloc_str_descr)
             cond_call_gc_wb(p0, p1, descr=wbdescr)
             setfield_raw(p0, p1, descr=tzdescr)
             jump()
@@ -611,8 +620,7 @@
             jump()
         """, """
             [p1]
-            p0 = call_malloc_nursery(ConstClass(malloc_nursery), \
-                                     %(tdescr.size)d)
+            p0 = call_malloc_nursery(%(tdescr.size)d)
             setfield_gc(p0, 5678, descr=tiddescr)
             label(p0, p1)
             cond_call_gc_wb(p0, p1, descr=wbdescr)
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -509,7 +509,7 @@
     #'OOSEND_PURE',                # ootype operation
     'CALL_PURE/*d',             # removed before it's passed to the backend
     'CALL_MALLOC_GC/*d',      # like CALL, but NULL => propagate MemoryError
-    'CALL_MALLOC_NURSERY/2d', # nursery malloc, const number of bytes, zeroed
+    'CALL_MALLOC_NURSERY/1',  # nursery malloc, const number of bytes, zeroed
     '_CALL_LAST',
     '_CANRAISE_LAST', # ----- end of can_raise operations -----
 


More information about the pypy-commit mailing list