1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
import sys
from pypy.interpreter.mixedmodule import MixedModule
from rpython.rlib import rdynload, clibffi
from rpython.rtyper.lltypesystem import rffi
from . import VERSION
FFI_DEFAULT_ABI = clibffi.FFI_DEFAULT_ABI
try:
FFI_STDCALL = clibffi.FFI_STDCALL
has_stdcall = True
except AttributeError:
has_stdcall = False
FFI_STDCALL = None
class Module(MixedModule):
appleveldefs = {
}
interpleveldefs = {
'__version__': 'space.wrap("%s")' % VERSION,
'load_library': 'libraryobj.load_library',
'new_primitive_type': 'newtype.new_primitive_type',
'new_pointer_type': 'newtype.new_pointer_type',
'new_array_type': 'newtype.new_array_type',
'new_struct_type': 'newtype.new_struct_type',
'new_union_type': 'newtype.new_union_type',
'complete_struct_or_union': 'newtype.complete_struct_or_union',
'new_void_type': 'newtype.new_void_type',
'new_enum_type': 'newtype.new_enum_type',
'new_function_type': 'newtype.new_function_type',
'newp': 'func.newp',
'cast': 'func.cast',
'callback': 'func.callback',
'alignof': 'func.alignof',
'sizeof': 'func.sizeof',
'typeof': 'func.typeof',
'typeoffsetof': 'func.typeoffsetof',
'rawaddressof': 'func.rawaddressof',
'getcname': 'func.getcname',
'newp_handle': 'handle.newp_handle',
'from_handle': 'handle.from_handle',
'_get_types': 'func._get_types',
'_get_common_types': 'func._get_common_types',
'from_buffer': 'func.from_buffer',
'gcp': 'func.gcp',
'_offset_in_bytes': 'func.offset_in_bytes',
'string': 'func.string',
'unpack': 'func.unpack',
'buffer': 'cbuffer.MiniBuffer',
'memmove': 'func.memmove',
'release': 'func.release',
'get_errno': 'cerrno.get_errno',
'set_errno': 'cerrno.set_errno',
'FFI_DEFAULT_ABI': 'space.wrap(%d)' % FFI_DEFAULT_ABI,
'FFI_CDECL': 'space.wrap(%d)' % FFI_DEFAULT_ABI, # win32 name
# types
'FFI': 'ffi_obj.W_FFIObject',
'Lib': 'lib_obj.W_LibObject',
'CType': 'ctypeobj.W_CType',
'CField': 'ctypestruct.W_CField',
'CLibrary': 'libraryobj.W_Library',
'_CDataBase': 'cdataobj.W_CData',
'__FFIAllocator': 'allocator.W_Allocator',
'__FFIGlobSupport': 'cglob.W_GlobSupport',
'__CData_iterator': 'ctypearray.W_CDataIter',
'__FFIFunctionWrapper': 'wrapper.W_FunctionWrapper',
}
if sys.platform == 'win32':
interpleveldefs['getwinerror'] = 'cerrno.getwinerror'
if has_stdcall:
interpleveldefs['FFI_STDCALL'] = 'space.wrap(%d)' % FFI_STDCALL
def __init__(self, space, *args):
MixedModule.__init__(self, space, *args)
#
if (not space.config.objspace.disable_entrypoints and
not space.config.objspace.disable_entrypoints_in_cffi):
# import 'embedding', which has the side-effect of registering
# the 'pypy_init_embedded_cffi_module' entry point
from pypy.module._cffi_backend import embedding
embedding.glob.space = space
def get_dict_rtld_constants():
found = {}
for name in ["RTLD_LAZY", "RTLD_NOW", "RTLD_GLOBAL", "RTLD_LOCAL",
"RTLD_NODELETE", "RTLD_NOLOAD", "RTLD_DEEPBIND"]:
if getattr(rdynload.cConfig, name) is not None:
found[name] = getattr(rdynload.cConfig, name)
for name in ["RTLD_LAZY", "RTLD_NOW", "RTLD_GLOBAL", "RTLD_LOCAL"]:
found.setdefault(name, 0)
return found
for _name, _value in get_dict_rtld_constants().items():
Module.interpleveldefs[_name] = 'space.wrap(%d)' % _value
|