[pypy-svn] r50677 - in pypy/dist/pypy/jit/timeshifter: . test
antocuni at codespeak.net
antocuni at codespeak.net
Wed Jan 16 19:27:27 CET 2008
Author: antocuni
Date: Wed Jan 16 19:27:25 2008
New Revision: 50677
Added:
pypy/dist/pypy/jit/timeshifter/test/test_rvalue.py (contents, props changed)
Modified:
pypy/dist/pypy/jit/timeshifter/rvalue.py
Log:
(antocuni, arigo)
- unit tests for rvalue.py
- make logic of learn_nonzeroness more precise
Modified: pypy/dist/pypy/jit/timeshifter/rvalue.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rvalue.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rvalue.py Wed Jan 16 19:27:25 2008
@@ -211,9 +211,9 @@
else:
self.known_nonzero = True
else:
- if self.is_constant():
- ok = not self.genvar.revealconst(llmemory.Address) # ok if null
- else:
+ if self.known_nonzero:
+ ok = False
+ elif not self.is_constant():
gv_null = jitstate.curbuilder.rgenop.genzeroconst(self.kind)
self.setgenvar_hint(gv_null, known_nonzero=False)
return ok
Added: pypy/dist/pypy/jit/timeshifter/test/test_rvalue.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/jit/timeshifter/test/test_rvalue.py Wed Jan 16 19:27:25 2008
@@ -0,0 +1,139 @@
+import py
+from pypy.rpython.lltypesystem import lltype
+from pypy.jit.timeshifter import rvalue
+from pypy.jit.timeshifter import rcontainer
+from pypy.jit.codegen.model import GenVar, GenConst
+
+class FakeJITState(object):
+ def __init__(self):
+ self.curbuilder = FakeBuilder()
+
+class FakeRGenOp(object):
+ def genzeroconst(self, kind):
+ if kind == "dummy pointer":
+ return FakeGenConst("NULL")
+ return FakeGenConst(0)
+
+ @staticmethod
+ def kindToken(TYPE):
+ return TYPE
+
+ @staticmethod
+ def fieldToken(TYPE, name):
+ return TYPE, name
+
+ @staticmethod
+ def constPrebuiltGlobal(value):
+ return FakeGenConst(value)
+
+
+class FakeBuilder(object):
+ ops_with_no_retval = set(['setfield'])
+
+ def __init__(self):
+ self.ops = []
+ self.varcount = 1
+ self.rgenop = FakeRGenOp()
+
+ def __getattr__(self, name):
+ if name.startswith('genop_'):
+ opname = name[len('genop_'):]
+ def genop_(*args):
+ if opname in self.ops_with_no_retval:
+ v = None
+ else:
+ v = FakeGenVar(self.varcount)
+ self.varcount += 1
+ self.ops.append((opname, args, v))
+ return v
+ genop_.func_name = name
+ return genop_
+ else:
+ raise AttributeError, name
+
+
+class FakeHRTyper(object):
+ RGenOp = FakeRGenOp
+
+class FakeGenVar(GenVar):
+ def __init__(self, count=0):
+ self.count=count
+
+ def __repr__(self):
+ return "V%d" % self.count
+
+ def __eq__(self, other):
+ return self.count == other.count
+
+
+class FakeGenConst(GenConst):
+ def __init__(self, _value=None):
+ self._value = _value
+
+
+def test_create_int_redbox_var():
+ jitstate = FakeJITState()
+ gv = FakeGenVar()
+ box = rvalue.IntRedBox("dummy kind", gv)
+ assert not box.is_constant()
+ assert box.getgenvar(jitstate) is gv
+ gv2 = FakeGenVar()
+ box.setgenvar(gv2) # doesn't raises
+ assert box.getgenvar(jitstate) is gv2
+
+
+def test_create_int_redbox_const():
+ jitstate = FakeJITState()
+ gv = FakeGenConst()
+ box = rvalue.IntRedBox("dummy kind", gv)
+ assert box.is_constant()
+ assert box.getgenvar(jitstate) is gv
+ gv2 = FakeGenVar()
+ py.test.raises(AssertionError, box.setgenvar, gv2)
+
+def test_forcevar():
+ jitstate = FakeJITState()
+ gv = FakeGenVar()
+ intbox = rvalue.IntRedBox("dummy kind", gv)
+ assert intbox.forcevar(jitstate, rvalue.copy_memo(), False) is intbox
+
+ doublebox = rvalue.DoubleRedBox("dummy kind", FakeGenConst())
+ box2 = doublebox.forcevar(jitstate, rvalue.copy_memo(), False)
+ assert doublebox is not box2
+ assert not box2.is_constant()
+ assert doublebox.genvar is not box2.genvar
+
+def test_learn_nonzeroness():
+ jitstate = FakeJITState()
+ gv = FakeGenVar()
+ box = rvalue.PtrRedBox("dummy pointer", gv)
+ assert not box.known_nonzero
+ assert box.learn_nonzeroness(jitstate, True)
+ assert box.known_nonzero
+
+ assert not box.learn_nonzeroness(jitstate, False)
+ assert box.learn_nonzeroness(jitstate, True)
+
+ box = rvalue.PtrRedBox("dummy pointer", gv)
+ assert box.learn_nonzeroness(jitstate, False)
+ assert box.is_constant()
+ assert box.genvar._value == "NULL"
+ assert box.learn_nonzeroness(jitstate, False)
+ assert not box.learn_nonzeroness(jitstate, True)
+
+def test_box_get_set_field():
+ jitstate = FakeJITState()
+ V0 = FakeGenVar()
+ box = rvalue.PtrRedBox("dummy pointer", V0)
+ STRUCT = lltype.Struct("dummy", ("foo", lltype.Signed))
+ desc = rcontainer.StructFieldDesc(FakeHRTyper(), lltype.Ptr(STRUCT), "foo", 0)
+ box2 = box.op_getfield(jitstate, desc)
+ V1 = box2.genvar
+ assert box.known_nonzero
+ assert jitstate.curbuilder.ops == [('getfield', ((STRUCT, 'foo'), V0), V1)]
+
+ jitstate.curbuilder.ops = []
+ V42 = FakeGenVar(42)
+ valuebox = rvalue.IntRedBox("dummy kind", V42)
+ box.op_setfield(jitstate, desc, valuebox)
+ assert jitstate.curbuilder.ops == [('setfield', ((STRUCT, 'foo'), V0, V42), None)]
More information about the pypy-svn
mailing list