/* Convenience functions implemented in Python.
- Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2008-2014 Free Software Foundation, Inc.
This file is part of GDB.
#include "defs.h"
#include "value.h"
-#include "exceptions.h"
#include "python-internal.h"
#include "charset.h"
#include "gdbcmd.h"
#include "expression.h"
#include "language.h"
-static PyTypeObject fnpy_object_type;
+static PyTypeObject fnpy_object_type
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("PyObject");
\f
int i;
PyObject *result = PyTuple_New (argc);
+ if (! result)
+ return NULL;
+
for (i = 0; i < argc; ++i)
{
PyObject *elt = value_to_value_object (argv[i]);
if (! elt)
{
Py_DECREF (result);
- error (_("Could not convert value to Python object."));
+ return NULL;
}
PyTuple_SetItem (result, i, elt);
}
void *cookie, int argc, struct value **argv)
{
struct value *value = NULL;
- PyObject *result, *callable, *args;
+ /* 'result' must be set to NULL, this initially indicates whether
+ the function was called, or not. */
+ PyObject *result = NULL;
+ PyObject *callable, *args;
struct cleanup *cleanup;
cleanup = ensure_python_env (gdbarch, language);
args = convert_values_to_python (argc, argv);
+ /* convert_values_to_python can return NULL on error. If we
+ encounter this, do not call the function, but allow the Python ->
+ error code conversion below to deal with the Python exception.
+ Note, that this is different if the function simply does not
+ have arguments. */
- callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
- if (! callable)
+ if (args)
{
+ callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
+ if (! callable)
+ {
+ Py_DECREF (args);
+ error (_("No method named 'invoke' in object."));
+ }
+
+ result = PyObject_Call (callable, args, NULL);
+ Py_DECREF (callable);
Py_DECREF (args);
- error (_("No method named 'invoke' in object."));
}
- result = PyObject_Call (callable, args, NULL);
- Py_DECREF (callable);
- Py_DECREF (args);
-
if (!result)
{
PyObject *ptype, *pvalue, *ptraceback;
if (PyObject_HasAttrString (self, "__doc__"))
{
PyObject *ds_obj = PyObject_GetAttrString (self, "__doc__");
- if (ds_obj && gdbpy_is_string (ds_obj))
+ if (ds_obj != NULL)
{
- docstring = python_string_to_host_string (ds_obj);
- if (docstring == NULL)
+ if (gdbpy_is_string (ds_obj))
{
- Py_DECREF (self);
- return -1;
+ docstring = python_string_to_host_string (ds_obj);
+ if (docstring == NULL)
+ {
+ Py_DECREF (self);
+ Py_DECREF (ds_obj);
+ return -1;
+ }
}
+
+ Py_DECREF (ds_obj);
}
}
if (! docstring)
/* Initialize internal function support. */
-void
+int
gdbpy_initialize_functions (void)
{
+ fnpy_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&fnpy_object_type) < 0)
- return;
+ return -1;
- Py_INCREF (&fnpy_object_type);
- PyModule_AddObject (gdb_module, "Function", (PyObject *) &fnpy_object_type);
+ return gdb_pymodule_addobject (gdb_module, "Function",
+ (PyObject *) &fnpy_object_type);
}
\f
static PyTypeObject fnpy_object_type =
{
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
+ PyVarObject_HEAD_INIT (NULL, 0)
"gdb.Function", /*tp_name*/
sizeof (PyObject), /*tp_basicsize*/
0, /*tp_itemsize*/
0, /* tp_dictoffset */
fnpy_init, /* tp_init */
0, /* tp_alloc */
- PyType_GenericNew /* tp_new */
};