Files
gnatstudio/python/src/python_support.c
Emmanuel Briot b193f870da Various changes to the functions so that we support both Classes and
"new-style" classes of Python (aka objects deriving from the object class)


git-svn-id: svn+ssh://svn.eu/Dev/importfromcvs/trunk@92639 936e1b1b-40f2-da11-902a-00137254ae57
2005-07-08 08:27:01 +00:00

268 lines
6.6 KiB
C
Executable File

/*-------------------------------------------------------------------
G P S --
--
Copyright (C) 2003 --
ACT-Europe --
--
GPS is free software; you can redistribute it and/or modify it --
under the terms of the GNU General Public License as published by --
the Free Software Foundation; either version 2 of the License, or --
(at your option) any later version. --
--
This program is distributed in the hope that it will be useful, --
but WITHOUT ANY WARRANTY; without even the implied warranty of --
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
General Public License for more details. You should have received --
a copy of the GNU General Public License along with this library; --
if not, write to the Free Software Foundation, Inc., 59 Temple --
Place - Suite 330, Boston, MA 02111-1307, USA. --
---------------------------------------------------------------------*/
#include <Python.h>
#include <gtk/gtk.h>
#undef DEBUG
// #define DEBUG
PyObject * ada_Py_InitModule4
(char *name, PyMethodDef *methods,
char *doc, PyObject *self,
int apiver)
{
return Py_InitModule4 (name, methods, doc, self, apiver);
}
PyObject * ada_pycfunction_newex (PyMethodDef *ml, PyObject* self, PyObject* module) {
PyObject* method = PyCFunction_New (ml, self);
#if (PY_MAJOR_VERSION > 2 \
|| (PY_MAJOR_VERSION == 2 \
&& (PY_MINOR_VERSION > 3 \
|| (PY_MINOR_VERSION == 3 \
&& PY_MICRO_VERSION >= 3))))
((PyCFunctionObject*)method)->m_module = module;
Py_XINCREF (module);
#endif
return method;
}
int ada_pyget_refcount (PyObject* obj) {
return obj->ob_refcnt;
}
void ada_py_print_refcount (PyObject* obj, char* msg) {
if (obj) {
printf ("DEBUG %s obj=%p (%s) refcont=%d\n",
msg, obj, obj->ob_type->tp_name, obj->ob_refcnt);
}
}
void ada_py_incref (PyObject* obj) {
Py_INCREF (obj);
#ifdef DEBUG
ada_py_print_refcount (obj, "after incref");
#endif
}
void ada_py_decref (PyObject* obj) {
#ifdef DEBUG
ada_py_print_refcount (obj, "before decref");
#endif
Py_DECREF (obj);
}
void ada_py_xincref (PyObject* obj) {
Py_XINCREF (obj);
#ifdef DEBUG
ada_py_print_refcount (obj, "after xincref");
#endif
}
void ada_py_xdecref (PyObject* obj) {
#ifdef DEBUG
ada_py_print_refcount (obj, "before xdecref");
#endif
Py_XDECREF (obj);
}
int ada_pystring_check (PyObject* obj) {
return PyString_Check (obj);
}
int ada_pyint_check (PyObject* obj) {
return PyInt_Check (obj);
}
int ada_pyfunction_check (PyObject* obj) {
return PyFunction_Check (obj);
}
PyObject* ada_pyfunction_get_globals (PyObject* obj) {
return PyFunction_GET_GLOBALS (obj);
}
PyObject* ada_pyfunction_get_code (PyObject* obj) {
return PyFunction_GET_CODE (obj);
}
PyObject* ada_pyfunction_get_closure (PyObject* obj) {
return PyFunction_GET_CLOSURE (obj);
}
PyObject* ada_pyfunction_get_defaults (PyObject* obj) {
return PyFunction_GET_DEFAULTS (obj);
}
PyObject* ada_PyEval_EvalCodeEx
(PyObject *co,
PyObject *globals,
PyObject *locals,
PyObject *args,
PyObject *kwds,
PyObject *defs,
PyObject *closure)
{
PyObject **k, **d;
PyObject* result;
int nk, nd;
if (defs != NULL && PyTuple_Check(defs)) {
d = &PyTuple_GET_ITEM((PyTupleObject *)defs, 0);
nd = PyTuple_Size(defs);
} else {
d = NULL;
nd = 0;
}
if (kwds != NULL && PyDict_Check(kwds)) {
int pos, i;
nk = PyDict_Size(kwds);
k = PyMem_NEW(PyObject *, 2*nk);
if (k == NULL) {
PyErr_NoMemory();
return NULL;
}
pos = i = 0;
while (PyDict_Next(kwds, &pos, &k[i], &k[i+1]))
i += 2;
nk = i/2;
/* XXX This is broken if the caller deletes dict items! */
} else {
k = NULL;
nk = 0;
}
result = (PyObject*) PyEval_EvalCodeEx
((PyCodeObject*)co, globals, locals,
&PyTuple_GET_ITEM (args, 0), PyTuple_Size (args), k, nk, d, nd, closure);
if (k != NULL) {
PyMem_DEL (k);
}
return result;
}
/*
PyObject* ada_py_object_new (PyObject* base)
{
if (PyClass_Check (base)) {
return PyInstance_NewRaw (base, NULL);
} else {
if (base->ob_type->tp_new != NULL) {
Py_INCREF (Py_None);
Py_INCREF (Py_None);
return base->ob_type->tp_new (base->ob_type, Py_None, Py_None);
} else {
return NULL;
}
}
}
*/
int ada_pycobject_check (PyObject* obj) {
return PyCObject_Check (obj);
}
int ada_pytuple_check (PyObject* obj) {
return PyTuple_Check (obj);
}
int ada_pylist_check (PyObject* obj) {
return PyList_Check (obj);
}
int ada_pyinstance_check (PyObject* obj) {
return PyInstance_Check (obj);
}
int ada_pymethod_check (PyObject* obj) {
return PyMethod_Check (obj);
}
PyTypeObject* ada_gettypeobject (PyObject* obj) {
return (PyTypeObject*)(obj->ob_type);
}
int ada_python_api_version () {
return PYTHON_API_VERSION;
}
PyObject* ada_py_none () {
return Py_None;
}
PyObject* ada_py_false() {
return Py_False;
}
PyObject* ada_py_true() {
return Py_True;
}
PyObject* ada_pyclass_name(PyObject* obj) {
if (PyClass_Check (obj)) {
return ((PyClassObject*)obj)->cl_name;
} else {
/* Derives from object, not a real class */
return PyObject_GetAttrString (obj, "__name__");
}
}
int ada_pyclass_is_subclass (PyObject* class, PyObject* base)
{
if (PyClass_Check (class)) {
return PyClass_IsSubclass (class, base);
} else {
return PyObject_TypeCheck (class, base->ob_type);
}
}
/******************************************************
Support for pygtk
The code below is duplicated from pygobject.h. However,
since we do not want to depend on the latter when compiling
GPS, we have simply copied it here. This means that we
might not be compatible with pygtk for ever. This was
tested with pygtk 2.4 and 2.6
*******************************************************/
typedef struct {
PyObject_HEAD
GObject *obj;
} LocalPyGObject;
GObject* ada_widget_from_pyobject (PyObject* object) {
return ((LocalPyGObject*)object)->obj;
}
PyObject* ada_pyobject_from_widget (GObject* object) {
return NULL;
// ??? Not integrated yet, since this would mean we need the pygtk
// sources around to compile GPS itself, which we do not want
// return pygobject_new (object);
}