[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