[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