71 lines
1.6 KiB
Python
71 lines
1.6 KiB
Python
|
"""
|
||
|
This file will be copied to a temporary directory in order to
|
||
|
exercise caching compiled C callbacks.
|
||
|
|
||
|
See test_cfunc.py.
|
||
|
"""
|
||
|
|
||
|
import sys
|
||
|
|
||
|
from numba import cfunc, jit
|
||
|
from numba.tests.support import TestCase, captured_stderr
|
||
|
|
||
|
|
||
|
Z = 1
|
||
|
|
||
|
add_sig = "float64(float64, float64)"
|
||
|
|
||
|
div_sig = "float64(int64, int64)"
|
||
|
|
||
|
|
||
|
@cfunc(add_sig, cache=True, nopython=True)
|
||
|
def add_usecase(x, y):
|
||
|
return x + y + Z
|
||
|
|
||
|
@cfunc(add_sig, nopython=True)
|
||
|
def add_nocache_usecase(x, y):
|
||
|
return x + y + Z
|
||
|
|
||
|
@cfunc(div_sig, cache=True, nopython=True)
|
||
|
def div_usecase(a, b):
|
||
|
return a / b
|
||
|
|
||
|
|
||
|
@jit(nopython=True)
|
||
|
def inner(x, y):
|
||
|
return x + y + Z
|
||
|
|
||
|
@cfunc(add_sig, cache=True, nopython=True)
|
||
|
def outer(x, y):
|
||
|
return inner(-y, x)
|
||
|
|
||
|
|
||
|
class _TestModule(TestCase):
|
||
|
"""
|
||
|
Tests for functionality of this module's cfuncs.
|
||
|
Note this does not define any "test_*" method, instead check_module()
|
||
|
should be called by hand.
|
||
|
"""
|
||
|
|
||
|
def check_module(self, mod):
|
||
|
f = mod.add_usecase
|
||
|
self.assertPreciseEqual(f.ctypes(2.0, 3.0), 6.0)
|
||
|
f = mod.add_nocache_usecase
|
||
|
self.assertPreciseEqual(f.ctypes(2.0, 3.0), 6.0)
|
||
|
f = mod.outer
|
||
|
self.assertPreciseEqual(f.ctypes(5.0, 2.0), 4.0)
|
||
|
|
||
|
f = mod.div_usecase
|
||
|
with captured_stderr() as err:
|
||
|
self.assertPreciseEqual(f.ctypes(7, 2), 3.5)
|
||
|
self.assertEqual(err.getvalue(), "")
|
||
|
with captured_stderr() as err:
|
||
|
f.ctypes(7, 0)
|
||
|
err = err.getvalue()
|
||
|
self.assertIn("ZeroDivisionError", err)
|
||
|
|
||
|
|
||
|
def self_test():
|
||
|
mod = sys.modules[__name__]
|
||
|
_TestModule().check_module(mod)
|