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

Reply via email to