/* * 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 (JCCEnv::pythonError) { \ return NULL; \ } catch (JCCEnv::exception e) { \ return PyErr_SetJavaError(e.throwable); \ } \ } #define INT_CALL(action) \ { \ try { \ PythonThreadState state(1); \ action; \ } catch (JCCEnv::pythonError) { \ return -1; \ } catch (JCCEnv::exception e) { \ PyErr_SetJavaError(e.throwable); \ return -1; \ } \ } #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 } #define DECLARE_TYPE(name, t_name, base, javaClass, \ init, iter, iternext, getset, mapping, sequence) \ PyTypeObject name##$$Type = { \ PyObject_HEAD_INIT(NULL) \ /* ob_size */ 0, \ /* tp_name */ #name, \ /* tp_basicsize */ sizeof(t_name), \ /* tp_itemsize */ 0, \ /* tp_dealloc */ 0, \ /* tp_print */ 0, \ /* tp_getattr */ 0, \ /* tp_setattr */ 0, \ /* tp_compare */ 0, \ /* tp_repr */ 0, \ /* tp_as_number */ 0, \ /* tp_as_sequence */ sequence, \ /* tp_as_mapping */ mapping, \ /* tp_hash */ 0, \ /* tp_call */ 0, \ /* tp_str */ 0, \ /* tp_getattro */ 0, \ /* tp_setattro */ 0, \ /* tp_as_buffer */ 0, \ /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, \ /* tp_doc */ #t_name" objects", \ /* tp_traverse */ 0, \ /* tp_clear */ 0, \ /* tp_richcompare */ 0, \ /* tp_weaklistoffset */ 0, \ /* tp_iter */ (getiterfunc) iter, \ /* tp_iternext */ (iternextfunc) iternext, \ /* tp_methods */ t_name##__methods_, \ /* tp_members */ 0, \ /* tp_getset */ getset, \ /* tp_base */ &base##$$Type, \ /* tp_dict */ 0, \ /* tp_descr_get */ 0, \ /* tp_descr_set */ 0, \ /* tp_dictoffset */ 0, \ /* tp_init */ (initproc)init, \ /* tp_alloc */ 0, \ /* tp_new */ 0, \ }; \ PyObject *t_name::wrap_Object(const javaClass& object) \ { \ if (!!object) \ { \ t_name *self = \ (t_name *) name##$$Type.tp_alloc(&name##$$Type, 0); \ if (self) \ self->object = object; \ return (PyObject *) self; \ } \ Py_RETURN_NONE; \ } \ PyObject *t_name::wrap_jobject(const jobject& object) \ { \ if (!!object) \ { \ t_name *self = \ (t_name *) name##$$Type.tp_alloc(&name##$$Type, 0); \ if (self) \ self->object = javaClass(object); \ return (PyObject *) self; \ } \ Py_RETURN_NONE; \ } \ #define INSTALL_TYPE(name, module) \ if (PyType_Ready(&name##$$Type) == 0) \ { \ Py_INCREF(&name##$$Type); \ PyModule_AddObject(module, #name, (PyObject *) &name##$$Type); \ } #define Py_RETURN_BOOL(b) \ { \ if (b) \ Py_RETURN_TRUE; \ else \ Py_RETURN_FALSE; \ } #if PY_VERSION_HEX < 0x02040000 #define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None #define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True #define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False #define Py_CLEAR(op) \ do { \ if (op) { \ PyObject *tmp = (PyObject *)(op); \ (op) = NULL; \ Py_DECREF(tmp); \ } \ } while (0) #define Py_VISIT(op) \ do { \ if (op) { \ int vret = visit((PyObject *)(op), arg); \ if (vret) \ return vret; \ } \ } while (0) #endif /* Python 2.3.5 */ #endif /* _macros_H */