| #define _CFFI_ | |
| /* We try to define Py_LIMITED_API before including Python.h. | |
| Mess: we can only define it if Py_DEBUG, Py_TRACE_REFS and | |
| Py_REF_DEBUG are not defined. This is a best-effort approximation: | |
| we can learn about Py_DEBUG from pyconfig.h, but it is unclear if | |
| the same works for the other two macros. Py_DEBUG implies them, | |
| but not the other way around. | |
| Issue #350 is still open: on Windows, the code here causes it to link | |
| with PYTHON36.DLL (for example) instead of PYTHON3.DLL. A fix was | |
| attempted in 164e526a5515 and 14ce6985e1c3, but reverted: virtualenv | |
| does not make PYTHON3.DLL available, and so the "correctly" compiled | |
| version would not run inside a virtualenv. We will re-apply the fix | |
| after virtualenv has been fixed for some time. For explanation, see | |
| issue #355. For a workaround if you want PYTHON3.DLL and don't worry | |
| about virtualenv, see issue #350. See also 'py_limited_api' in | |
| setuptools_ext.py. | |
| */ | |
| #if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API) | |
| # include <pyconfig.h> | |
| # if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) | |
| # define Py_LIMITED_API | |
| # endif | |
| #endif | |
| #include <Python.h> | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| #include <stddef.h> | |
| #include "parse_c_type.h" | |
| /* this block of #ifs should be kept exactly identical between | |
| c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py | |
| and cffi/_cffi_include.h */ | |
| #if defined(_MSC_VER) | |
| # include <malloc.h> /* for alloca() */ | |
| # if _MSC_VER < 1600 /* MSVC < 2010 */ | |
| 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 /* MSVC < 2013 */ | |
| # ifndef __cplusplus | |
| typedef unsigned char _Bool; | |
| # endif | |
| # endif | |
| #else | |
| # include <stdint.h> | |
| # if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) | |
| # include <alloca.h> | |
| # endif | |
| #endif | |
| #ifdef __GNUC__ | |
| # define _CFFI_UNUSED_FN __attribute__((unused)) | |
| #else | |
| # define _CFFI_UNUSED_FN /* nothing */ | |
| #endif | |
| #ifdef __cplusplus | |
| # ifndef _Bool | |
| typedef bool _Bool; /* semi-hackish: C++ has no _Bool; bool is builtin */ | |
| # endif | |
| #endif | |
| /********** CPython-specific section **********/ | |
| #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 ? /* unsigned */ \ | |
| (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; /* same random pick as _cffi_backend.c */ | |
| #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(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(x); | |
| } | |
| /********** end CPython-specific section **********/ | |
| #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 /* nothing */ | |
| #endif | |
| #ifdef __cplusplus | |
| } | |
| #endif |