287 lines
8.9 KiB
C
287 lines
8.9 KiB
C
/*
|
|
* Copyright 2006 - 2014
|
|
* Andr\xe9 Malo or his licensors, as applicable
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/*
|
|
* central naming stuff
|
|
*/
|
|
|
|
#ifndef SETUP_CEXT_H
|
|
#define SETUP_CEXT_H
|
|
|
|
#ifndef EXT_MODULE
|
|
#error EXT_MODULE must be defined outside of this file (-DEXT_MODULE=...)
|
|
#endif
|
|
|
|
/*
|
|
* include core header files
|
|
*/
|
|
#define PY_SSIZE_T_CLEAN
|
|
|
|
#include "Python.h"
|
|
#include "structmember.h"
|
|
|
|
/*
|
|
* define our helper macros depending on the stuff above
|
|
*/
|
|
#define STRINGIFY(n) STRINGIFY_HELPER(n)
|
|
#define STRINGIFY_HELPER(n) #n
|
|
#define CONCATENATE(first, second) CONCATENATE_HELPER(first, second)
|
|
#define CONCATENATE_HELPER(first, second) first##second
|
|
|
|
#define EXT_MODULE_NAME STRINGIFY(EXT_MODULE)
|
|
#ifdef EXT_PACKAGE
|
|
#define EXT_PACKAGE_NAME STRINGIFY(EXT_PACKAGE)
|
|
#define EXT_MODULE_PATH EXT_PACKAGE_NAME "." EXT_MODULE_NAME
|
|
#else
|
|
#define EXT_PACKAGE_NAME ""
|
|
#define EXT_MODULE_PATH EXT_MODULE_NAME
|
|
#endif
|
|
|
|
#define EXT_DOCS_VAR CONCATENATE(var, CONCATENATE(EXT_MODULE, __doc__))
|
|
#define EXT_METHODS_VAR CONCATENATE(var, CONCATENATE(EXT_MODULE, _methods))
|
|
#define EXT_METHODS static PyMethodDef EXT_METHODS_VAR[]
|
|
|
|
#define EXT_DEFINE_VAR CONCATENATE(var, CONCATENATE(EXT_MODULE, _module))
|
|
|
|
/* Py3K Support */
|
|
#if PY_MAJOR_VERSION >= 3
|
|
|
|
#define EXT3
|
|
|
|
#ifndef Py_TPFLAGS_HAVE_CLASS
|
|
#define Py_TPFLAGS_HAVE_CLASS (0)
|
|
#endif
|
|
|
|
#ifndef Py_TPFLAGS_HAVE_WEAKREFS
|
|
#define Py_TPFLAGS_HAVE_WEAKREFS (0)
|
|
#endif
|
|
|
|
#ifndef Py_TPFLAGS_HAVE_ITER
|
|
#define Py_TPFLAGS_HAVE_ITER (0)
|
|
#endif
|
|
|
|
#ifndef PyMODINIT_FUNC
|
|
#define EXT_INIT_FUNC PyObject *CONCATENATE(PyInit_, EXT_MODULE)(void)
|
|
#else
|
|
#define EXT_INIT_FUNC PyMODINIT_FUNC CONCATENATE(PyInit_, EXT_MODULE)(void)
|
|
#endif
|
|
|
|
#define EXT_DEFINE(name, methods, doc) \
|
|
static struct PyModuleDef EXT_DEFINE_VAR = { \
|
|
PyModuleDef_HEAD_INIT, \
|
|
name, \
|
|
doc, \
|
|
-1, \
|
|
methods, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL \
|
|
}
|
|
|
|
#define EXT_CREATE(def) (PyModule_Create(def))
|
|
#define EXT_INIT_ERROR(module) do {Py_XDECREF(module); return NULL;} while(0)
|
|
#define EXT_INIT_RETURN(module) return module
|
|
|
|
#define EXT_DOC_UNICODE(m)
|
|
|
|
#else /* end py3k */
|
|
|
|
#define EXT2
|
|
|
|
#ifndef PyVarObject_HEAD_INIT
|
|
#define PyVarObject_HEAD_INIT(type, size) \
|
|
PyObject_HEAD_INIT(type) size,
|
|
#endif
|
|
|
|
#ifndef PyMODINIT_FUNC
|
|
#define EXT_INIT_FUNC void CONCATENATE(init, EXT_MODULE)(void)
|
|
#else
|
|
#define EXT_INIT_FUNC PyMODINIT_FUNC CONCATENATE(init, EXT_MODULE)(void)
|
|
#endif
|
|
|
|
#define EXT_DEFINE__STRUCT \
|
|
CONCATENATE(struct, CONCATENATE(EXT_MODULE, _module))
|
|
|
|
struct EXT_DEFINE__STRUCT {
|
|
char *m_name;
|
|
char *m_doc;
|
|
PyMethodDef *m_methods;
|
|
};
|
|
#define EXT_DEFINE(name, methods, doc) \
|
|
static struct EXT_DEFINE__STRUCT EXT_DEFINE_VAR = { \
|
|
name, \
|
|
doc, \
|
|
methods \
|
|
}
|
|
|
|
#define EXT_CREATE(def) ((def)->m_doc \
|
|
? Py_InitModule3((def)->m_name, (def)->m_methods, (def)->m_doc) \
|
|
: Py_InitModule((def)->m_name, (def)->m_methods) \
|
|
)
|
|
#define EXT_INIT_ERROR(module) return
|
|
#define EXT_INIT_RETURN(module) return
|
|
|
|
#define EXT_DOC_UNICODE(m) do { \
|
|
PyObject *doc__, *uni__; \
|
|
int res__; \
|
|
\
|
|
if ((doc__ = PyObject_GetAttrString(m, "__doc__"))) { \
|
|
uni__ = PyUnicode_FromEncodedObject(doc__, "utf-8", "strict"); \
|
|
Py_DECREF(doc__); \
|
|
if (!uni__) \
|
|
EXT_INIT_ERROR(m); \
|
|
res__ = PyObject_SetAttrString(m, "__doc__", uni__); \
|
|
Py_DECREF(uni__); \
|
|
if (res__ == -1) \
|
|
EXT_INIT_ERROR(m); \
|
|
} \
|
|
else if (!(PyErr_Occurred() \
|
|
&& PyErr_ExceptionMatches(PyExc_AttributeError))) \
|
|
EXT_INIT_ERROR(m); \
|
|
} while(0)
|
|
|
|
#endif /* end py2K */
|
|
|
|
#define EXT_INIT_TYPE(module, type) do { \
|
|
if (PyType_Ready(type) < 0) \
|
|
EXT_INIT_ERROR(module); \
|
|
} while (0)
|
|
|
|
#define EXT_ADD_TYPE(module, name, type) do { \
|
|
Py_INCREF(type); \
|
|
if (PyModule_AddObject(module, name, (PyObject *)(type)) < 0) \
|
|
EXT_INIT_ERROR(module); \
|
|
} while (0)
|
|
|
|
#define EXT_ADD_UNICODE(module, name, string, encoding) do { \
|
|
if (PyModule_AddObject( \
|
|
module, \
|
|
name, \
|
|
PyUnicode_Decode( \
|
|
string, \
|
|
sizeof(string) - 1, \
|
|
encoding, \
|
|
"strict" \
|
|
)) < 0) \
|
|
EXT_INIT_ERROR(module); \
|
|
} while (0)
|
|
|
|
#define EXT_ADD_STRING(module, name, string) do { \
|
|
if (PyModule_AddStringConstant(module, name, string) < 0) \
|
|
EXT_INIT_ERROR(module); \
|
|
} while (0)
|
|
|
|
#define EXT_ADD_INT(module, name, number) do { \
|
|
if (PyModule_AddIntConstant(module, name, number) < 0) \
|
|
EXT_INIT_ERROR(module); \
|
|
} while (0)
|
|
|
|
|
|
/* PEP 353 support, implemented as of python 2.5 */
|
|
#if PY_VERSION_HEX < 0x02050000
|
|
typedef int Py_ssize_t;
|
|
#define PyInt_FromSsize_t(arg) PyInt_FromLong((long)arg)
|
|
#define PyInt_AsSsize_t(arg) (int)PyInt_AsLong(arg)
|
|
#define PY_SSIZE_T_MAX ((Py_ssize_t)INT_MAX)
|
|
#endif
|
|
|
|
/*
|
|
* some helper macros (Python 2.4)
|
|
*/
|
|
#ifndef Py_VISIT
|
|
#define Py_VISIT(op) do { \
|
|
if (op) { \
|
|
int vret = visit((op), arg); \
|
|
if (vret) return vret; \
|
|
} \
|
|
} while (0)
|
|
#endif
|
|
|
|
#ifdef Py_CLEAR
|
|
#undef Py_CLEAR
|
|
#endif
|
|
#define Py_CLEAR(op) do { \
|
|
if (op) { \
|
|
PyObject *tmp__ = (PyObject *)(op); \
|
|
(op) = NULL; \
|
|
Py_DECREF(tmp__); \
|
|
} \
|
|
} while (0)
|
|
|
|
#ifndef Py_RETURN_NONE
|
|
#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
|
|
#endif
|
|
|
|
#ifndef Py_RETURN_FALSE
|
|
#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
|
|
#endif
|
|
|
|
#ifndef Py_RETURN_TRUE
|
|
#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
|
|
#endif
|
|
|
|
/* Macros for inline documentation. (Python 2.3) */
|
|
#ifndef PyDoc_VAR
|
|
#define PyDoc_VAR(name) static char name[]
|
|
#endif
|
|
|
|
#ifndef PyDoc_STRVAR
|
|
#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
|
|
#endif
|
|
|
|
#ifndef PyDoc_STR
|
|
#ifdef WITH_DOC_STRINGS
|
|
#define PyDoc_STR(str) str
|
|
#else
|
|
#define PyDoc_STR(str) ""
|
|
#endif
|
|
#endif
|
|
|
|
/* Basestring check (basestring introduced in Python 2.3) */
|
|
#if PY_VERSION_HEX < 0x02030000
|
|
#define BaseString_Check(type) ( \
|
|
PyObject_TypeCheck((type), &PyString_Type) \
|
|
|| PyObject_TypeCheck((type), &PyUnicode_Type) \
|
|
)
|
|
#else
|
|
#define BaseString_Check(type) PyObject_TypeCheck((type), &PyBaseString_Type)
|
|
#endif
|
|
|
|
#define GENERIC_ALLOC(type) \
|
|
((void *)((PyTypeObject *)type)->tp_alloc(type, (Py_ssize_t)0))
|
|
|
|
/* PyPy doesn't define it */
|
|
#ifndef PyType_IS_GC
|
|
#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC)
|
|
#endif
|
|
|
|
#ifndef Py_TYPE
|
|
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
|
|
#endif
|
|
|
|
#define DEFINE_GENERIC_DEALLOC(prefix) \
|
|
static void prefix##_dealloc(void *self) \
|
|
{ \
|
|
if (PyType_IS_GC(Py_TYPE(self))) \
|
|
PyObject_GC_UnTrack(self); \
|
|
(void)prefix##_clear(self); \
|
|
(Py_TYPE(self))->tp_free((PyObject *)self); \
|
|
}
|
|
|
|
#endif /* SETUP_CEXT_H */
|