/llpython/pyaddfunc.py
https://github.com/blep/llvmpy · Python · 40 lines · 29 code · 6 blank · 5 comment · 4 complexity · f9f5d520c55f925518c2d95996a0deff MD5 · raw file
- # ______________________________________________________________________
- import ctypes
- # ______________________________________________________________________
- class PyMethodDef (ctypes.Structure):
- _fields_ = [
- ('ml_name', ctypes.c_char_p),
- ('ml_meth', ctypes.c_void_p),
- ('ml_flags', ctypes.c_int),
- ('ml_doc', ctypes.c_char_p),
- ]
- PyCFunction_NewEx = ctypes.pythonapi.PyCFunction_NewEx
- PyCFunction_NewEx.argtypes = (ctypes.POINTER(PyMethodDef),
- ctypes.c_void_p,
- ctypes.c_void_p)
- PyCFunction_NewEx.restype = ctypes.py_object
- cache = {} # Unsure if this is necessary to keep the PyMethodDef
- # structures from being garbage collected. Assuming so...
- def pyaddfunc (func_name, func_ptr, func_doc = None):
- global cache
- if bytes != str:
- func_name = bytes(ord(ch) for ch in func_name)
- key = (func_name, func_ptr)
- if key in cache:
- _, ret_val = cache[key]
- else:
- mdef = PyMethodDef(bytes(func_name),
- func_ptr,
- 1, # == METH_VARARGS (hopefully remains so...)
- func_doc)
- ret_val = PyCFunction_NewEx(ctypes.byref(mdef), 0, 0)
- cache[key] = (mdef, ret_val)
- return ret_val
- # ______________________________________________________________________
- # End of pyaddfunc.py