1 /* Convenience functions implemented in Python.
3 Copyright (C) 2008-2013 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "exceptions.h"
24 #include "python-internal.h"
27 #include "cli/cli-decode.h"
28 #include "completer.h"
29 #include "expression.h"
32 static PyTypeObject fnpy_object_type
33 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("PyObject");
38 convert_values_to_python (int argc
, struct value
**argv
)
41 PyObject
*result
= PyTuple_New (argc
);
46 for (i
= 0; i
< argc
; ++i
)
48 PyObject
*elt
= value_to_value_object (argv
[i
]);
54 PyTuple_SetItem (result
, i
, elt
);
59 /* Call a Python function object's invoke method. */
62 fnpy_call (struct gdbarch
*gdbarch
, const struct language_defn
*language
,
63 void *cookie
, int argc
, struct value
**argv
)
65 struct value
*value
= NULL
;
66 /* 'result' must be set to NULL, this initially indicates whether
67 the function was called, or not. */
68 PyObject
*result
= NULL
;
69 PyObject
*callable
, *args
;
70 struct cleanup
*cleanup
;
72 cleanup
= ensure_python_env (gdbarch
, language
);
74 args
= convert_values_to_python (argc
, argv
);
75 /* convert_values_to_python can return NULL on error. If we
76 encounter this, do not call the function, but allow the Python ->
77 error code conversion below to deal with the Python exception.
78 Note, that this is different if the function simply does not
83 callable
= PyObject_GetAttrString ((PyObject
*) cookie
, "invoke");
87 error (_("No method named 'invoke' in object."));
90 result
= PyObject_Call (callable
, args
, NULL
);
97 PyObject
*ptype
, *pvalue
, *ptraceback
;
100 PyErr_Fetch (&ptype
, &pvalue
, &ptraceback
);
102 /* Try to fetch an error message contained within ptype, pvalue.
103 When fetching the error message we need to make our own copy,
104 we no longer own ptype, pvalue after the call to PyErr_Restore. */
106 msg
= gdbpy_exception_to_string (ptype
, pvalue
);
107 make_cleanup (xfree
, msg
);
111 /* An error occurred computing the string representation of the
112 error message. This is rare, but we should inform the user. */
114 printf_filtered (_("An error occurred in a Python "
115 "convenience function\n"
116 "and then another occurred computing the "
117 "error message.\n"));
118 gdbpy_print_stack ();
121 /* Don't print the stack for gdb.GdbError exceptions.
122 It is generally used to flag user errors.
124 We also don't want to print "Error occurred in Python command"
125 for user errors. However, a missing message for gdb.GdbError
126 exceptions is arguably a bug, so we flag it as such. */
128 if (!PyErr_GivenExceptionMatches (ptype
, gdbpy_gdberror_exc
)
129 || msg
== NULL
|| *msg
== '\0')
131 PyErr_Restore (ptype
, pvalue
, ptraceback
);
132 gdbpy_print_stack ();
133 if (msg
!= NULL
&& *msg
!= '\0')
134 error (_("Error occurred in Python convenience function: %s"),
137 error (_("Error occurred in Python convenience function."));
143 Py_XDECREF (ptraceback
);
148 value
= convert_value_from_python (result
);
152 gdbpy_print_stack ();
153 error (_("Error while executing Python code."));
157 do_cleanups (cleanup
);
162 /* Initializer for a Function object. It takes one argument, the name
166 fnpy_init (PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
169 char *docstring
= NULL
;
171 if (! PyArg_ParseTuple (args
, "s", &name
))
175 if (PyObject_HasAttrString (self
, "__doc__"))
177 PyObject
*ds_obj
= PyObject_GetAttrString (self
, "__doc__");
178 if (ds_obj
&& gdbpy_is_string (ds_obj
))
180 docstring
= python_string_to_host_string (ds_obj
);
181 if (docstring
== NULL
)
189 docstring
= xstrdup (_("This function is not documented."));
191 add_internal_function (name
, docstring
, fnpy_call
, self
);
195 /* Initialize internal function support. */
198 gdbpy_initialize_functions (void)
200 fnpy_object_type
.tp_new
= PyType_GenericNew
;
201 if (PyType_Ready (&fnpy_object_type
) < 0)
204 Py_INCREF (&fnpy_object_type
);
205 PyModule_AddObject (gdb_module
, "Function", (PyObject
*) &fnpy_object_type
);
210 static PyTypeObject fnpy_object_type
=
212 PyVarObject_HEAD_INIT (NULL
, 0)
213 "gdb.Function", /*tp_name*/
214 sizeof (PyObject
), /*tp_basicsize*/
223 0, /*tp_as_sequence*/
231 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
, /*tp_flags*/
232 "GDB function object", /* tp_doc */
235 0, /* tp_richcompare */
236 0, /* tp_weaklistoffset */
244 0, /* tp_descr_get */
245 0, /* tp_descr_set */
246 0, /* tp_dictoffset */
247 fnpy_init
, /* tp_init */