def make_function_type(cfnptr): """ Return a Numba type for the given ctypes function pointer. """ if cfnptr.argtypes is None: raise TypeError( "ctypes function %r doesn't define its argument types; " "consider setting the `argtypes` attribute" % (cfnptr.__name__,) ) cargs = [from_ctypes(a) for a in cfnptr.argtypes] cret = from_ctypes(cfnptr.restype) # void* return type is a int/long on 32 bit platforms and an int on 64 bit # platforms, explicit conversion to a int64 should match. if cret == types.voidptr: cret = types.uintp if sys.platform == "win32" and not cfnptr._flags_ & ctypes._FUNCFLAG_CDECL: # 'stdcall' calling convention under Windows cconv = "x86_stdcallcc" else: # Default C calling convention cconv = None sig = templates.signature(cret, *cargs) return types.ExternalFunctionPointer(sig, cconv=cconv, get_pointer=get_pointer)
def dpnp_func(fn_name, type_names, sig): f_ptr = get_dpnp_fptr(fn_name, type_names) def get_pointer(obj): return f_ptr return types.ExternalFunctionPointer(sig, get_pointer=get_pointer)
def make_function_type(cffi_func, use_record_dtype=False): """ Return a Numba type for the given CFFI function pointer. """ cffi_type = _ool_func_types.get(cffi_func) or ffi.typeof(cffi_func) if getattr(cffi_type, 'kind', '') == 'struct': raise TypeError('No support for CFFI struct values') sig = map_type(cffi_type, use_record_dtype=use_record_dtype) return types.ExternalFunctionPointer(sig, get_pointer=get_pointer)
def test_equality(self): self.assertEqual(types.int32, types.int32) self.assertEqual(types.uint32, types.uint32) self.assertEqual(types.complex64, types.complex64) self.assertEqual(types.float32, types.float32) # Different signedness self.assertNotEqual(types.int32, types.uint32) # Different width self.assertNotEqual(types.int64, types.int32) self.assertNotEqual(types.float64, types.float32) self.assertNotEqual(types.complex64, types.complex128) # Different domain self.assertNotEqual(types.int64, types.float64) self.assertNotEqual(types.uint64, types.float64) self.assertNotEqual(types.complex64, types.float64) # Same arguments but different return types get_pointer = None sig_a = typing.signature(types.intp, types.intp) sig_b = typing.signature(types.voidptr, types.intp) a = types.ExternalFunctionPointer(sig=sig_a, get_pointer=get_pointer) b = types.ExternalFunctionPointer(sig=sig_b, get_pointer=get_pointer) self.assertNotEqual(a, b) # Different call convention a = types.ExternalFunctionPointer(sig=sig_a, get_pointer=get_pointer) b = types.ExternalFunctionPointer(sig=sig_a, get_pointer=get_pointer, cconv='stdcall') self.assertNotEqual(a, b) # Different get_pointer a = types.ExternalFunctionPointer(sig=sig_a, get_pointer=get_pointer) b = types.ExternalFunctionPointer(sig=sig_a, get_pointer=object()) self.assertNotEqual(a, b) # Different template classes bearing the same name class DummyTemplate(object): key = "foo" a = types.BoundFunction(DummyTemplate, types.int32) class DummyTemplate(object): key = "bar" b = types.BoundFunction(DummyTemplate, types.int32) self.assertNotEqual(a, b) # Different dtypes self.assertNotEqual(types.DType(types.int32), types.DType(types.int64)) # CPointer with same addrspace self.assertEqual(types.CPointer(types.float32), types.CPointer(types.float32)) # CPointer with different addrspace self.assertNotEqual(types.CPointer(types.float32, 0), types.CPointer(types.float32, 1))