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