[pypy-svn] r71373 - in pypy/branch/debug-vref2/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Sun Feb 21 13:26:21 CET 2010


Author: arigo
Date: Sun Feb 21 13:26:20 2010
New Revision: 71373

Modified:
   pypy/branch/debug-vref2/pypy/jit/metainterp/optimizeopt.py
   pypy/branch/debug-vref2/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
Force a full flush of optimized fields when seeing a CALL(_MAY_FORCE)
to some function that can indeed force virtualizables or vrefs.


Modified: pypy/branch/debug-vref2/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/debug-vref2/pypy/jit/metainterp/optimizeopt.py	(original)
+++ pypy/branch/debug-vref2/pypy/jit/metainterp/optimizeopt.py	Sun Feb 21 13:26:20 2010
@@ -795,17 +795,10 @@
         # forcing it now does not have catastrophic effects.
         vrefinfo = self.metainterp_sd.virtualref_info
         assert op.args[1].nonnull()
-        # - write code to check that op.args[1] is not null
-        if not self.getvalue(op.args[1]).is_virtual():
-            op1 = ResOperation(rop.ASSERT, [op.args[1]], None)
-            self.emit_operation(op1)
         # - set 'forced' to point to the real object
         op1 = ResOperation(rop.SETFIELD_GC, op.args, None,
                           descr = vrefinfo.descr_forced)
         self.optimize_SETFIELD_GC(op1)
-        op1 = ResOperation(rop.SETFIELD_GC, op.args, None,
-                          descr = vrefinfo.descr_debug_setforced)
-        self.optimize_SETFIELD_GC(op1)
         # - set 'virtual_token' to TOKEN_NONE
         args = [op.args[0], ConstInt(vrefinfo.TOKEN_NONE)]
         op1 = ResOperation(rop.SETFIELD_GC, args, None,
@@ -1040,7 +1033,8 @@
                 effectinfo = None
             else:
                 effectinfo = op.descr.get_extra_info()
-            if effectinfo is not None:
+            if (effectinfo is not None and
+                not effectinfo.forces_virtual_or_virtualizable):
                 # XXX we can get the wrong complexity here, if the lists
                 # XXX stored on effectinfo are large
                 for fielddescr in effectinfo.readonly_descrs_fields:

Modified: pypy/branch/debug-vref2/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/debug-vref2/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/debug-vref2/pypy/jit/metainterp/test/test_optimizeopt.py	Sun Feb 21 13:26:20 2010
@@ -2509,7 +2509,6 @@
         expected = """
         [p1]
         i0 = force_token()
-        assert(p1)
         jump(p1)
         """
         self.optimize_loop(ops, 'Not', expected)
@@ -2529,10 +2528,9 @@
         setfield_gc(p2, i0, descr=virtualtokendescr)
         setfield_gc(p2, 5, descr=virtualrefindexdescr)
         escape(p2)
-        assert(p1)
         setfield_gc(p2, p1, descr=virtualforceddescr)
         setfield_gc(p2, -2, descr=virtualtokendescr)
-        setfield_gc(p2, 120, descr=virtualdebugfrom)
+        setfield_gc(p2, 121, descr=virtualdebugfrom)
         jump(p1)
         """
         # XXX we should optimize a bit more the case of a nonvirtual.
@@ -2567,17 +2565,16 @@
         #
         call_may_force(i1, descr=mayforcevirtdescr)
         guard_not_forced() [i1]
-        setfield_gc(p0, NULL, descr=nextdescr)
         #
         p1 = new_with_vtable(ConstClass(node_vtable))
         p1b = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1b, 252, descr=valuedescr)
         setfield_gc(p1, p1b, descr=nextdescr)
-        #assert(p1) -- virtual up to right here
         setfield_gc(p2, p1, descr=virtualforceddescr)
         setfield_gc(p2, -2, descr=virtualtokendescr)
-        setfield_gc(p2, 120, descr=virtualdebugfrom)
+        setfield_gc(p2, 121, descr=virtualdebugfrom)
         #
+        setfield_gc(p0, NULL, descr=nextdescr)
         jump(p0, i1)
         """
         self.optimize_loop(ops, 'Not, Not', expected)
@@ -2611,17 +2608,16 @@
         #
         call_may_force(i1, descr=mayforcevirtdescr)
         guard_not_forced(descr=fdescr) [p2, i1]
-        setfield_gc(p0, NULL, descr=nextdescr)
         #
         p1 = new_with_vtable(ConstClass(node_vtable))
         p1b = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1b, i1, descr=valuedescr)
         setfield_gc(p1, p1b, descr=nextdescr)
-        #assert(p1) -- virtual up to right here
         setfield_gc(p2, p1, descr=virtualforceddescr)
         setfield_gc(p2, -2, descr=virtualtokendescr)
-        setfield_gc(p2, 120, descr=virtualdebugfrom)
+        setfield_gc(p2, 121, descr=virtualdebugfrom)
         #
+        setfield_gc(p0, NULL, descr=nextdescr)
         jump(p0, i1)
         """
         # the point of this test is that 'i1' should show up in the fail_args
@@ -2671,6 +2667,33 @@
             where p1b is a node_vtable, valuedescr=i1
             ''')
 
+    def test_vref_nonvirtual_and_lazy_setfield(self):
+        self.make_fail_descr()
+        ops = """
+        [i1, p1]
+        p2 = virtual_ref(p1, 23)
+        escape(p2)
+        virtual_ref_finish(p2, p1)
+        call_may_force(i1, descr=mayforcevirtdescr)
+        guard_not_forced() [i1]
+        jump(i1, p1)
+        """
+        expected = """
+        [i1, p1]
+        i3 = force_token()
+        p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+        setfield_gc(p2, i3, descr=virtualtokendescr)
+        setfield_gc(p2, 23, descr=virtualrefindexdescr)
+        escape(p2)
+        setfield_gc(p2, p1, descr=virtualforceddescr)
+        setfield_gc(p2, -2, descr=virtualtokendescr)
+        setfield_gc(p2, 121, descr=virtualdebugfrom)
+        call_may_force(i1, descr=mayforcevirtdescr)
+        guard_not_forced() [i1]
+        jump(i1, p1)
+        """
+        self.optimize_loop(ops, 'Not, Not', expected)
+
 
 class TestOOtype(BaseTestOptimizeOpt, OOtypeMixin):
 



More information about the Pypy-commit mailing list