1 /* Convenience functions implemented in Python. 2 3 Copyright (C) 2008, 2009 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 for (i = 0; i < argc; ++i) 42 { 43 PyObject *elt = value_to_value_object (argv[i]); 44 if (! elt) 45 { 46 Py_DECREF (result); 47 error (_("Could not convert value to Python object.")); 48 } 49 PyTuple_SetItem (result, i, elt); 50 } 51 return result; 52 } 53 54 /* Call a Python function object's invoke method. */ 55 56 static struct value * 57 fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language, 58 void *cookie, int argc, struct value **argv) 59 { 60 int i; 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 gdbpy_print_stack (); 83 error (_("Error while executing Python code.")); 84 } 85 86 value = convert_value_from_python (result); 87 if (value == NULL) 88 { 89 Py_DECREF (result); 90 gdbpy_print_stack (); 91 error (_("Error while executing Python code.")); 92 } 93 94 Py_DECREF (result); 95 do_cleanups (cleanup); 96 97 return value; 98 } 99 100 /* Initializer for a Function object. It takes one argument, the name 101 of the function. */ 102 103 static int 104 fnpy_init (PyObject *self, PyObject *args, PyObject *kwds) 105 { 106 char *name, *docstring = NULL; 107 if (! PyArg_ParseTuple (args, "s", &name)) 108 return -1; 109 Py_INCREF (self); 110 111 if (PyObject_HasAttrString (self, "__doc__")) 112 { 113 PyObject *ds_obj = PyObject_GetAttrString (self, "__doc__"); 114 if (ds_obj && gdbpy_is_string (ds_obj)) 115 docstring = python_string_to_host_string (ds_obj); 116 } 117 if (! docstring) 118 docstring = xstrdup (_("This function is not documented.")); 119 120 add_internal_function (name, docstring, fnpy_call, self); 121 return 0; 122 } 123 124 /* Initialize internal function support. */ 125 126 void 127 gdbpy_initialize_functions (void) 128 { 129 if (PyType_Ready (&fnpy_object_type) < 0) 130 return; 131 132 Py_INCREF (&fnpy_object_type); 133 PyModule_AddObject (gdb_module, "Function", (PyObject *) &fnpy_object_type); 134 } 135 136 137 138 static PyTypeObject fnpy_object_type = 139 { 140 PyObject_HEAD_INIT (NULL) 141 0, /*ob_size*/ 142 "gdb.Function", /*tp_name*/ 143 sizeof (PyObject), /*tp_basicsize*/ 144 0, /*tp_itemsize*/ 145 0, /*tp_dealloc*/ 146 0, /*tp_print*/ 147 0, /*tp_getattr*/ 148 0, /*tp_setattr*/ 149 0, /*tp_compare*/ 150 0, /*tp_repr*/ 151 0, /*tp_as_number*/ 152 0, /*tp_as_sequence*/ 153 0, /*tp_as_mapping*/ 154 0, /*tp_hash */ 155 0, /*tp_call*/ 156 0, /*tp_str*/ 157 0, /*tp_getattro*/ 158 0, /*tp_setattro*/ 159 0, /*tp_as_buffer*/ 160 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 161 "GDB function object", /* tp_doc */ 162 0, /* tp_traverse */ 163 0, /* tp_clear */ 164 0, /* tp_richcompare */ 165 0, /* tp_weaklistoffset */ 166 0, /* tp_iter */ 167 0, /* tp_iternext */ 168 0, /* tp_methods */ 169 0, /* tp_members */ 170 0, /* tp_getset */ 171 0, /* tp_base */ 172 0, /* tp_dict */ 173 0, /* tp_descr_get */ 174 0, /* tp_descr_set */ 175 0, /* tp_dictoffset */ 176 fnpy_init, /* tp_init */ 177 0, /* tp_alloc */ 178 PyType_GenericNew /* tp_new */ 179 }; 180