[pypy-commit] pypy default: Make the test more similar to pypy/module/_cffi_backend.

arigo noreply at buildbot.pypy.org
Sun Oct 6 13:23:21 CEST 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r67164:d0b269c45840
Date: 2013-10-06 13:22 +0200
http://bitbucket.org/pypy/pypy/changeset/d0b269c45840/

Log:	Make the test more similar to pypy/module/_cffi_backend. Crashes
	when a guard fails in the middle of the virtualized raw-malloc
	buffer.

diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -381,6 +381,8 @@
             res = self.llinterp.eval_graph(ptr._obj.graph, args)
         else:
             res = ptr._obj._callable(*args)
+        if RESULT is lltype.Void:
+            return None
         return support.cast_result(RESULT, res)
 
     def _do_call(self, func, args_i, args_r, args_f, calldescr):
diff --git a/rpython/jit/metainterp/test/test_fficall.py b/rpython/jit/metainterp/test/test_fficall.py
--- a/rpython/jit/metainterp/test/test_fficall.py
+++ b/rpython/jit/metainterp/test/test_fficall.py
@@ -86,15 +86,17 @@
             data = rffi.ptradd(exchange_buffer, ofs)
             rffi.cast(lltype.Ptr(TYPE), data)[0] = write_rvalue
 
-        def f():
+        def f(i):
             exbuf = lltype.malloc(rffi.CCHARP.TO, (len(avalues)+2) * 16,
-                                  flavor='raw', zero=True)
-            ofs = 16
+                                  flavor='raw')
+
+            targetptr = rffi.ptradd(exbuf, 16)
             for avalue in unroll_avalues:
                 TYPE = rffi.CArray(lltype.typeOf(avalue))
-                data = rffi.ptradd(exbuf, ofs)
-                rffi.cast(lltype.Ptr(TYPE), data)[0] = avalue
-                ofs += 16
+                if i == 9:    # a guard that can fail
+                    pass
+                rffi.cast(lltype.Ptr(TYPE), targetptr)[0] = avalue
+                targetptr = rffi.ptradd(targetptr, 16)
 
             jit_ffi_call(cif_description, func_addr, exbuf)
 
@@ -102,8 +104,7 @@
                 res = 654321
             else:
                 TYPE = rffi.CArray(lltype.typeOf(rvalue))
-                data = rffi.ptradd(exbuf, ofs)
-                res = rffi.cast(lltype.Ptr(TYPE), data)[0]
+                res = rffi.cast(lltype.Ptr(TYPE), targetptr)[0]
             lltype.free(exbuf, flavor='raw')
             if lltype.typeOf(res) is lltype.SingleFloat:
                 res = float(res)
@@ -117,9 +118,9 @@
             return res == rvalue
 
         with FakeFFI(fake_call_impl_any):
-            res = f()
+            res = f(-42)
             assert matching_result(res, rvalue)
-            res = self.interp_operations(f, [],
+            res = self.interp_operations(f, [-42],
                             supports_floats = supports_floats,
                           supports_longlong = supports_longlong,
                       supports_singlefloats = supports_singlefloats)
@@ -132,6 +133,19 @@
             self.check_operations_history(call_may_force=0,
                                           call_release_gil=expected_call_release_gil)
 
+        ##################################################
+        driver = jit.JitDriver(reds=['i'], greens=[])
+        def main():
+            i = 0
+            while 1:
+                driver.jit_merge_point(i=i)
+                res = f(i)
+                i += 1
+                if i == 12:
+                    return res
+        self.meta_interp(main, [])
+
+
     def test_simple_call_int(self):
         self._run([types.signed] * 2, types.signed, [456, 789], -42)
 


More information about the pypy-commit mailing list