[pypy-svn] r77915 - pypy/branch/jitffi/pypy/module/pypyjit/test
antocuni at codespeak.net
antocuni at codespeak.net
Thu Oct 14 13:34:33 CEST 2010
Author: antocuni
Date: Thu Oct 14 13:34:32 2010
New Revision: 77915
Modified:
pypy/branch/jitffi/pypy/module/pypyjit/test/test_pypy_c.py
Log:
add a test to check that the applevel _ffi call is optimized
Modified: pypy/branch/jitffi/pypy/module/pypyjit/test/test_pypy_c.py
==============================================================================
--- pypy/branch/jitffi/pypy/module/pypyjit/test/test_pypy_c.py (original)
+++ pypy/branch/jitffi/pypy/module/pypyjit/test/test_pypy_c.py Thu Oct 14 13:34:32 2010
@@ -79,8 +79,11 @@
class PyPyCJITTests(object):
- def run_source(self, source, expected_max_ops, *testcases):
+ def run_source(self, source, expected_max_ops, *testcases, **kwds):
assert isinstance(expected_max_ops, int)
+ threshold = kwds.pop('threshold', 3)
+ if kwds:
+ raise TypeError, 'Unsupported keyword arguments: %s' % kwds.keys()
source = py.code.Source(source)
filepath = self.tmpdir.join('case%d.py' % self.counter)
logfilepath = filepath.new(ext='.log')
@@ -92,7 +95,7 @@
import sys
try: # make the file runnable by CPython
import pypyjit
- pypyjit.set_param(threshold=3)
+ pypyjit.set_param(threshold=%d)
except ImportError:
pass
@@ -102,7 +105,7 @@
print >> sys.stderr, 'got:', repr(result)
assert result == expected
assert type(result) is type(expected)
- """)
+ """ % threshold)
for testcase in testcases * 2:
print >> f, "check(%r, %r)" % testcase
print >> f, "print 'OK :-)'"
@@ -123,6 +126,7 @@
if self.total_ops > expected_max_ops:
assert 0, "too many operations: got %d, expected maximum %d" % (
self.total_ops, expected_max_ops)
+ return result
def parse_loops(self, opslogfile):
from pypy.jit.metainterp.test.oparser import parse
@@ -1130,6 +1134,36 @@
return sa
''', 88, ([], 1997001))
+ def test__ffi_call(self):
+ from pypy.rlib.test.test_libffi import get_libm_name
+ libm_name = get_libm_name(sys.platform)
+ out = self.run_source('''
+ def main():
+ from _ffi import CDLL, types
+ libm = CDLL('%(libm_name)s')
+ pow = libm.getfunc('pow', [types.double, types.double],
+ types.double)
+ print pow.getaddr()
+ i = 0
+ res = 0
+ while i < 2000:
+ res += pow(2, 3)
+ i += 1
+ return res
+ ''' % locals(),
+ 70, ([], 8.0*2000), threshold=1000)
+ pow_addr = int(out.splitlines()[0])
+ ops = self.get_by_bytecode('CALL_FUNCTION')
+ assert len(ops) == 2 # we get two loops, because of specialization
+ op = ops[0]
+ # XXX: there should be a guard_not_forced
+ assert op[-1].getopname() == 'guard_no_exception'
+ call = op[-2]
+ assert call.getopname() == 'call'
+ assert call.getarg(0).value == pow_addr
+ assert call.getarg(1).value == 2.0
+ assert call.getarg(2).value == 3.0
+
# test_circular
class AppTestJIT(PyPyCJITTests):
More information about the Pypy-commit
mailing list