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 */ -};  | 
