]> Git Repo - binutils.git/blob - gdb/python/py-function.c
* python/py-arch.c (arch_object_type): Use
[binutils.git] / gdb / python / py-function.c
1 /* Convenience functions implemented in Python.
2
3    Copyright (C) 2008-2013 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
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.
11
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.
16
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/>.  */
19
20
21 #include "defs.h"
22 #include "value.h"
23 #include "exceptions.h"
24 #include "python-internal.h"
25 #include "charset.h"
26 #include "gdbcmd.h"
27 #include "cli/cli-decode.h"
28 #include "completer.h"
29 #include "expression.h"
30 #include "language.h"
31
32 static PyTypeObject fnpy_object_type
33     CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("PyObject");
34
35 \f
36
37 static PyObject *
38 convert_values_to_python (int argc, struct value **argv)
39 {
40   int i;
41   PyObject *result = PyTuple_New (argc);
42   
43   if (! result)
44     return NULL;
45
46   for (i = 0; i < argc; ++i)
47     {
48       PyObject *elt = value_to_value_object (argv[i]);
49       if (! elt)
50         {
51           Py_DECREF (result);
52           return NULL;
53         }
54       PyTuple_SetItem (result, i, elt);
55     }
56   return result;
57 }
58
59 /* Call a Python function object's invoke method.  */
60
61 static struct value *
62 fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language,
63            void *cookie, int argc, struct value **argv)
64 {
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;
71
72   cleanup = ensure_python_env (gdbarch, language);
73
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
79      have arguments.  */
80
81   if (args)
82     {
83       callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
84       if (! callable)
85         {
86           Py_DECREF (args);
87           error (_("No method named 'invoke' in object."));
88         }
89
90       result = PyObject_Call (callable, args, NULL);
91       Py_DECREF (callable);
92       Py_DECREF (args);
93     }
94
95   if (!result)
96     {
97       PyObject *ptype, *pvalue, *ptraceback;
98       char *msg;
99
100       PyErr_Fetch (&ptype, &pvalue, &ptraceback);
101
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.  */
105
106       msg = gdbpy_exception_to_string (ptype, pvalue);
107       make_cleanup (xfree, msg);
108
109       if (msg == NULL)
110         {
111           /* An error occurred computing the string representation of the
112              error message.  This is rare, but we should inform the user.  */
113
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 ();
119         }
120
121       /* Don't print the stack for gdb.GdbError exceptions.
122          It is generally used to flag user errors.
123
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.  */
127
128       if (!PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc)
129           || msg == NULL || *msg == '\0')
130         {
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"),
135                    msg);
136           else
137             error (_("Error occurred in Python convenience function."));
138         }
139       else
140         {
141           Py_XDECREF (ptype);
142           Py_XDECREF (pvalue);
143           Py_XDECREF (ptraceback);
144           error ("%s", msg);
145         }
146     }
147
148   value = convert_value_from_python (result);
149   if (value == NULL)
150     {
151       Py_DECREF (result);
152       gdbpy_print_stack ();
153       error (_("Error while executing Python code."));
154     }
155
156   Py_DECREF (result);
157   do_cleanups (cleanup);
158
159   return value;
160 }
161
162 /* Initializer for a Function object.  It takes one argument, the name
163    of the function.  */
164
165 static int
166 fnpy_init (PyObject *self, PyObject *args, PyObject *kwds)
167 {
168   const char *name;
169   char *docstring = NULL;
170
171   if (! PyArg_ParseTuple (args, "s", &name))
172     return -1;
173   Py_INCREF (self);
174
175   if (PyObject_HasAttrString (self, "__doc__"))
176     {
177       PyObject *ds_obj = PyObject_GetAttrString (self, "__doc__");
178       if (ds_obj && gdbpy_is_string (ds_obj))
179         {
180           docstring = python_string_to_host_string (ds_obj);
181           if (docstring == NULL)
182             {
183               Py_DECREF (self);
184               return -1;
185             }
186         }
187     }
188   if (! docstring)
189     docstring = xstrdup (_("This function is not documented."));
190
191   add_internal_function (name, docstring, fnpy_call, self);
192   return 0;
193 }
194
195 /* Initialize internal function support.  */
196
197 void
198 gdbpy_initialize_functions (void)
199 {
200   fnpy_object_type.tp_new = PyType_GenericNew;
201   if (PyType_Ready (&fnpy_object_type) < 0)
202     return;
203
204   Py_INCREF (&fnpy_object_type);
205   PyModule_AddObject (gdb_module, "Function", (PyObject *) &fnpy_object_type);
206 }
207
208 \f
209
210 static PyTypeObject fnpy_object_type =
211 {
212   PyVarObject_HEAD_INIT (NULL, 0)
213   "gdb.Function",                 /*tp_name*/
214   sizeof (PyObject),              /*tp_basicsize*/
215   0,                              /*tp_itemsize*/
216   0,                              /*tp_dealloc*/
217   0,                              /*tp_print*/
218   0,                              /*tp_getattr*/
219   0,                              /*tp_setattr*/
220   0,                              /*tp_compare*/
221   0,                              /*tp_repr*/
222   0,                              /*tp_as_number*/
223   0,                              /*tp_as_sequence*/
224   0,                              /*tp_as_mapping*/
225   0,                              /*tp_hash */
226   0,                              /*tp_call*/
227   0,                              /*tp_str*/
228   0,                              /*tp_getattro*/
229   0,                              /*tp_setattro*/
230   0,                              /*tp_as_buffer*/
231   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
232   "GDB function object",          /* tp_doc */
233   0,                              /* tp_traverse */
234   0,                              /* tp_clear */
235   0,                              /* tp_richcompare */
236   0,                              /* tp_weaklistoffset */
237   0,                              /* tp_iter */
238   0,                              /* tp_iternext */
239   0,                              /* tp_methods */
240   0,                              /* tp_members */
241   0,                              /* tp_getset */
242   0,                              /* tp_base */
243   0,                              /* tp_dict */
244   0,                              /* tp_descr_get */
245   0,                              /* tp_descr_set */
246   0,                              /* tp_dictoffset */
247   fnpy_init,                      /* tp_init */
248   0,                              /* tp_alloc */
249 };
This page took 0.040833 seconds and 4 git commands to generate.