[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