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)))
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