xref: /dflybsd-src/contrib/gdb-7/gdb/python/py-function.c (revision de8e141f24382815c10a4012d209bbbf7abf1112)
1c50c785cSJohn Marino /* Convenience functions implemented in Python.
2c50c785cSJohn Marino 
3*ef5ccd6cSJohn Marino    Copyright (C) 2008-2013 Free Software Foundation, Inc.
4c50c785cSJohn Marino 
5c50c785cSJohn Marino    This file is part of GDB.
6c50c785cSJohn Marino 
7c50c785cSJohn Marino    This program is free software; you can redistribute it and/or modify
8c50c785cSJohn Marino    it under the terms of the GNU General Public License as published by
9c50c785cSJohn Marino    the Free Software Foundation; either version 3 of the License, or
10c50c785cSJohn Marino    (at your option) any later version.
11c50c785cSJohn Marino 
12c50c785cSJohn Marino    This program is distributed in the hope that it will be useful,
13c50c785cSJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
14c50c785cSJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15c50c785cSJohn Marino    GNU General Public License for more details.
16c50c785cSJohn Marino 
17c50c785cSJohn Marino    You should have received a copy of the GNU General Public License
18c50c785cSJohn Marino    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19c50c785cSJohn Marino 
20c50c785cSJohn Marino 
21c50c785cSJohn Marino #include "defs.h"
22c50c785cSJohn Marino #include "value.h"
23c50c785cSJohn Marino #include "exceptions.h"
24c50c785cSJohn Marino #include "python-internal.h"
25c50c785cSJohn Marino #include "charset.h"
26c50c785cSJohn Marino #include "gdbcmd.h"
27c50c785cSJohn Marino #include "cli/cli-decode.h"
28c50c785cSJohn Marino #include "completer.h"
29c50c785cSJohn Marino #include "expression.h"
30c50c785cSJohn Marino #include "language.h"
31c50c785cSJohn Marino 
32c50c785cSJohn Marino static PyTypeObject fnpy_object_type;
33c50c785cSJohn Marino 
34c50c785cSJohn Marino 
35c50c785cSJohn Marino 
36c50c785cSJohn Marino static PyObject *
convert_values_to_python(int argc,struct value ** argv)37c50c785cSJohn Marino convert_values_to_python (int argc, struct value **argv)
38c50c785cSJohn Marino {
39c50c785cSJohn Marino   int i;
40c50c785cSJohn Marino   PyObject *result = PyTuple_New (argc);
41c50c785cSJohn Marino 
42a45ae5f8SJohn Marino   if (! result)
43a45ae5f8SJohn Marino     return NULL;
44a45ae5f8SJohn Marino 
45c50c785cSJohn Marino   for (i = 0; i < argc; ++i)
46c50c785cSJohn Marino     {
47c50c785cSJohn Marino       PyObject *elt = value_to_value_object (argv[i]);
48c50c785cSJohn Marino       if (! elt)
49c50c785cSJohn Marino 	{
50c50c785cSJohn Marino 	  Py_DECREF (result);
51a45ae5f8SJohn Marino 	  return NULL;
52c50c785cSJohn Marino 	}
53c50c785cSJohn Marino       PyTuple_SetItem (result, i, elt);
54c50c785cSJohn Marino     }
55c50c785cSJohn Marino   return result;
56c50c785cSJohn Marino }
57c50c785cSJohn Marino 
58c50c785cSJohn Marino /* Call a Python function object's invoke method.  */
59c50c785cSJohn Marino 
60c50c785cSJohn Marino static struct value *
fnpy_call(struct gdbarch * gdbarch,const struct language_defn * language,void * cookie,int argc,struct value ** argv)61c50c785cSJohn Marino fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language,
62c50c785cSJohn Marino 	   void *cookie, int argc, struct value **argv)
63c50c785cSJohn Marino {
64c50c785cSJohn Marino   struct value *value = NULL;
65a45ae5f8SJohn Marino   /* 'result' must be set to NULL, this initially indicates whether
66a45ae5f8SJohn Marino      the function was called, or not.  */
67a45ae5f8SJohn Marino   PyObject *result = NULL;
68a45ae5f8SJohn Marino   PyObject *callable, *args;
69c50c785cSJohn Marino   struct cleanup *cleanup;
70c50c785cSJohn Marino 
71c50c785cSJohn Marino   cleanup = ensure_python_env (gdbarch, language);
72c50c785cSJohn Marino 
73c50c785cSJohn Marino   args = convert_values_to_python (argc, argv);
74a45ae5f8SJohn Marino   /* convert_values_to_python can return NULL on error.  If we
75a45ae5f8SJohn Marino      encounter this, do not call the function, but allow the Python ->
76a45ae5f8SJohn Marino      error code conversion below to deal with the Python exception.
77a45ae5f8SJohn Marino      Note, that this is different if the function simply does not
78a45ae5f8SJohn Marino      have arguments.  */
79c50c785cSJohn Marino 
80a45ae5f8SJohn Marino   if (args)
81a45ae5f8SJohn Marino     {
82c50c785cSJohn Marino       callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
83c50c785cSJohn Marino       if (! callable)
84c50c785cSJohn Marino 	{
85c50c785cSJohn Marino 	  Py_DECREF (args);
86c50c785cSJohn Marino 	  error (_("No method named 'invoke' in object."));
87c50c785cSJohn Marino 	}
88c50c785cSJohn Marino 
89c50c785cSJohn Marino       result = PyObject_Call (callable, args, NULL);
90c50c785cSJohn Marino       Py_DECREF (callable);
91c50c785cSJohn Marino       Py_DECREF (args);
92a45ae5f8SJohn Marino     }
93c50c785cSJohn Marino 
94c50c785cSJohn Marino   if (!result)
95c50c785cSJohn Marino     {
96c50c785cSJohn Marino       PyObject *ptype, *pvalue, *ptraceback;
97c50c785cSJohn Marino       char *msg;
98c50c785cSJohn Marino 
99c50c785cSJohn Marino       PyErr_Fetch (&ptype, &pvalue, &ptraceback);
100c50c785cSJohn Marino 
101c50c785cSJohn Marino       /* Try to fetch an error message contained within ptype, pvalue.
102c50c785cSJohn Marino 	 When fetching the error message we need to make our own copy,
103c50c785cSJohn Marino 	 we no longer own ptype, pvalue after the call to PyErr_Restore.  */
104c50c785cSJohn Marino 
105c50c785cSJohn Marino       msg = gdbpy_exception_to_string (ptype, pvalue);
106c50c785cSJohn Marino       make_cleanup (xfree, msg);
107c50c785cSJohn Marino 
108c50c785cSJohn Marino       if (msg == NULL)
109c50c785cSJohn Marino 	{
110c50c785cSJohn Marino 	  /* An error occurred computing the string representation of the
111c50c785cSJohn Marino 	     error message.  This is rare, but we should inform the user.  */
112c50c785cSJohn Marino 
113c50c785cSJohn Marino 	  printf_filtered (_("An error occurred in a Python "
114c50c785cSJohn Marino 			     "convenience function\n"
115c50c785cSJohn Marino 			     "and then another occurred computing the "
116c50c785cSJohn Marino 			     "error message.\n"));
117c50c785cSJohn Marino 	  gdbpy_print_stack ();
118c50c785cSJohn Marino 	}
119c50c785cSJohn Marino 
120c50c785cSJohn Marino       /* Don't print the stack for gdb.GdbError exceptions.
121c50c785cSJohn Marino 	 It is generally used to flag user errors.
122c50c785cSJohn Marino 
123c50c785cSJohn Marino 	 We also don't want to print "Error occurred in Python command"
124c50c785cSJohn Marino 	 for user errors.  However, a missing message for gdb.GdbError
125c50c785cSJohn Marino 	 exceptions is arguably a bug, so we flag it as such.  */
126c50c785cSJohn Marino 
127c50c785cSJohn Marino       if (!PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc)
128c50c785cSJohn Marino 	  || msg == NULL || *msg == '\0')
129c50c785cSJohn Marino 	{
130c50c785cSJohn Marino 	  PyErr_Restore (ptype, pvalue, ptraceback);
131c50c785cSJohn Marino 	  gdbpy_print_stack ();
132c50c785cSJohn Marino 	  if (msg != NULL && *msg != '\0')
133c50c785cSJohn Marino 	    error (_("Error occurred in Python convenience function: %s"),
134c50c785cSJohn Marino 		   msg);
135c50c785cSJohn Marino 	  else
136c50c785cSJohn Marino 	    error (_("Error occurred in Python convenience function."));
137c50c785cSJohn Marino 	}
138c50c785cSJohn Marino       else
139c50c785cSJohn Marino 	{
140c50c785cSJohn Marino 	  Py_XDECREF (ptype);
141c50c785cSJohn Marino 	  Py_XDECREF (pvalue);
142c50c785cSJohn Marino 	  Py_XDECREF (ptraceback);
143c50c785cSJohn Marino 	  error ("%s", msg);
144c50c785cSJohn Marino 	}
145c50c785cSJohn Marino     }
146c50c785cSJohn Marino 
147c50c785cSJohn Marino   value = convert_value_from_python (result);
148c50c785cSJohn Marino   if (value == NULL)
149c50c785cSJohn Marino     {
150c50c785cSJohn Marino       Py_DECREF (result);
151c50c785cSJohn Marino       gdbpy_print_stack ();
152c50c785cSJohn Marino       error (_("Error while executing Python code."));
153c50c785cSJohn Marino     }
154c50c785cSJohn Marino 
155c50c785cSJohn Marino   Py_DECREF (result);
156c50c785cSJohn Marino   do_cleanups (cleanup);
157c50c785cSJohn Marino 
158c50c785cSJohn Marino   return value;
159c50c785cSJohn Marino }
160c50c785cSJohn Marino 
161c50c785cSJohn Marino /* Initializer for a Function object.  It takes one argument, the name
162c50c785cSJohn Marino    of the function.  */
163c50c785cSJohn Marino 
164c50c785cSJohn Marino static int
fnpy_init(PyObject * self,PyObject * args,PyObject * kwds)165c50c785cSJohn Marino fnpy_init (PyObject *self, PyObject *args, PyObject *kwds)
166c50c785cSJohn Marino {
167a45ae5f8SJohn Marino   const char *name;
168a45ae5f8SJohn Marino   char *docstring = NULL;
169c50c785cSJohn Marino 
170c50c785cSJohn Marino   if (! PyArg_ParseTuple (args, "s", &name))
171c50c785cSJohn Marino     return -1;
172c50c785cSJohn Marino   Py_INCREF (self);
173c50c785cSJohn Marino 
174c50c785cSJohn Marino   if (PyObject_HasAttrString (self, "__doc__"))
175c50c785cSJohn Marino     {
176c50c785cSJohn Marino       PyObject *ds_obj = PyObject_GetAttrString (self, "__doc__");
177c50c785cSJohn Marino       if (ds_obj && gdbpy_is_string (ds_obj))
178c50c785cSJohn Marino 	{
179c50c785cSJohn Marino 	  docstring = python_string_to_host_string (ds_obj);
180c50c785cSJohn Marino 	  if (docstring == NULL)
181c50c785cSJohn Marino 	    {
182c50c785cSJohn Marino 	      Py_DECREF (self);
183c50c785cSJohn Marino 	      return -1;
184c50c785cSJohn Marino 	    }
185c50c785cSJohn Marino 	}
186c50c785cSJohn Marino     }
187c50c785cSJohn Marino   if (! docstring)
188c50c785cSJohn Marino     docstring = xstrdup (_("This function is not documented."));
189c50c785cSJohn Marino 
190c50c785cSJohn Marino   add_internal_function (name, docstring, fnpy_call, self);
191c50c785cSJohn Marino   return 0;
192c50c785cSJohn Marino }
193c50c785cSJohn Marino 
194c50c785cSJohn Marino /* Initialize internal function support.  */
195c50c785cSJohn Marino 
196c50c785cSJohn Marino void
gdbpy_initialize_functions(void)197c50c785cSJohn Marino gdbpy_initialize_functions (void)
198c50c785cSJohn Marino {
199a45ae5f8SJohn Marino   fnpy_object_type.tp_new = PyType_GenericNew;
200c50c785cSJohn Marino   if (PyType_Ready (&fnpy_object_type) < 0)
201c50c785cSJohn Marino     return;
202c50c785cSJohn Marino 
203c50c785cSJohn Marino   Py_INCREF (&fnpy_object_type);
204c50c785cSJohn Marino   PyModule_AddObject (gdb_module, "Function", (PyObject *) &fnpy_object_type);
205c50c785cSJohn Marino }
206c50c785cSJohn Marino 
207c50c785cSJohn Marino 
208c50c785cSJohn Marino 
209c50c785cSJohn Marino static PyTypeObject fnpy_object_type =
210c50c785cSJohn Marino {
211*ef5ccd6cSJohn Marino   PyVarObject_HEAD_INIT (NULL, 0)
212c50c785cSJohn Marino   "gdb.Function",		  /*tp_name*/
213c50c785cSJohn Marino   sizeof (PyObject),		  /*tp_basicsize*/
214c50c785cSJohn Marino   0,				  /*tp_itemsize*/
215c50c785cSJohn Marino   0,				  /*tp_dealloc*/
216c50c785cSJohn Marino   0,				  /*tp_print*/
217c50c785cSJohn Marino   0,				  /*tp_getattr*/
218c50c785cSJohn Marino   0,				  /*tp_setattr*/
219c50c785cSJohn Marino   0,				  /*tp_compare*/
220c50c785cSJohn Marino   0,				  /*tp_repr*/
221c50c785cSJohn Marino   0,				  /*tp_as_number*/
222c50c785cSJohn Marino   0,				  /*tp_as_sequence*/
223c50c785cSJohn Marino   0,				  /*tp_as_mapping*/
224c50c785cSJohn Marino   0,				  /*tp_hash */
225c50c785cSJohn Marino   0,				  /*tp_call*/
226c50c785cSJohn Marino   0,				  /*tp_str*/
227c50c785cSJohn Marino   0,				  /*tp_getattro*/
228c50c785cSJohn Marino   0,				  /*tp_setattro*/
229c50c785cSJohn Marino   0,				  /*tp_as_buffer*/
230c50c785cSJohn Marino   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
231c50c785cSJohn Marino   "GDB function object",	  /* tp_doc */
232c50c785cSJohn Marino   0,				  /* tp_traverse */
233c50c785cSJohn Marino   0,				  /* tp_clear */
234c50c785cSJohn Marino   0,				  /* tp_richcompare */
235c50c785cSJohn Marino   0,				  /* tp_weaklistoffset */
236c50c785cSJohn Marino   0,				  /* tp_iter */
237c50c785cSJohn Marino   0,				  /* tp_iternext */
238c50c785cSJohn Marino   0,				  /* tp_methods */
239c50c785cSJohn Marino   0,				  /* tp_members */
240c50c785cSJohn Marino   0,				  /* tp_getset */
241c50c785cSJohn Marino   0,				  /* tp_base */
242c50c785cSJohn Marino   0,				  /* tp_dict */
243c50c785cSJohn Marino   0,				  /* tp_descr_get */
244c50c785cSJohn Marino   0,				  /* tp_descr_set */
245c50c785cSJohn Marino   0,				  /* tp_dictoffset */
246c50c785cSJohn Marino   fnpy_init,			  /* tp_init */
247c50c785cSJohn Marino   0,				  /* tp_alloc */
248c50c785cSJohn Marino };
249