OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [python/] [py-cmd.c] - Diff between revs 834 and 842

Only display areas with differences | Details | Blame | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.