示例#1
0
文件: rules.py 项目: pombreda/flypy
def typeof(pyval):
    """Python value -> Type"""
    from .runtime.obj.core import Type, Constructor
    from flypy import coretypes
    from flypy.support import ctypes_support, cffi_support

    if is_flypy_type(pyval):
        if pyval.type.parameters:
            return Constructor[pyval.type]
        return Type[pyval.type]
    elif isinstance(pyval, coretypes.Mono):
        return Type[pyval]
    elif is_flypy_type(type(pyval)):
        return infer_constant(pyval)
    elif cffi_support.is_cffi(pyval):
        cffi_type = cffi_support.ffi.typeof(pyval)
        return cffi_support.map_type(cffi_type)
    elif (ctypes_support.is_ctypes_value(pyval)
          and ctypes_support.is_ctypes_function(pyval)):
        return ctypes_support.from_ctypes_type(type(pyval), pyval)
    elif ctypes_support.is_ctypes_value(pyval):
        return ctypes_support.from_ctypes_type(type(pyval))
    elif ctypes_support.is_ctypes_struct_type(pyval):
        return ctypes_support.from_ctypes_type(pyval)

    raise NotImplementedError("typeof(%s, %s)" % (pyval, type(pyval)))
示例#2
0
文件: rules.py 项目: filmackay/flypy
def typeof(pyval):
    """Python value -> Type"""
    from .runtime.obj.core import Type, Constructor
    from flypy import coretypes
    from flypy.support import ctypes_support, cffi_support

    if is_flypy_type(pyval):
        if pyval.type.parameters:
            return Constructor[pyval.type]
        return Type[pyval.type]
    elif isinstance(pyval, coretypes.Mono):
        return Type[pyval]
    elif is_flypy_type(type(pyval)):
        return infer_constant(pyval)
    elif cffi_support.is_cffi(pyval):
        cffi_type = cffi_support.ffi.typeof(pyval)
        return cffi_support.map_type(cffi_type)
    elif (ctypes_support.is_ctypes_value(pyval) and
          ctypes_support.is_ctypes_function(pyval)):
        return ctypes_support.from_ctypes_type(type(pyval), pyval)
    elif ctypes_support.is_ctypes_value(pyval):
        return ctypes_support.from_ctypes_type(type(pyval))
    elif ctypes_support.is_ctypes_struct_type(pyval):
        return ctypes_support.from_ctypes_type(pyval)

    raise NotImplementedError("typeof(%s, %s)" % (pyval, type(pyval)))
示例#3
0
def make_ctypes_ptr(ptr, type):
    from flypy.support.cffi_support import is_cffi, ffi
    from flypy.support.ctypes_support import is_ctypes_pointer_type

    cty = ctype(type)

    if is_cffi(ptr):
        addr = ffi.cast('uintptr_t', ptr)
        ctypes_ptr = ctypes.c_void_p(int(addr))
        ptr = ctypes.cast(ctypes_ptr, cty)
    else:
        ptr = ctypes.cast(ptr, cty)

    return ptr
示例#4
0
def make_ctypes_ptr(ptr, type):
    from flypy.support.cffi_support import is_cffi, ffi
    from flypy.support.ctypes_support import is_ctypes_pointer_type

    cty = ctype(type)

    if is_cffi(ptr):
        addr = ffi.cast('uintptr_t', ptr)
        ctypes_ptr = ctypes.c_void_p(int(addr))
        ptr = ctypes.cast(ctypes_ptr, cty)
    else:
        ptr = ctypes.cast(ptr, cty)

    return ptr