diff options
author | Joel Brobecker <brobecker@gnat.com> | 2009-09-09 17:45:42 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2009-09-09 17:45:42 +0000 |
commit | 5172aecbd2b65e71aedbd21c46253ca6a20227aa (patch) | |
tree | 879124432741656573e3a6f6a4c7b3a9dfb2ca8a /gdb/python/python-cmd.c | |
parent | b83e9eb71cb4a21b31f8f47782da821a5a0ddb32 (diff) | |
download | binutils-5172aecbd2b65e71aedbd21c46253ca6a20227aa.zip binutils-5172aecbd2b65e71aedbd21c46253ca6a20227aa.tar.gz binutils-5172aecbd2b65e71aedbd21c46253ca6a20227aa.tar.bz2 |
Checking in this patch for Thiago: Rename python-* files into py-*,
more 8+3 friendly.
gdb/
* Makefile.in (py-cmd.o): Renamed from python-cmd.o. Updated
references.
(py-frame.o): Renamed from python-frame.o. Updated references.
(py-function.o): Renamed from python-function.o. Updated references.
(py-objfile.o): Renamed from python-objfile.o. Updated references.
(py-prettyprint.o): Renamed from python-prettyprint.o. Updated
+references.
(py-type.o): Renamed from python-type.o. Updated references.
(py-utils.o): Renamed from python-utils.o. Updated references.
(py-value.o): Renamed from python-value.o. Updated references.
* py-cmd.o: Renamed from python-cmd.o.
* py-frame.o: Renamed from python-frame.o.
* py-function.o: Renamed from python-function.o.
* py-objfile.o: Renamed from python-objfile.o.
* py-prettyprint.o: Renamed from python-prettyprint.o.
* py-type.o: Renamed from python-type.o.
* py-utils.o: Renamed from python-utils.o.
* py-value.o: Renamed from python-value.o.
gdb/testsuite/
* gdb.python/Makefile.in (EXECUTABLES): Adjust to new executable
names, add missing ones.
* gdb.python/py-cmd.exp: Rename from python-cmd.exp.
* gdb.python/py-frame.c: Rename from python-frame.c.
* gdb.python/py-frame.exp: Rename from python-frame.exp. Adjust
testfile name.
* gdb.python/py-function.exp: Rename from python-function.exp.
* gdb.python/py-mi.exp: Rename from python-mi.exp. Adjust
testfile name.
* gdb.python/py-prettyprint.c: Rename from python-prettyprint.c.
* gdb.python/py-prettyprint.exp: Rename from python-prettyprint.exp.
Adjust testfile name.
* gdb.python/py-prettyprint.py: Rename from python-prettyprint.py.
* gdb.python/py-template.cc: Rename from python-template.cc.
* gdb.python/py-template.exp: Rename from python-template.exp.
Adjust testfile name.
* gdb.python/py-value.c: Rename from python-value.c.
* gdb.python/py-value.exp: Rename from python-value.exp. Adjust
testfile name.
Diffstat (limited to 'gdb/python/python-cmd.c')
-rw-r--r-- | gdb/python/python-cmd.c | 585 |
1 files changed, 0 insertions, 585 deletions
diff --git a/gdb/python/python-cmd.c b/gdb/python/python-cmd.c deleted file mode 100644 index 528aca6..0000000 --- a/gdb/python/python-cmd.c +++ /dev/null @@ -1,585 +0,0 @@ -/* gdb commands implemented in Python - - Copyright (C) 2008, 2009 Free Software Foundation, Inc. - - This file is part of GDB. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ - - -#include "defs.h" -#include "arch-utils.h" -#include "value.h" -#include "exceptions.h" -#include "python-internal.h" -#include "charset.h" -#include "gdbcmd.h" -#include "cli/cli-decode.h" -#include "completer.h" -#include "language.h" - -/* Struct representing built-in completion types. */ -struct cmdpy_completer -{ - /* Python symbol name. */ - char *name; - /* Completion function. */ - char **(*completer) (struct cmd_list_element *, char *, char *); -}; - -static struct cmdpy_completer completers[] = -{ - { "COMPLETE_NONE", noop_completer }, - { "COMPLETE_FILENAME", filename_completer }, - { "COMPLETE_LOCATION", location_completer }, - { "COMPLETE_COMMAND", command_completer }, - { "COMPLETE_SYMBOL", make_symbol_completion_list_fn }, -}; - -#define N_COMPLETERS (sizeof (completers) / sizeof (completers[0])) - -/* A gdb command. For the time being only ordinary commands (not - set/show commands) are allowed. */ -struct cmdpy_object -{ - PyObject_HEAD - - /* The corresponding gdb command object, or NULL if the command is - no longer installed. */ - struct cmd_list_element *command; - - /* A prefix command requires storage for a list of its sub-commands. - A pointer to this is passed to add_prefix_command, and to add_cmd - for sub-commands of that prefix. If this Command is not a prefix - command, then this field is unused. */ - struct cmd_list_element *sub_list; -}; - -typedef struct cmdpy_object cmdpy_object; - -static PyTypeObject cmdpy_object_type; - - -/* Constants used by this module. */ -static PyObject *invoke_cst; -static PyObject *complete_cst; - - - -/* Python function which wraps dont_repeat. */ -static PyObject * -cmdpy_dont_repeat (PyObject *self, PyObject *args) -{ - dont_repeat (); - Py_RETURN_NONE; -} - - - -/* Called if the gdb cmd_list_element is destroyed. */ -static void -cmdpy_destroyer (struct cmd_list_element *self, void *context) -{ - cmdpy_object *cmd; - struct cleanup *cleanup; - - cleanup = ensure_python_env (get_current_arch (), current_language); - - /* Release our hold on the command object. */ - cmd = (cmdpy_object *) context; - cmd->command = NULL; - Py_DECREF (cmd); - - /* We allocated the name, doc string, and perhaps the prefix - name. */ - xfree (self->name); - xfree (self->doc); - xfree (self->prefixname); - - do_cleanups (cleanup); -} - -/* Called by gdb to invoke the command. */ -static void -cmdpy_function (struct cmd_list_element *command, char *args, int from_tty) -{ - cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command); - PyObject *argobj, *ttyobj, *result; - struct cleanup *cleanup; - - cleanup = ensure_python_env (get_current_arch (), current_language); - - if (! obj) - error (_("Invalid invocation of Python command object.")); - if (! PyObject_HasAttr ((PyObject *) obj, invoke_cst)) - { - if (obj->command->prefixname) - { - /* A prefix command does not need an invoke method. */ - do_cleanups (cleanup); - return; - } - error (_("Python command object missing 'invoke' method.")); - } - - if (! args) - args = ""; - argobj = PyUnicode_Decode (args, strlen (args), host_charset (), NULL); - if (! argobj) - error (_("Could not convert arguments to Python string.")); - - ttyobj = from_tty ? Py_True : Py_False; - Py_INCREF (ttyobj); - result = PyObject_CallMethodObjArgs ((PyObject *) obj, invoke_cst, argobj, - ttyobj, NULL); - Py_DECREF (argobj); - Py_DECREF (ttyobj); - if (! result) - { - PyObject *ptype, *pvalue, *ptraceback; - char *s, *str; - - PyErr_Fetch (&ptype, &pvalue, &ptraceback); - - if (pvalue && PyString_Check (pvalue)) - { - /* Make a temporary copy of the string data. */ - char *s = PyString_AsString (pvalue); - char *copy = alloca (strlen (s) + 1); - strcpy (copy, s); - - PyErr_Restore (ptype, pvalue, ptraceback); - gdbpy_print_stack (); - error (_("Error occurred in Python command: %s"), copy); - } - else - { - PyErr_Restore (ptype, pvalue, ptraceback); - gdbpy_print_stack (); - error (_("Error occurred in Python command.")); - } - } - Py_DECREF (result); - do_cleanups (cleanup); -} - -/* Called by gdb for command completion. */ -static char ** -cmdpy_completer (struct cmd_list_element *command, char *text, char *word) -{ - cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command); - PyObject *textobj, *wordobj, *resultobj = NULL; - char **result = NULL; - struct cleanup *cleanup; - - cleanup = ensure_python_env (get_current_arch (), current_language); - - if (! obj) - error (_("Invalid invocation of Python command object.")); - if (! PyObject_HasAttr ((PyObject *) obj, complete_cst)) - { - /* If there is no complete method, don't error -- instead, just - say that there are no completions. */ - goto done; - } - - textobj = PyUnicode_Decode (text, strlen (text), host_charset (), NULL); - if (! textobj) - error (_("Could not convert argument to Python string.")); - wordobj = PyUnicode_Decode (word, strlen (word), host_charset (), NULL); - if (! wordobj) - error (_("Could not convert argument to Python string.")); - - resultobj = PyObject_CallMethodObjArgs ((PyObject *) obj, complete_cst, - textobj, wordobj, NULL); - Py_DECREF (textobj); - Py_DECREF (wordobj); - if (! resultobj) - { - /* Just swallow errors here. */ - PyErr_Clear (); - goto done; - } - make_cleanup_py_decref (resultobj); - - result = NULL; - if (PySequence_Check (resultobj)) - { - Py_ssize_t i, len = PySequence_Size (resultobj); - Py_ssize_t out; - if (len < 0) - goto done; - - result = (char **) xmalloc ((len + 1) * sizeof (char *)); - for (i = out = 0; i < len; ++i) - { - int l; - PyObject *elt = PySequence_GetItem (resultobj, i); - if (elt == NULL || ! gdbpy_is_string (elt)) - { - /* Skip problem elements. */ - PyErr_Clear (); - continue; - } - result[out] = python_string_to_host_string (elt); - ++out; - } - result[out] = NULL; - } - else if (PyInt_Check (resultobj)) - { - /* User code may also return one of the completion constants, - thus requesting that sort of completion. */ - long value = PyInt_AsLong (resultobj); - if (value >= 0 && value < (long) N_COMPLETERS) - result = completers[value].completer (command, text, word); - } - - done: - - do_cleanups (cleanup); - - return result; -} - -/* Helper for cmdpy_init which locates the command list to use and - pulls out the command name. - - TEXT is the command name list. The final word in the list is the - name of the new command. All earlier words must be existing prefix - commands. - - *BASE_LIST is set to the final prefix command's list of - *sub-commands. - - This function returns the xmalloc()d name of the new command. On - error sets the Python error and returns NULL. */ -static char * -parse_command_name (char *text, struct cmd_list_element ***base_list) -{ - struct cmd_list_element *elt; - int len = strlen (text); - int i, lastchar; - char *prefix_text; - char *result; - - /* Skip trailing whitespace. */ - for (i = len - 1; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i) - ; - if (i < 0) - { - PyErr_SetString (PyExc_RuntimeError, _("no command name found")); - return NULL; - } - lastchar = i; - - /* Find first character of the final word. */ - for (; i > 0 && (isalnum (text[i - 1]) - || text[i - 1] == '-' - || text[i - 1] == '_'); - --i) - ; - result = xmalloc (lastchar - i + 2); - memcpy (result, &text[i], lastchar - i + 1); - result[lastchar - i + 1] = '\0'; - - /* Skip whitespace again. */ - for (--i; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i) - ; - if (i < 0) - { - *base_list = &cmdlist; - return result; - } - - prefix_text = xmalloc (i + 2); - memcpy (prefix_text, text, i + 1); - prefix_text[i + 1] = '\0'; - - text = prefix_text; - elt = lookup_cmd_1 (&text, cmdlist, NULL, 1); - if (!elt || elt == (struct cmd_list_element *) -1) - { - PyErr_Format (PyExc_RuntimeError, _("could not find command prefix %s"), - prefix_text); - xfree (prefix_text); - xfree (result); - return NULL; - } - - if (elt->prefixlist) - { - xfree (prefix_text); - *base_list = elt->prefixlist; - return result; - } - - PyErr_Format (PyExc_RuntimeError, _("'%s' is not a prefix command"), - prefix_text); - xfree (prefix_text); - xfree (result); - return NULL; -} - -/* Object initializer; sets up gdb-side structures for command. - - Use: __init__(NAME, COMMAND_CLASS [, COMPLETER_CLASS][, PREFIX]]). - - NAME is the name of the command. It may consist of multiple words, - in which case the final word is the name of the new command, and - earlier words must be prefix commands. - - COMMAND_CLASS is the kind of command. It should be one of the COMMAND_* - constants defined in the gdb module. - - COMPLETER_CLASS is the kind of completer. If not given, the - "complete" method will be used. Otherwise, it should be one of the - COMPLETE_* constants defined in the gdb module. - - If PREFIX is True, then this command is a prefix command. - - The documentation for the command is taken from the doc string for - the python class. - -*/ -static int -cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) -{ - cmdpy_object *obj = (cmdpy_object *) self; - char *name; - int cmdtype; - int completetype = -1; - char *docstring = NULL; - volatile struct gdb_exception except; - struct cmd_list_element **cmd_list; - char *cmd_name, *pfx_name; - static char *keywords[] = { "name", "command_class", "completer_class", - "prefix", NULL }; - PyObject *is_prefix = NULL; - int cmp; - - if (obj->command) - { - /* Note: this is apparently not documented in Python. We return - 0 for success, -1 for failure. */ - PyErr_Format (PyExc_RuntimeError, - _("command object already initialized")); - return -1; - } - - if (! PyArg_ParseTupleAndKeywords (args, kw, "si|iO", keywords, &name, &cmdtype, - &completetype, &is_prefix)) - return -1; - - if (cmdtype != no_class && cmdtype != class_run - && cmdtype != class_vars && cmdtype != class_stack - && cmdtype != class_files && cmdtype != class_support - && cmdtype != class_info && cmdtype != class_breakpoint - && cmdtype != class_trace && cmdtype != class_obscure - && cmdtype != class_maintenance) - { - PyErr_Format (PyExc_RuntimeError, _("invalid command class argument")); - return -1; - } - - if (completetype < -1 || completetype >= (int) N_COMPLETERS) - { - PyErr_Format (PyExc_RuntimeError, _("invalid completion type argument")); - return -1; - } - - cmd_name = parse_command_name (name, &cmd_list); - if (! cmd_name) - return -1; - - pfx_name = NULL; - if (is_prefix != NULL) - { - cmp = PyObject_IsTrue (is_prefix); - if (cmp == 1) - { - int i, out; - - /* Make a normalized form of the command name. */ - pfx_name = xmalloc (strlen (name) + 2); - - i = 0; - out = 0; - while (name[i]) - { - /* Skip whitespace. */ - while (name[i] == ' ' || name[i] == '\t') - ++i; - /* Copy non-whitespace characters. */ - while (name[i] && name[i] != ' ' && name[i] != '\t') - pfx_name[out++] = name[i++]; - /* Add a single space after each word -- including the final - word. */ - pfx_name[out++] = ' '; - } - pfx_name[out] = '\0'; - } - else if (cmp < 0) - return -1; - } - if (PyObject_HasAttr (self, gdbpy_doc_cst)) - { - PyObject *ds_obj = PyObject_GetAttr (self, gdbpy_doc_cst); - if (ds_obj && gdbpy_is_string (ds_obj)) - docstring = python_string_to_host_string (ds_obj); - } - if (! docstring) - docstring = xstrdup (_("This command is not documented.")); - - Py_INCREF (self); - - TRY_CATCH (except, RETURN_MASK_ALL) - { - struct cmd_list_element *cmd; - - if (pfx_name) - { - int allow_unknown; - - /* If we have our own "invoke" method, then allow unknown - sub-commands. */ - allow_unknown = PyObject_HasAttr (self, invoke_cst); - cmd = add_prefix_cmd (cmd_name, (enum command_class) cmdtype, - NULL, docstring, &obj->sub_list, - pfx_name, allow_unknown, cmd_list); - } - else - cmd = add_cmd (cmd_name, (enum command_class) cmdtype, NULL, - docstring, cmd_list); - - /* There appears to be no API to set this. */ - cmd->func = cmdpy_function; - cmd->destroyer = cmdpy_destroyer; - - obj->command = cmd; - set_cmd_context (cmd, self); - set_cmd_completer (cmd, ((completetype == -1) ? cmdpy_completer - : completers[completetype].completer)); - } - if (except.reason < 0) - { - xfree (cmd_name); - xfree (docstring); - xfree (pfx_name); - Py_DECREF (self); - PyErr_Format (except.reason == RETURN_QUIT - ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, - "%s", except.message); - return -1; - } - return 0; -} - - - -/* Initialize the 'commands' code. */ -void -gdbpy_initialize_commands (void) -{ - int i; - - if (PyType_Ready (&cmdpy_object_type) < 0) - return; - - /* Note: alias and user are special; pseudo appears to be unused, - and there is no reason to expose tui or xdb, I think. */ - if (PyModule_AddIntConstant (gdb_module, "COMMAND_NONE", no_class) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_RUNNING", class_run) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_DATA", class_vars) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_STACK", class_stack) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_FILES", class_files) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_SUPPORT", - class_support) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_STATUS", class_info) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_BREAKPOINTS", - class_breakpoint) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_TRACEPOINTS", - class_trace) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_OBSCURE", - class_obscure) < 0 - || PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE", - class_maintenance) < 0) - return; - - for (i = 0; i < N_COMPLETERS; ++i) - { - if (PyModule_AddIntConstant (gdb_module, completers[i].name, i) < 0) - return; - } - - Py_INCREF (&cmdpy_object_type); - PyModule_AddObject (gdb_module, "Command", - (PyObject *) &cmdpy_object_type); - - invoke_cst = PyString_FromString ("invoke"); - complete_cst = PyString_FromString ("complete"); -} - - - -static PyMethodDef cmdpy_object_methods[] = -{ - { "dont_repeat", cmdpy_dont_repeat, METH_NOARGS, - "Prevent command repetition when user enters empty line." }, - - { 0 } -}; - -static PyTypeObject cmdpy_object_type = -{ - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ - "gdb.Command", /*tp_name*/ - sizeof (cmdpy_object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "GDB command object", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - cmdpy_object_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - cmdpy_init, /* tp_init */ - 0, /* tp_alloc */ - PyType_GenericNew /* tp_new */ -}; |