|
#define _CFFI_ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API) |
|
# ifdef _MSC_VER |
|
# if !defined(_DEBUG) && !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API) |
|
# define Py_LIMITED_API |
|
# endif |
|
# include <pyconfig.h> |
|
|
|
|
|
|
|
|
|
# ifdef Py_LIMITED_API |
|
# if defined(Py_DEBUG) |
|
# error "pyconfig.h unexpectedly defines Py_DEBUG, but Py_LIMITED_API is set" |
|
# endif |
|
# if defined(Py_TRACE_REFS) |
|
# error "pyconfig.h unexpectedly defines Py_TRACE_REFS, but Py_LIMITED_API is set" |
|
# endif |
|
# if defined(Py_REF_DEBUG) |
|
# error "pyconfig.h unexpectedly defines Py_REF_DEBUG, but Py_LIMITED_API is set" |
|
# endif |
|
# endif |
|
# else |
|
# include <pyconfig.h> |
|
# if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API) |
|
# define Py_LIMITED_API |
|
# endif |
|
# endif |
|
#endif |
|
|
|
#include <Python.h> |
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
#include <stddef.h> |
|
#include "parse_c_type.h" |
|
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) |
|
# include <malloc.h> |
|
# if _MSC_VER < 1600 |
|
typedef __int8 int8_t; |
|
typedef __int16 int16_t; |
|
typedef __int32 int32_t; |
|
typedef __int64 int64_t; |
|
typedef unsigned __int8 uint8_t; |
|
typedef unsigned __int16 uint16_t; |
|
typedef unsigned __int32 uint32_t; |
|
typedef unsigned __int64 uint64_t; |
|
typedef __int8 int_least8_t; |
|
typedef __int16 int_least16_t; |
|
typedef __int32 int_least32_t; |
|
typedef __int64 int_least64_t; |
|
typedef unsigned __int8 uint_least8_t; |
|
typedef unsigned __int16 uint_least16_t; |
|
typedef unsigned __int32 uint_least32_t; |
|
typedef unsigned __int64 uint_least64_t; |
|
typedef __int8 int_fast8_t; |
|
typedef __int16 int_fast16_t; |
|
typedef __int32 int_fast32_t; |
|
typedef __int64 int_fast64_t; |
|
typedef unsigned __int8 uint_fast8_t; |
|
typedef unsigned __int16 uint_fast16_t; |
|
typedef unsigned __int32 uint_fast32_t; |
|
typedef unsigned __int64 uint_fast64_t; |
|
typedef __int64 intmax_t; |
|
typedef unsigned __int64 uintmax_t; |
|
# else |
|
# include <stdint.h> |
|
# endif |
|
# if _MSC_VER < 1800 |
|
# ifndef __cplusplus |
|
typedef unsigned char _Bool; |
|
# endif |
|
# endif |
|
# define _cffi_float_complex_t _Fcomplex |
|
# define _cffi_double_complex_t _Dcomplex |
|
#else |
|
# include <stdint.h> |
|
# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) |
|
# include <alloca.h> |
|
# endif |
|
# define _cffi_float_complex_t float _Complex |
|
# define _cffi_double_complex_t double _Complex |
|
#endif |
|
|
|
#ifdef __GNUC__ |
|
# define _CFFI_UNUSED_FN __attribute__((unused)) |
|
#else |
|
# define _CFFI_UNUSED_FN |
|
#endif |
|
|
|
#ifdef __cplusplus |
|
# ifndef _Bool |
|
typedef bool _Bool; |
|
# endif |
|
#endif |
|
|
|
|
|
#ifndef PYPY_VERSION |
|
|
|
|
|
#if PY_MAJOR_VERSION >= 3 |
|
# define PyInt_FromLong PyLong_FromLong |
|
#endif |
|
|
|
#define _cffi_from_c_double PyFloat_FromDouble |
|
#define _cffi_from_c_float PyFloat_FromDouble |
|
#define _cffi_from_c_long PyInt_FromLong |
|
#define _cffi_from_c_ulong PyLong_FromUnsignedLong |
|
#define _cffi_from_c_longlong PyLong_FromLongLong |
|
#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong |
|
#define _cffi_from_c__Bool PyBool_FromLong |
|
|
|
#define _cffi_to_c_double PyFloat_AsDouble |
|
#define _cffi_to_c_float PyFloat_AsDouble |
|
|
|
#define _cffi_from_c_int(x, type) \ |
|
(((type)-1) > 0 ? \ |
|
(sizeof(type) < sizeof(long) ? \ |
|
PyInt_FromLong((long)x) : \ |
|
sizeof(type) == sizeof(long) ? \ |
|
PyLong_FromUnsignedLong((unsigned long)x) : \ |
|
PyLong_FromUnsignedLongLong((unsigned long long)x)) : \ |
|
(sizeof(type) <= sizeof(long) ? \ |
|
PyInt_FromLong((long)x) : \ |
|
PyLong_FromLongLong((long long)x))) |
|
|
|
#define _cffi_to_c_int(o, type) \ |
|
((type)( \ |
|
sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \ |
|
: (type)_cffi_to_c_i8(o)) : \ |
|
sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \ |
|
: (type)_cffi_to_c_i16(o)) : \ |
|
sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \ |
|
: (type)_cffi_to_c_i32(o)) : \ |
|
sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \ |
|
: (type)_cffi_to_c_i64(o)) : \ |
|
(Py_FatalError("unsupported size for type " #type), (type)0))) |
|
|
|
#define _cffi_to_c_i8 \ |
|
((int(*)(PyObject *))_cffi_exports[1]) |
|
#define _cffi_to_c_u8 \ |
|
((int(*)(PyObject *))_cffi_exports[2]) |
|
#define _cffi_to_c_i16 \ |
|
((int(*)(PyObject *))_cffi_exports[3]) |
|
#define _cffi_to_c_u16 \ |
|
((int(*)(PyObject *))_cffi_exports[4]) |
|
#define _cffi_to_c_i32 \ |
|
((int(*)(PyObject *))_cffi_exports[5]) |
|
#define _cffi_to_c_u32 \ |
|
((unsigned int(*)(PyObject *))_cffi_exports[6]) |
|
#define _cffi_to_c_i64 \ |
|
((long long(*)(PyObject *))_cffi_exports[7]) |
|
#define _cffi_to_c_u64 \ |
|
((unsigned long long(*)(PyObject *))_cffi_exports[8]) |
|
#define _cffi_to_c_char \ |
|
((int(*)(PyObject *))_cffi_exports[9]) |
|
#define _cffi_from_c_pointer \ |
|
((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[10]) |
|
#define _cffi_to_c_pointer \ |
|
((char *(*)(PyObject *, struct _cffi_ctypedescr *))_cffi_exports[11]) |
|
#define _cffi_get_struct_layout \ |
|
not used any more |
|
#define _cffi_restore_errno \ |
|
((void(*)(void))_cffi_exports[13]) |
|
#define _cffi_save_errno \ |
|
((void(*)(void))_cffi_exports[14]) |
|
#define _cffi_from_c_char \ |
|
((PyObject *(*)(char))_cffi_exports[15]) |
|
#define _cffi_from_c_deref \ |
|
((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[16]) |
|
#define _cffi_to_c \ |
|
((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[17]) |
|
#define _cffi_from_c_struct \ |
|
((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[18]) |
|
#define _cffi_to_c_wchar_t \ |
|
((_cffi_wchar_t(*)(PyObject *))_cffi_exports[19]) |
|
#define _cffi_from_c_wchar_t \ |
|
((PyObject *(*)(_cffi_wchar_t))_cffi_exports[20]) |
|
#define _cffi_to_c_long_double \ |
|
((long double(*)(PyObject *))_cffi_exports[21]) |
|
#define _cffi_to_c__Bool \ |
|
((_Bool(*)(PyObject *))_cffi_exports[22]) |
|
#define _cffi_prepare_pointer_call_argument \ |
|
((Py_ssize_t(*)(struct _cffi_ctypedescr *, \ |
|
PyObject *, char **))_cffi_exports[23]) |
|
#define _cffi_convert_array_from_object \ |
|
((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[24]) |
|
#define _CFFI_CPIDX 25 |
|
#define _cffi_call_python \ |
|
((void(*)(struct _cffi_externpy_s *, char *))_cffi_exports[_CFFI_CPIDX]) |
|
#define _cffi_to_c_wchar3216_t \ |
|
((int(*)(PyObject *))_cffi_exports[26]) |
|
#define _cffi_from_c_wchar3216_t \ |
|
((PyObject *(*)(int))_cffi_exports[27]) |
|
#define _CFFI_NUM_EXPORTS 28 |
|
|
|
struct _cffi_ctypedescr; |
|
|
|
static void *_cffi_exports[_CFFI_NUM_EXPORTS]; |
|
|
|
#define _cffi_type(index) ( \ |
|
assert((((uintptr_t)_cffi_types[index]) & 1) == 0), \ |
|
(struct _cffi_ctypedescr *)_cffi_types[index]) |
|
|
|
static PyObject *_cffi_init(const char *module_name, Py_ssize_t version, |
|
const struct _cffi_type_context_s *ctx) |
|
{ |
|
PyObject *module, *o_arg, *new_module; |
|
void *raw[] = { |
|
(void *)module_name, |
|
(void *)version, |
|
(void *)_cffi_exports, |
|
(void *)ctx, |
|
}; |
|
|
|
module = PyImport_ImportModule("_cffi_backend"); |
|
if (module == NULL) |
|
goto failure; |
|
|
|
o_arg = PyLong_FromVoidPtr((void *)raw); |
|
if (o_arg == NULL) |
|
goto failure; |
|
|
|
new_module = PyObject_CallMethod( |
|
module, (char *)"_init_cffi_1_0_external_module", (char *)"O", o_arg); |
|
|
|
Py_DECREF(o_arg); |
|
Py_DECREF(module); |
|
return new_module; |
|
|
|
failure: |
|
Py_XDECREF(module); |
|
return NULL; |
|
} |
|
|
|
|
|
#ifdef HAVE_WCHAR_H |
|
typedef wchar_t _cffi_wchar_t; |
|
#else |
|
typedef uint16_t _cffi_wchar_t; |
|
#endif |
|
|
|
_CFFI_UNUSED_FN static uint16_t _cffi_to_c_char16_t(PyObject *o) |
|
{ |
|
if (sizeof(_cffi_wchar_t) == 2) |
|
return (uint16_t)_cffi_to_c_wchar_t(o); |
|
else |
|
return (uint16_t)_cffi_to_c_wchar3216_t(o); |
|
} |
|
|
|
_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char16_t(uint16_t x) |
|
{ |
|
if (sizeof(_cffi_wchar_t) == 2) |
|
return _cffi_from_c_wchar_t((_cffi_wchar_t)x); |
|
else |
|
return _cffi_from_c_wchar3216_t((int)x); |
|
} |
|
|
|
_CFFI_UNUSED_FN static int _cffi_to_c_char32_t(PyObject *o) |
|
{ |
|
if (sizeof(_cffi_wchar_t) == 4) |
|
return (int)_cffi_to_c_wchar_t(o); |
|
else |
|
return (int)_cffi_to_c_wchar3216_t(o); |
|
} |
|
|
|
_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(unsigned int x) |
|
{ |
|
if (sizeof(_cffi_wchar_t) == 4) |
|
return _cffi_from_c_wchar_t((_cffi_wchar_t)x); |
|
else |
|
return _cffi_from_c_wchar3216_t((int)x); |
|
} |
|
|
|
union _cffi_union_alignment_u { |
|
unsigned char m_char; |
|
unsigned short m_short; |
|
unsigned int m_int; |
|
unsigned long m_long; |
|
unsigned long long m_longlong; |
|
float m_float; |
|
double m_double; |
|
long double m_longdouble; |
|
}; |
|
|
|
struct _cffi_freeme_s { |
|
struct _cffi_freeme_s *next; |
|
union _cffi_union_alignment_u alignment; |
|
}; |
|
|
|
_CFFI_UNUSED_FN static int |
|
_cffi_convert_array_argument(struct _cffi_ctypedescr *ctptr, PyObject *arg, |
|
char **output_data, Py_ssize_t datasize, |
|
struct _cffi_freeme_s **freeme) |
|
{ |
|
char *p; |
|
if (datasize < 0) |
|
return -1; |
|
|
|
p = *output_data; |
|
if (p == NULL) { |
|
struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc( |
|
offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize); |
|
if (fp == NULL) |
|
return -1; |
|
fp->next = *freeme; |
|
*freeme = fp; |
|
p = *output_data = (char *)&fp->alignment; |
|
} |
|
memset((void *)p, 0, (size_t)datasize); |
|
return _cffi_convert_array_from_object(p, ctptr, arg); |
|
} |
|
|
|
_CFFI_UNUSED_FN static void |
|
_cffi_free_array_arguments(struct _cffi_freeme_s *freeme) |
|
{ |
|
do { |
|
void *p = (void *)freeme; |
|
freeme = freeme->next; |
|
PyObject_Free(p); |
|
} while (freeme != NULL); |
|
} |
|
|
|
|
|
#else |
|
_CFFI_UNUSED_FN |
|
static void (*_cffi_call_python_org)(struct _cffi_externpy_s *, char *); |
|
# define _cffi_call_python _cffi_call_python_org |
|
#endif |
|
|
|
|
|
#define _cffi_array_len(array) (sizeof(array) / sizeof((array)[0])) |
|
|
|
#define _cffi_prim_int(size, sign) \ |
|
((size) == 1 ? ((sign) ? _CFFI_PRIM_INT8 : _CFFI_PRIM_UINT8) : \ |
|
(size) == 2 ? ((sign) ? _CFFI_PRIM_INT16 : _CFFI_PRIM_UINT16) : \ |
|
(size) == 4 ? ((sign) ? _CFFI_PRIM_INT32 : _CFFI_PRIM_UINT32) : \ |
|
(size) == 8 ? ((sign) ? _CFFI_PRIM_INT64 : _CFFI_PRIM_UINT64) : \ |
|
_CFFI__UNKNOWN_PRIM) |
|
|
|
#define _cffi_prim_float(size) \ |
|
((size) == sizeof(float) ? _CFFI_PRIM_FLOAT : \ |
|
(size) == sizeof(double) ? _CFFI_PRIM_DOUBLE : \ |
|
(size) == sizeof(long double) ? _CFFI__UNKNOWN_LONG_DOUBLE : \ |
|
_CFFI__UNKNOWN_FLOAT_PRIM) |
|
|
|
#define _cffi_check_int(got, got_nonpos, expected) \ |
|
((got_nonpos) == (expected <= 0) && \ |
|
(got) == (unsigned long long)expected) |
|
|
|
#ifdef MS_WIN32 |
|
# define _cffi_stdcall __stdcall |
|
#else |
|
# define _cffi_stdcall |
|
#endif |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|