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