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

arigo at codespeak.net arigo at codespeak.net
Tue Jun 23 21:41:10 CEST 2009


Author: arigo
Date: Tue Jun 23 21:41:07 2009
New Revision: 65894

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_virtualizable.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/typesystem.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
Log:
ootype-friendlify the code about virtualizables.
At least the lltype part is still RPython.


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	Tue Jun 23 21:41:07 2009
@@ -873,7 +873,7 @@
         vinfo = self.codewriter.metainterp_sd.virtualizable_info
         if vinfo is None:
             return False
-        if op.args[0].concretetype != vinfo.VTYPEPTR:
+        if not vinfo.is_vtypeptr(op.args[0].concretetype):
             return False
         if op.args[1].value in vinfo.static_field_to_extra_box:
             return True

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	Tue Jun 23 21:41:07 2009
@@ -468,7 +468,7 @@
         indexbox = self.implement_guard_value(pc, indexbox)
         vinfo = self.metainterp.staticdata.virtualizable_info
         virtualizable_box = self.metainterp.virtualizable_boxes[-1]
-        virtualizable = virtualizable_box.getptr(vinfo.VTYPEPTR)
+        virtualizable = vinfo.unwrap_virtualizable_box(virtualizable_box)
         index = indexbox.getint()
         if index < 0:
             index += vinfo.get_array_length(virtualizable, arrayindex)
@@ -491,7 +491,7 @@
     def opimpl_arraylen_vable(self, arrayindex):
         vinfo = self.metainterp.staticdata.virtualizable_info
         virtualizable_box = self.metainterp.virtualizable_boxes[-1]
-        virtualizable = virtualizable_box.getptr(vinfo.VTYPEPTR)
+        virtualizable = vinfo.unwrap_virtualizable_box(virtualizable_box)
         result = vinfo.get_array_length(virtualizable, arrayindex)
         self.make_result_box(ConstInt(result))
 
@@ -1391,7 +1391,7 @@
         vinfo = self.staticdata.virtualizable_info
         if vinfo is not None:
             virtualizable_box = original_boxes[vinfo.index_of_virtualizable]
