[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