Author: Armin Rigo <[email protected]>
Branch: partial-virtualizable
Changeset: r44328:2dc970a3cd06
Date: 2011-05-20 13:47 +0200
http://bitbucket.org/pypy/pypy/changeset/2dc970a3cd06/
Log: Test and fix for the case of a virtualizable array.
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -687,18 +687,34 @@
# must cancel the optimization done by optimize_PARTIAL_VIRTUALIZABLE
# in optimizeopt/virtualize.py
setoperations = []
+ src_index = nb_red_args
vinfo = jitdriver_sd.virtualizable_info
if vinfo is not None:
vablebox = inputargs[jitdriver_sd.index_of_virtualizable]
- src_index = nb_red_args
for descr in vinfo.static_field_descrs:
valuebox = inputargs[src_index]
src_index += 1
setoperations.append(
ResOperation(rop.SETFIELD_GC, [vablebox, valuebox], None,
descr=descr))
- assert src_index == len(inputargs)
- # ... arrays ...
+ for arrayindex in range(len(vinfo.array_field_descrs)):
+ # xxx fish the virtualizable from the box
+ length = vinfo.get_array_length(vablebox.getref_base(), arrayindex)
+ assert src_index + length <= len(inputargs)
+ arraybox = BoxPtr()
+ arrayfielddescr = vinfo.array_field_descrs[arrayindex]
+ arraydescr = vinfo.array_descrs[arrayindex]
+ setoperations.append(
+ ResOperation(rop.GETFIELD_GC, [vablebox], arraybox,
+ descr=arrayfielddescr))
+ for i in range(length):
+ valuebox = inputargs[src_index]
+ src_index += 1
+ setoperations.append(
+ ResOperation(rop.SETARRAYITEM_GC,
+ [arraybox, history.ConstInt(i), valuebox],
+ None, descr=arraydescr))
+ assert src_index == len(inputargs)
#
jd = jitdriver_sd
faildescr = propagate_exception_descr
diff --git a/pypy/jit/metainterp/test/test_recursive.py
b/pypy/jit/metainterp/test/test_recursive.py
--- a/pypy/jit/metainterp/test/test_recursive.py
+++ b/pypy/jit/metainterp/test/test_recursive.py
@@ -749,6 +749,32 @@
self.meta_interp(main, [2], inline=True)
+ def test_compile_tmp_callback_and_using_it_with_virtualizable_array(self):
+ # same as the previous test, but with a virtualizable with an array
+ class Frame(object):
+ _virtualizable2_ = ['lst[*]']
+ def __init__(self, lst):
+ self = hint(self, fresh_virtualizable=True,
+ access_directly=True)
+ self.lst = lst
+
+ driver = JitDriver(greens = ['codeno'], reds = ['i', 'frame'],
+ virtualizables = ['frame'])
+
+ def main(codeno):
+ frame = Frame([codeno+100])
+ i = 1
+ while i < 7:
+ driver.jit_merge_point(codeno=codeno, i=i, frame=frame)
+ assert frame.lst[0] == codeno+100
+ if codeno == 1:
+ return
+ if i >= 3:
+ main(1)
+ i += 1
+
+ self.meta_interp(main, [2], inline=True)
+
def test_directly_call_assembler_return(self):
driver = JitDriver(greens = ['codeno'], reds = ['i', 'k'],
get_printable_location = lambda codeno :
str(codeno))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit