1 /* Convenience functions implemented in Python. 2 3 Copyright (C) 2008, 2009, 2010, 2011 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 34 35 36 static PyObject * 37 convert_values_to_python (int argc, struct value **argv) 38 { 39 int i; 40 PyObject *result = PyTuple_New (argc); 41 42 for (i = 0; i < argc; ++i) 43 { 44 PyObject *elt = value_to_value_object (argv[i]); 45 if (! elt) 46 { 47 Py_DECREF (result); 48 error (_("Could not convert value to Python object.")); 49 } 50 PyTuple_SetItem (result, i, elt); 51 } 52 return result; 53 } 54 55 /* Call a Python function object's invoke method. */ 56 57 static struct value * 58 fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language, 59 void *cookie, int argc, struct value **argv) 60 { 61 struct value *value = NULL; 62 PyObject *result, *callable, *args; 63 struct cleanup *cleanup; 64 65 cleanup = ensure_python_env (gdbarch, language); 66 67 args = convert_values_to_python (argc, argv); 68 69 callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke"); 70 if (! callable) 71 { 72 Py_DECREF (args); 73 error (_("No method named 'invoke' in object.")); 74 } 75 76 result = PyObject_Call (callable, args, NULL); 77 Py_DECREF (callable); 78 Py_DECREF (args); 79 80 if (!result) 81 { 82 PyObject *ptype, *pvalue, *ptraceback; 83 char *msg; 84 85 PyErr_Fetch (&ptype, &pvalue, &ptraceback); 86 87 /* Try to fetch an error message contained within ptype, pvalue. 88 When fetching the error message we need to make our own copy, 89 we no longer own ptype, pvalue after the call to PyErr_Restore. */ 90 91 msg = gdbpy_exception_to_string (ptype, pvalue); 92 make_cleanup (xfree, msg); 93 94 if (msg == NULL) 95 { 96 /* An error occurred computing the string representation of the 97 error message. This is rare, but we should inform the user. */ 98 99 printf_filtered (_("An error occurred in a Python " 100 "convenience function\n" 101 "and then another occurred computing the " 102 "error message.\n")); 103 gdbpy_print_stack (); 104 } 105 106 /* Don't print the stack for gdb.GdbError exceptions. 107 It is generally used to flag user errors. 108 109 We also don't want to print "Error occurred in Python command" 110 for user errors. However, a missing message for gdb.GdbError 111 exceptions is arguably a bug, so we flag it as such. */ 112 113 if (!PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc) 114 || msg == NULL || *msg == '\0') 115 { 116 PyErr_Restore (ptype, pvalue, ptraceback); 117 gdbpy_print_stack (); 118 if (msg != NULL && *msg != '\0') 119 error (_("Error occurred in Python convenience function: %s"), 120 msg); 121 else 122 error (_("Error occurred in Python convenience function.")); 123 } 124 else 125 { 126 Py_XDECREF (ptype); 127 Py_XDECREF (pvalue); 128 Py_XDECREF (ptraceback); 129 error ("%s", msg); 130 } 131 } 132 133 value = convert_value_from_python (result); 134 if (value == NULL) 135 { 136 Py_DECREF (result); 137 gdbpy_print_stack (); 138 error (_("Error while executing Python code.")); 139 } 140 141 Py_DECREF (result); 142 do_cleanups (cleanup); 143 144 return value; 145 } 146 147 /* Initializer for a Function object. It takes one argument, the name 148 of the function. */ 149 150 static int 151 fnpy_init (PyObject *self, PyObject *args, PyObject *kwds) 152 { 153 char *name, *docstring = NULL; 154 155 if (! PyArg_ParseTuple (args, "s", &name)) 156 return -1; 157 Py_INCREF (self); 158 159 if (PyObject_HasAttrString (self, "__doc__")) 160 { 161 PyObject *ds_obj = PyObject_GetAttrString (self, "__doc__"); 162 if (ds_obj && gdbpy_is_string (ds_obj)) 163 { 164 docstring = python_string_to_host_string (ds_obj); 165 if (docstring == NULL) 166 { 167 Py_DECREF (self); 168 return -1; 169 } 170 } 171 } 172 if (! docstring) 173 docstring = xstrdup (_("This function is not documented.")); 174 175 add_internal_function (name, docstring, fnpy_call, self); 176 return 0; 177 } 178 179 /* Initialize internal function support. */ 180 181 void 182 gdbpy_initialize_functions (void) 183 { 184 if (PyType_Ready (&fnpy_object_type) < 0) 185 return; 186 187 Py_INCREF (&fnpy_object_type); 188 PyModule_AddObject (gdb_module, "Function", (PyObject *) &fnpy_object_type); 189 } 190 191 192 193 static PyTypeObject fnpy_object_type = 194 { 195 PyObject_HEAD_INIT (NULL) 196 0, /*ob_size*/ 197 "gdb.Function", /*tp_name*/ 198 sizeof (PyObject), /*tp_basicsize*/ 199 0, /*tp_itemsize*/ 200 0, /*tp_dealloc*/ 201 0, /*tp_print*/ 202 0, /*tp_getattr*/ 203 0, /*tp_setattr*/ 204 0, /*tp_compare*/ 205 0, /*tp_repr*/ 206 0, /*tp_as_number*/ 207 0, /*tp_as_sequence*/ 208 0, /*tp_as_mapping*/ 209 0, /*tp_hash */ 210 0, /*tp_call*/ 211 0, /*tp_str*/ 212 0, /*tp_getattro*/ 213 0, /*tp_setattro*/ 214 0, /*tp_as_buffer*/ 215 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 216 "GDB function object", /* tp_doc */ 217 0, /* tp_traverse */ 218 0, /* tp_clear */ 219 0, /* tp_richcompare */ 220 0, /* tp_weaklistoffset */ 221 0, /* tp_iter */ 222 0, /* tp_iternext */ 223 0, /* tp_methods */ 224 0, /* tp_members */ 225 0, /* tp_getset */ 226 0, /* tp_base */ 227 0, /* tp_dict */ 228 0, /* tp_descr_get */ 229 0, /* tp_descr_set */ 230 0, /* tp_dictoffset */ 231 fnpy_init, /* tp_init */ 232 0, /* tp_alloc */ 233 PyType_GenericNew /* tp_new */ 234 }; 235