Exemple #1
0
def make_function_type(cffi_func):
    """
    Return a Numba type for the given CFFI function pointer.
    """
    cffi_type = _ool_func_types.get(cffi_func) or ffi.typeof(cffi_func)
    sig = map_type(cffi_type)
    return types.ExternalFunctionPointer(sig, get_pointer=get_pointer)
Exemple #2
0
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)
Exemple #3
0
def make_function_type(cffi_func):
    """
    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)
    return types.ExternalFunctionPointer(sig, get_pointer=get_pointer)
Exemple #4
0
 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)
Exemple #5
0
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 = [convert_ctypes(a) for a in cfnptr.argtypes]
    cret = convert_ctypes(cfnptr.restype)
    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)
Exemple #6
0
    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))