[pypy-svn] r74644 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test

arigo at codespeak.net arigo at codespeak.net
Fri May 21 18:51:26 CEST 2010


Author: arigo
Date: Fri May 21 18:51:24 2010
New Revision: 74644

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
Log:
Next test.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	Fri May 21 18:51:24 2010
@@ -293,13 +293,6 @@
         op1 = self._prepare_builtin_call(op, oopspec_name, args)
         return self.handle_residual_call(op1)
 
-    def _handle_virtual_ref_call(self, op, oopspec_name, args):
-        vrefinfo = self.callcontrol.virtualref_info
-        heaptracker.register_known_gctype(self.cpu,
-                                          vrefinfo.jit_virtual_ref_vtable,
-                                          vrefinfo.JIT_VIRTUAL_REF)
-        return SpaceOperation(oopspec_name, list(args), op.result)
-
     handle_residual_indirect_call = handle_residual_call
 
     def handle_regular_indirect_call(self, op):
@@ -679,6 +672,19 @@
     def handle_jit_marker__can_enter_jit(self, op, jitdriver):
         return SpaceOperation('can_enter_jit', [], None)
 
+    # ----------
+    # VirtualRefs.
+
+    def _handle_virtual_ref_call(self, op, oopspec_name, args):
+        vrefinfo = self.callcontrol.virtualref_info
+        heaptracker.register_known_gctype(self.cpu,
+                                          vrefinfo.jit_virtual_ref_vtable,
+                                          vrefinfo.JIT_VIRTUAL_REF)
+        return SpaceOperation(oopspec_name, list(args), op.result)
+
+    def rewrite_op_jit_force_virtual(self, op):
+        return self._do_builtin_call(op)
+
 # ____________________________________________________________
 
 def _with_prefix(prefix):

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	Fri May 21 18:51:24 2010
@@ -75,7 +75,13 @@
         jit_virtual_ref_vtable = lltype.malloc(rclass.OBJECT_VTABLE,
                                                immortal=True)
     def guess_call_kind(self, op):
-        return 'builtin'
+        if hasattr(op.args[0].value._obj.graph.func, 'oopspec'):
+            return 'builtin'
+        return 'residual'
+    def getcalldescr(self, op):
+        return FakeDescr()
+    def calldescr_canraise(self, calldescr):
+        return False
 
 # ____________________________________________________________
 
@@ -576,7 +582,6 @@
         """, transform=True, liveness=True)
 
     def test_vref_simple(self):
-        from pypy.jit.codewriter.call import CallControl
         class X:
             pass
         def f():
@@ -586,3 +591,19 @@
             virtual_ref %r0 -> %r1
             ref_return %r1
         """, transform=True, cc=FakeCallControlWithVRefInfo())
+
+    def test_vref_forced(self):
+        class X:
+            pass
+        def f():
+            vref = jit.virtual_ref(X())
+            return vref()
+        # The call vref() is a jit_force_virtual operation in the original
+        # graph.  It becomes in the JitCode a residual call to a helper that
+        # contains itself a jit_force_virtual.
+        self.encoding_test(f, [], """
+            new_with_vtable <Descr> -> %r0
+            virtual_ref %r0 -> %r1
+            residual_call_r_r $<* fn _ll_1_jit_force_virtual__objectPtr>, <Descr>, R[%r1] -> %r2
+            ref_return %r2
+        """, transform=True, cc=FakeCallControlWithVRefInfo())



More information about the Pypy-commit mailing list