Repository URL to install this package:
|
Version:
3.5 ▾
|
/*
* 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.
*/
#ifndef _macros_H
#define _macros_H
#define OBJ_CALL(action) \
{ \
try { \
PythonThreadState state(1); \
action; \
} catch (int e) { \
switch (e) { \
case _EXC_PYTHON: \
return NULL; \
case _EXC_JAVA: \
return PyErr_SetJavaError(); \
default: \
throw; \
} \
} \
}
#define INT_CALL(action) \
{ \
try { \
PythonThreadState state(1); \
action; \
} catch (int e) { \
switch (e) { \
case _EXC_PYTHON: \
return -1; \
case _EXC_JAVA: \
PyErr_SetJavaError(); \
return -1; \
default: \
throw; \
} \
} \
}
#define DECLARE_METHOD(type, name, flags) \
{ #name, (PyCFunction) type##_##name, flags, "" }
#define DECLARE_GET_FIELD(type, name) \
{ #name, (getter) type##_get__##name, NULL, "", NULL }
#define DECLARE_SET_FIELD(type, name) \
{ #name, NULL, (setter) type##_set__##name, "", NULL }
#define DECLARE_GETSET_FIELD(type, name) \
{ #name, (getter) type##_get__##name, (setter) type##_set__##name, "", NULL }
struct PyType_Def {
PyType_Spec spec;
PyTypeObject *type;
PyType_Def **bases; // NULL terminated array
};
#define PY_TYPE(name) name##$$Type
#define PY_TYPE_DEF(name) name##$$TypeDef
#define PY_TYPE_BASES(name) name##$$TypeBases
#define PY_TYPE_SLOTS(name) name##$$TypeSlots
#define DEFINE_TYPE(name, t_name, javaClass) \
PyType_Def PY_TYPE_DEF(name) = { \
{ \
#name, \
sizeof(t_name), \
0, \
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, \
PY_TYPE_SLOTS(name) \
}, \
NULL, \
PY_TYPE_BASES(name), \
}; \
PyTypeObject *PY_TYPE(name) = NULL; \
PyObject *t_name::wrap_Object(const javaClass& object) \
{ \
if (!!object) \
{ \
t_name *self = (t_name *) \
PyType_GenericAlloc(PY_TYPE(name), 0); \
if (self) \
self->object = object; \
return (PyObject *) self; \
} \
Py_RETURN_NONE; \
} \
PyObject *t_name::wrap_jobject(const jobject& object) \
{ \
if (!!object) \
{ \
if (!env->isInstanceOf(object, javaClass::initializeClass)) \
{ \
PyErr_SetObject(PyExc_TypeError, \
(PyObject *) PY_TYPE(name)); \
return NULL; \
} \
t_name *self = (t_name *) \
PyType_GenericAlloc(PY_TYPE(name), 0); \
if (self) \
self->object = javaClass(object); \
return (PyObject *) self; \
} \
Py_RETURN_NONE; \
} \
#define DECLARE_TYPE(name) \
extern PyType_Def PY_TYPE_DEF(name); \
extern PyTypeObject *PY_TYPE(name)
#define INSTALL_TYPE(name, module) \
installType(&PY_TYPE(name), &PY_TYPE_DEF(name), module, #name, 0)
#define INSTALL_STATIC_TYPE(name, module) \
if (PyType_Ready(PY_TYPE(name)) == 0) \
{ \
Py_INCREF(PY_TYPE(name)); \
PyModule_AddObject(module, #name, (PyObject *) PY_TYPE(name)); \
}
#define Py_RETURN_BOOL(b) \
{ \
if (b) \
Py_RETURN_TRUE; \
else \
Py_RETURN_FALSE; \
}
#define Py_RETURN_SELF \
{ \
Py_INCREF(self); \
return (PyObject *) self; \
}
#endif /* _macros_H */