[pypy-svn] r65873 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Mon Jun 22 23:41:26 CEST 2009


Author: arigo
Date: Mon Jun 22 23:41:21 2009
New Revision: 65873

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
Log:
Arrays in virtualizables, step 2.  Done, as far as I see :-)


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	Mon Jun 22 23:41:21 2009
@@ -1439,12 +1439,23 @@
         vinfo = self.staticdata.virtualizable_info
         if vinfo is not None:
             # xxx only write back the fields really modified
-            vbox = self.virtualizable_boxes[vinfo.num_static_extra_boxes]
+            vbox = self.virtualizable_boxes[-1]
             for i in range(vinfo.num_static_extra_boxes):
                 fieldbox = self.virtualizable_boxes[i]
                 self.execute_and_record(rop.SETFIELD_GC, [vbox, fieldbox],
                                         descr=vinfo.static_field_descrs[i])
-            # XXX use array_field_descrs too!
+            i = vinfo.num_static_extra_boxes
+            virtualizable = vbox.getptr(vinfo.VTYPEPTR)
+            for k in range(vinfo.num_arrays):
+                abox = self.execute_and_record(rop.GETFIELD_GC, [vbox],
+                                         descr=vinfo.array_field_descrs[k])
+                for j in range(vinfo.get_array_length(virtualizable, k)):
+                    itembox = self.virtualizable_boxes[i]
+                    i += 1
+                    self.execute_and_record(rop.SETARRAYITEM_GC,
+                                            [abox, ConstInt(j), itembox],
+                                            descr=vinfo.array_descrs[k])
+            assert i + 1 == len(self.virtualizable_boxes)
 
 class GenerateMergePoint(Exception):
     def __init__(self, args, target_loop):

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py	Mon Jun 22 23:41:21 2009
@@ -175,6 +175,34 @@
         self.check_loops(getfield_gc=0, setfield_gc=0,
                          getarrayitem_gc=0, setarrayitem_gc=0)
 
+    def test_synchronize_arrays_in_return(self):
+        myjitdriver = JitDriver(greens = [], reds = ['n', 'xy2'],
+                                virtualizables = ['xy2'])
+        ARRAY = lltype.GcArray(lltype.Signed)
+        def g(xy2, n):
+            while n > 0:
+                myjitdriver.can_enter_jit(xy2=xy2, n=n)
+                myjitdriver.jit_merge_point(xy2=xy2, n=n)
+                xy2.inst_l2[0] += xy2.inst_x
+                n -= 1
+        def f(n):
+            xy2 = self.setup2()
+            xy2.inst_x = 2
+            xy2.inst_l1 = lltype.malloc(ARRAY, 2)
+            xy2.inst_l1[0] = 1941309
+            xy2.inst_l1[1] = 2941309
+            xy2.inst_l2 = lltype.malloc(ARRAY, 1)
+            xy2.inst_l2[0] = 10000
+            m = 10
+            while m > 0:
+                g(xy2, n)
+                m -= 1
+            return xy2.inst_l2[0]
+        assert f(18) == 10360
+        res = self.meta_interp(f, [18])
+        assert res == 10360
+        self.check_loops(getfield_gc=0, setfield_gc=0)
+
 
 class ImplicitVirtualizableTests:
 

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py	Mon Jun 22 23:41:21 2009
@@ -495,6 +495,7 @@
             ARRAYITEMTYPES.append(ARRAYPTR.TO.OF)
         #
         self.num_static_extra_boxes = len(static_fields)
+        self.num_arrays = len(array_fields)
         self.static_field_to_extra_box = dict(
             [(name, i) for (i, name) in enumerate(static_fields)])
         self.array_field_counter = dict(
@@ -506,9 +507,10 @@
         cpu = warmrunnerdesc.cpu
         self.static_field_descrs = [cpu.fielddescrof(VTYPEPTR.TO, name)
                                     for name in static_fields]
-        self.array_field_descrs = [
-            cpu.arraydescrof(getattr(VTYPEPTR.TO, name).TO)
-            for name in array_fields]
+        self.array_field_descrs = [cpu.fielddescrof(VTYPEPTR.TO, name)
+                                   for name in array_fields]
+        self.array_descrs = [cpu.arraydescrof(getattr(VTYPEPTR.TO, name).TO)
+                             for name in array_fields]
         #
         def read_boxes(cpu, virtualizable):
             boxes = []
@@ -559,8 +561,16 @@
                 lst = getattr(virtualizable, fieldname)
                 index += len(lst)
                 j = j + 1
-            else:
-                assert False, "invalid arrayindex"
+            assert False, "invalid arrayindex"
+        #
+        def get_array_length(virtualizable, arrayindex):
+            j = 0
+            for _, fieldname in unroll_array_fields:
+                if arrayindex == j:
+                    lst = getattr(virtualizable, fieldname)
+                    return len(lst)
+                j = j + 1
+            assert False, "invalid arrayindex"
         #
         unroll_static_fields = unrolling_iterable(zip(FIELDTYPES,
                                                       static_fields))
@@ -570,6 +580,7 @@
         self.write_boxes = write_boxes
         self.check_boxes = check_boxes
         self.get_index_in_array = get_index_in_array
+        self.get_array_length = get_array_length
 
     def _freeze_(self):
         return True



More information about the Pypy-commit mailing list