[pypy-svn] r69442 - in pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Thu Nov 19 14:50:47 CET 2009
Author: cfbolz
Date: Thu Nov 19 14:50:46 2009
New Revision: 69442
Modified:
pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/optimizeopt.py
pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/resume.py
pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/test/test_optimizeopt.py
pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/test/test_resume.py
Log:
(pedronis, cfbolz): actually pass the test that we wrote during the sprint: Share vinfo objects if the numberings didn't change.
Modified: pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/optimizeopt.py (original)
+++ pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/optimizeopt.py Thu Nov 19 14:50:46 2009
@@ -151,9 +151,10 @@
class AbstractVirtualValue(OptValue):
- _attrs_ = ('optimizer', 'keybox', 'source_op')
+ _attrs_ = ('optimizer', 'keybox', 'source_op', '_cached_vinfo')
box = None
level = LEVEL_NONNULL
+ _cached_vinfo = None
def __init__(self, optimizer, keybox, source_op=None):
self.optimizer = optimizer
@@ -173,8 +174,13 @@
return self.box
def make_virtual_info(self, modifier, fieldnums):
+ vinfo = self._cached_vinfo
+ if vinfo is not None and resume.tagged_list_eq(
+ vinfo.fieldnums, fieldnums):
+ return vinfo
vinfo = self._make_virtual(modifier)
vinfo.fieldnums = fieldnums
+ self._cached_vinfo = vinfo
return vinfo
def _make_virtual(self, modifier):
Modified: pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/resume.py (original)
+++ pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/resume.py Thu Nov 19 14:50:46 2009
@@ -84,6 +84,14 @@
# please rpython :(
return rarithmetic.widen(x) == rarithmetic.widen(y)
+def tagged_list_eq(tl1, tl2):
+ if len(tl1) != len(tl2):
+ return False
+ for i in range(len(tl1)):
+ if not tagged_eq(tl1[i], tl2[i]):
+ return False
+ return True
+
TAGCONST = 0
TAGINT = 1
TAGBOX = 2
Modified: pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/test/test_optimizeopt.py Thu Nov 19 14:50:46 2009
@@ -74,6 +74,22 @@
lst2 = virt1._get_field_descr_list()
assert lst1 is lst2
+def test_reuse_vinfo():
+ class FakeVInfo(object):
+ pass
+ class FakeVirtualValue(optimizeopt.AbstractVirtualValue):
+ def _make_virtual(self, *args):
+ return FakeVInfo()
+ v1 = FakeVirtualValue(None, None, None)
+ vinfo1 = v1.make_virtual_info(None, [1, 2, 4])
+ vinfo2 = v1.make_virtual_info(None, [1, 2, 4])
+ assert vinfo1 is vinfo2
+ vinfo3 = v1.make_virtual_info(None, [1, 2, 6])
+ assert vinfo3 is not vinfo2
+ vinfo4 = v1.make_virtual_info(None, [1, 2, 6])
+ assert vinfo3 is vinfo4
+
+
# ____________________________________________________________
def equaloplists(oplist1, oplist2, strict_fail_args=True, remap={}):
Modified: pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/test/test_resume.py
==============================================================================
--- pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/test/test_resume.py (original)
+++ pypy/branch/compress-virtuals-resumedata/pypy/jit/metainterp/test/test_resume.py Thu Nov 19 14:50:46 2009
@@ -34,6 +34,12 @@
assert tagged_eq(UNASSIGNED, UNASSIGNED)
assert not tagged_eq(tag(1, TAGBOX), UNASSIGNED)
+def test_tagged_list_eq():
+ assert tagged_list_eq([UNASSIGNED, tag(1, TAGBOX), tag(-2, TAGVIRTUAL)],
+ [UNASSIGNED, tag(1, TAGBOX), tag(-2, TAGVIRTUAL)])
+ assert not tagged_list_eq([tag(1, TAGBOX)], [tag(-2, TAGBOX)])
+ assert not tagged_list_eq([tag(1, TAGBOX), tag(-2, TAGBOX)], [tag(1, TAGBOX)])
+
class MyMetaInterp:
def __init__(self, cpu=None):
if cpu is None:
More information about the Pypy-commit
mailing list