1 /* Convenience functions implemented in Python.
3 Copyright (C) 2008-2014 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__");
180 if (gdbpy_is_string (ds_obj
))
182 docstring
= python_string_to_host_string (ds_obj
);
183 if (docstring
== NULL
)
195 docstring
= xstrdup (_("This function is not documented."));
197 add_internal_function (name
, docstring
, fnpy_call
, self
);
201 /* Initialize internal function support. */
204 gdbpy_initialize_functions (void)
206 fnpy_object_type
.tp_new
= PyType_GenericNew
;
207 if (PyType_Ready (&fnpy_object_type
) < 0)
210 return gdb_pymodule_addobject (gdb_module
, "Function",
211 (PyObject
*) &fnpy_object_type
);
216 static PyTypeObject fnpy_object_type
=
218 PyVarObject_HEAD_INIT (NULL
, 0)
219 "gdb.Function", /*tp_name*/
220 sizeof (PyObject
), /*tp_basicsize*/
229 0, /*tp_as_sequence*/
237 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
, /*tp_flags*/
238 "GDB function object", /* tp_doc */
241 0, /* tp_richcompare */
242 0, /* tp_weaklistoffset */
250 0, /* tp_descr_get */
251 0, /* tp_descr_set */
252 0, /* tp_dictoffset */
253 fnpy_init
, /* tp_init */