[pypy-svn] r69972 - in pypy/branch/virtual-forcing/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Tue Dec 8 11:12:00 CET 2009


Author: arigo
Date: Tue Dec  8 11:12:00 2009
New Revision: 69972

Modified:
   pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/support.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_virtualref.py
Log:
Implement 'jit_force_virtual' in JITted code too.


Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py	Tue Dec  8 11:12:00 2009
@@ -1577,8 +1577,7 @@
         self.vable_flags[op.args[0]] = op.args[2].value
 
     def serialize_op_jit_force_virtual(self, op):
-        raise ForcingVirtualRef("forcing a virtual_ref, i.e. calling it, "
-                                "should not be seen by the JIT")
+        self._do_builtin_call(op, 'jit_force_virtual', op.args)
 
     serialize_op_oostring  = handle_builtin_call
     serialize_op_oounicode = handle_builtin_call

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/support.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/support.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/support.py	Tue Dec  8 11:12:00 2009
@@ -3,6 +3,7 @@
 from pypy.rpython import rlist
 from pypy.rpython.lltypesystem import rstr as ll_rstr, rdict as ll_rdict
 from pypy.rpython.lltypesystem import rlist as lltypesystem_rlist
+from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.rpython.ootypesystem import rdict as oo_rdict
 from pypy.rpython.llinterp import LLInterpreter
 from pypy.rpython.extregistry import ExtRegistryEntry
@@ -136,6 +137,9 @@
 def _ll_1_gc_identityhash(x):
     return lltype.identityhash(x)
 
+def _ll_1_jit_force_virtual(inst):
+    return llop.jit_force_virtual(lltype.typeOf(inst), inst)
+
 
 class LLtypeHelpers:
 

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_virtualref.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_virtualref.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_virtualref.py	Tue Dec  8 11:12:00 2009
@@ -334,6 +334,32 @@
         res = self.meta_interp(f, [15])
         assert res == 1
 
+    def test_jit_force_virtual_seen(self):
+        myjitdriver = JitDriver(greens = [], reds = ['n'])
+        #
+        class XY:
+            pass
+        class ExCtx:
+            pass
+        exctx = ExCtx()
+        #
+        def f(n):
+            later = None
+            while n > 0:
+                myjitdriver.can_enter_jit(n=n)
+                myjitdriver.jit_merge_point(n=n)
+                xy = XY()
+                xy.n = n
+                exctx.topframeref = virtual_ref(xy)
+                n = exctx.topframeref().n - 1
+                exctx.topframeref = vref_None
+                virtual_ref_finish(xy)
+            return 1
+        #
+        res = self.meta_interp(f, [15])
+        assert res == 1
+        self.check_loops({})      # because we aborted tracing
+
 
 class TestLLtype(VRefTests, LLJitMixin):
     pass



More information about the Pypy-commit mailing list