-            virtualizable = virtualizable_box.getptr(vinfo.VTYPEPTR)
+            virtualizable = vinfo.unwrap_virtualizable_box(virtualizable_box)
             # The field 'virtualizable_boxes' is not even present
             # if 'virtualizable_info' is None.  Check for that first.
             self.virtualizable_boxes = vinfo.read_boxes(self.cpu,
@@ -1436,13 +1436,13 @@
         if not we_are_translated():
             vinfo = self.staticdata.virtualizable_info
             virtualizable_box = self.virtualizable_boxes[-1]
-            virtualizable = virtualizable_box.getptr(vinfo.VTYPEPTR)
+            virtualizable = vinfo.unwrap_virtualizable_box(virtualizable_box)
             vinfo.check_boxes(virtualizable, self.virtualizable_boxes)
 
     def synchronize_virtualizable(self):
         vinfo = self.staticdata.virtualizable_info
         virtualizable_box = self.virtualizable_boxes[-1]
-        virtualizable = virtualizable_box.getptr(vinfo.VTYPEPTR)
+        virtualizable = vinfo.unwrap_virtualizable_box(virtualizable_box)
         vinfo.write_boxes(virtualizable, self.virtualizable_boxes)
 
     def gen_store_back_in_virtualizable(self):
@@ -1455,7 +1455,7 @@
                 self.execute_and_record(rop.SETFIELD_GC, [vbox, fieldbox],
                                         descr=vinfo.static_field_descrs[i])
             i = vinfo.num_static_extra_boxes
-            virtualizable = vbox.getptr(vinfo.VTYPEPTR)
+            virtualizable = vinfo.unwrap_virtualizable_box(vbox)
             for k in range(vinfo.num_arrays):
                 abox = self.execute_and_record(rop.GETFIELD_GC, [vbox],
                                          descr=vinfo.array_field_descrs[k])

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	Tue Jun 23 21:41:07 2009
@@ -891,10 +891,10 @@
         self.check_loops(getfield_gc=0, setfield_gc=0, call=0)
 
 
-#class TestOOtype(ExplicitVirtualizableTests,
-#                 ImplicitVirtualizableTests,
-#                 OOJitMixin):
-#    pass
+class TestOOtype(#ExplicitVirtualizableTests,
+                 ImplicitVirtualizableTests,
+                 OOJitMixin):
+    pass
 
 class TestLLtype(ExplicitVirtualizableTests,
                  ImplicitVirtualizableTests,

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_virtualizable.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_virtualizable.py	Tue Jun 23 21:41:07 2009
@@ -3,6 +3,6 @@
 from pypy.jit.metainterp.test.test_zrpy_basic import LLInterpJitMixin
 
 
-class TestLLImplicitVirtualizable(LLInterpJitMixin,
-                       test_virtualizable.ExplicitVirtualizableTests):
+class TestLLVirtualizable(LLInterpJitMixin,
+                          test_virtualizable.ExplicitVirtualizableTests):
     pass

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/typesystem.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/typesystem.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/typesystem.py	Tue Jun 23 21:41:07 2009
@@ -12,6 +12,27 @@
     assert isinstance(T, ootype.OOType)
     return T
 
+def getlength(array):
+    if isinstance(array, ootype._array):
+        return array.ll_length()
+    else:
+        return len(array)      # assume a Ptr(GcArray)
+getlength._annspecialcase_ = 'specialize:ll'
+
+def getarrayitem(array, i):
+    if isinstance(array, ootype._array):
+        return array.ll_getitem_fast(i)
+    else:
+        return array[i]        # assume a Ptr(GcArray)
+getarrayitem._annspecialcase_ = 'specialize:ll'
+
+def setarrayitem(array, i, newvalue):
+    if isinstance(array, ootype._array):
+        array.ll_setitem_fast(i, newvalue)
+    else:
+        array[i] = newvalue    # assume a Ptr(GcArray)
+setarrayitem._annspecialcase_ = 'specialize:ll'
+
 def fieldType(T, name):
     if isinstance(T, lltype.Struct):
         return getattr(T, name)

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	Tue Jun 23 21:41:07 2009
@@ -22,6 +22,8 @@
 from pypy.jit.metainterp.policy import JitPolicy
 from pypy.jit.metainterp.typesystem import LLTypeHelper, OOTypeHelper
 from pypy.jit.metainterp.jitprof import Profiler
+from pypy.jit.metainterp.typesystem import deref, getlength
+from pypy.jit.metainterp.typesystem import getarrayitem, setarrayitem
 
 # ____________________________________________________________
 # Bootstrapping
@@ -468,16 +470,22 @@
 class VirtualizableInfo:
     def __init__(self, warmrunnerdesc):
         jitdriver = warmrunnerdesc.jitdriver
+        cpu = warmrunnerdesc.cpu
+        self.is_oo = cpu.is_oo
         assert len(jitdriver.virtualizables) == 1    # for now
         [vname] = jitdriver.virtualizables
         index = len(jitdriver.greens) + jitdriver.reds.index(vname)
         self.index_of_virtualizable = index
         VTYPEPTR = warmrunnerdesc.JIT_ENTER_FUNCTYPE.ARGS[index]
-        while 'virtualizable2_accessor' not in VTYPEPTR.TO._hints:
-            VTYPEPTR = lltype.Ptr(VTYPEPTR.TO._first_struct()[1])
+        while 'virtualizable2_accessor' not in deref(VTYPEPTR)._hints:
+            if not self.is_oo:
+                VTYPEPTR = lltype.Ptr(VTYPEPTR.TO._first_struct()[1])
+            else:
+                VTYPEPTR = VTYPEPTR._superclass
         self.VTYPEPTR = VTYPEPTR
+        self.VTYPE = VTYPE = deref(VTYPEPTR)
         #
-        accessor = VTYPEPTR.TO._hints['virtualizable2_accessor']
+        accessor = VTYPE._hints['virtualizable2_accessor']
         all_fields = accessor.redirected_fields
         static_fields = []
         array_fields = []
@@ -489,13 +497,26 @@
         self.static_fields = static_fields
         self.array_fields = array_fields
         #
-        FIELDTYPES = [getattr(VTYPEPTR.TO, name) for name in static_fields]
-        ARRAYITEMTYPES = []
-        for name in array_fields:
-            ARRAYPTR = getattr(VTYPEPTR.TO, name)
-            assert isinstance(ARRAYPTR, lltype.Ptr)
-            assert isinstance(ARRAYPTR.TO, lltype.GcArray)
-            ARRAYITEMTYPES.append(ARRAYPTR.TO.OF)
+        if not self.is_oo:    # lltype
+            assert isinstance(VTYPEPTR, lltype.Ptr)
+            FIELDTYPES = [getattr(VTYPE, name) for name in static_fields]
+            ARRAYITEMTYPES = []
+            for name in array_fields:
+                ARRAYPTR = getattr(VTYPE, name)
+                assert isinstance(ARRAYPTR, lltype.Ptr)
+                assert isinstance(ARRAYPTR.TO, lltype.GcArray)
+                ARRAYITEMTYPES.append(ARRAYPTR.TO.OF)
+            self.array_descrs = [cpu.arraydescrof(getattr(VTYPE, name).TO)
+                                 for name in array_fields]
+        else:                 # ootype
+            FIELDTYPES = [VTYPE._field_type(name) for name in static_fields]
+            ARRAYITEMTYPES = []
+            for name in array_fields:
+                ARRAY = VTYPE._field_type(name)
+                assert isinstance(ARRAY, ootype.Array)
+                ARRAYITEMTYPES.append(ARRAY.ITEM)
+            self.array_descrs = [cpu.arraydescrof(VTYPE._field_type(name))
+                                 for name in array_fields]
         #
         self.num_static_extra_boxes = len(static_fields)
         self.num_arrays = len(array_fields)
@@ -507,13 +528,10 @@
                                    for TYPE in FIELDTYPES]
         self.arrayitem_extra_types = [history.getkind(ITEM)
                                       for ITEM in ARRAYITEMTYPES]
-        cpu = warmrunnerdesc.cpu
-        self.static_field_descrs = [cpu.fielddescrof(VTYPEPTR.TO, name)
+        self.static_field_descrs = [cpu.fielddescrof(VTYPE, name)
                                     for name in static_fields]
-        self.array_field_descrs = [cpu.fielddescrof(VTYPEPTR.TO, name)
+        self.array_field_descrs = [cpu.fielddescrof(VTYPE, 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 = []
@@ -522,8 +540,8 @@
                 boxes.append(wrap(cpu, x))
             for _, fieldname in unroll_array_fields:
                 lst = getattr(virtualizable, fieldname)
-                for i in range(len(lst)):
-                    boxes.append(wrap(cpu, lst[i]))
+                for i in range(getlength(lst)):
+                    boxes.append(wrap(cpu, getarrayitem(lst, i)))
             return boxes
         #
         def write_boxes(virtualizable, boxes):
@@ -534,9 +552,9 @@
                 i = i + 1
             for ARRAYITEMTYPE, fieldname in unroll_array_fields:
                 lst = getattr(virtualizable, fieldname)
-                for j in range(len(lst)):
+                for j in range(getlength(lst)):
                     x = unwrap(ARRAYITEMTYPE, boxes[i])
-                    lst[j] = x
+                    setarrayitem(lst, j, x)
                     i = i + 1
             assert len(boxes) == i + 1
         #
@@ -549,9 +567,9 @@
                 i = i + 1
             for ARRAYITEMTYPE, fieldname in unroll_array_fields:
                 lst = getattr(virtualizable, fieldname)
-                for j in range(len(lst)):
+                for j in range(getlength(lst)):
                     x = unwrap(ARRAYITEMTYPE, boxes[i])
-                    assert lst[j] == x
+                    assert getarrayitem(lst, j) == x
                     i = i + 1
             assert len(boxes) == i + 1
         #
@@ -562,7 +580,7 @@
                 if arrayindex == j:
                     return index
                 lst = getattr(virtualizable, fieldname)
-                index += len(lst)
+                index += getlength(lst)
                 j = j + 1
             assert False, "invalid arrayindex"
         #
@@ -571,7 +589,7 @@
             for _, fieldname in unroll_array_fields:
                 if arrayindex == j:
                     lst = getattr(virtualizable, fieldname)
-                    return len(lst)
+                    return getlength(lst)
                 j = j + 1
             assert False, "invalid arrayindex"
         #
@@ -588,10 +606,28 @@
     def _freeze_(self):
         return True
 
+    def unwrap_virtualizable_box(self, virtualizable_box):
+        if not self.is_oo:
+            return virtualizable_box.getptr(self.VTYPEPTR)
+        else:
+            obj = virtualizable_box.getobj()
+            return ootype.cast_from_object(self.VTYPE, obj)
+
     def gencast(self, virtualizable):
-        return lltype.cast_pointer(self.VTYPEPTR, virtualizable)
+        if not self.is_oo:
+            return lltype.cast_pointer(self.VTYPEPTR, virtualizable)
+        else:
+            return virtualizable
     gencast._annspecialcase_ = 'specialize:ll'
 
+    def is_vtypeptr(self, TYPE):
+        if not self.is_oo:
+            # only the exact type is used e.g. by getfield/setfield
+            return TYPE == self.VTYPEPTR
+        else:
+            # ootype: any subtype may be used too
+            return ootype.isSubclass(TYPE, self.VTYPE)
+
 
 def decode_hp_hint_args(op):
     # Returns (list-of-green-vars, list-of-red-vars) without Voids.
@@ -723,7 +759,7 @@
                 for typecode, fieldname in vable_array_fields:
                     lst = getattr(virtualizable, fieldname)
                     for j in range(len(lst)):
-                        x = lst[j]
+                        x = getarrayitem(lst, j)
                         set_future_value(i, x, typecode)
                         i = i + 1
 



More information about the Pypy-commit mailing list