X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Finterps.c;h=65a01437d58020bb7ea52fd98c292316bb8581c8;hb=71780f455fbf35ed4c48e94b4228c55c11a213c8;hp=4de7c4e8be6c48d4b266943e06f4ba90c3babaf5;hpb=eb3ff9a55175dcdac8328b558d54951a14d719b1;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/interps.c b/gdb/interps.c index 4de7c4e8be..65a01437d5 100644 --- a/gdb/interps.c +++ b/gdb/interps.c @@ -1,6 +1,6 @@ /* Manages interpreters for GDB, the GNU debugger. - Copyright (C) 2000-2017 Free Software Foundation, Inc. + Copyright (C) 2000-2020 Free Software Foundation, Inc. Written by Jim Ingham of Apple Computer, Inc. @@ -38,6 +38,7 @@ #include "completer.h" #include "top.h" /* For command_loop. */ #include "continuations.h" +#include "main.h" /* Each UI has its own independent set of interpreters. */ @@ -74,25 +75,29 @@ get_current_interp_info (void) /* The magic initialization routine for this module. */ -void _initialize_interpreter (void); - static struct interp *interp_lookup_existing (struct ui *ui, const char *name); interp::interp (const char *name) + : m_name (xstrdup (name)) { - this->name = xstrdup (name); this->inited = false; } interp::~interp () -{} +{ + xfree (m_name); +} /* An interpreter factory. Maps an interpreter name to the factory function that instantiates an interpreter by that name. */ struct interp_factory { + interp_factory (const char *name_, interp_factory_func func_) + : name (name_), func (func_) + {} + /* This is the name in "-i=INTERP" and "interpreter-exec INTERP". */ const char *name; @@ -100,35 +105,24 @@ struct interp_factory interp_factory_func func; }; -typedef struct interp_factory *interp_factory_p; -DEF_VEC_P(interp_factory_p); - /* The registered interpreter factories. */ -static VEC(interp_factory_p) *interpreter_factories = NULL; +static std::vector interpreter_factories; /* See interps.h. */ void interp_factory_register (const char *name, interp_factory_func func) { - struct interp_factory *f; - int ix; - /* Assert that no factory for NAME is already registered. */ - for (ix = 0; - VEC_iterate (interp_factory_p, interpreter_factories, ix, f); - ++ix) - if (strcmp (f->name, name) == 0) + for (const interp_factory &f : interpreter_factories) + if (strcmp (f.name, name) == 0) { internal_error (__FILE__, __LINE__, _("interpreter factory already registered: \"%s\"\n"), name); } - f = XNEW (struct interp_factory); - f->name = name; - f->func = func; - VEC_safe_push (interp_factory_p, interpreter_factories, f); + interpreter_factories.emplace_back (name, func); } /* Add interpreter INTERP to the gdb interpreter list. The @@ -138,7 +132,7 @@ interp_add (struct ui *ui, struct interp *interp) { struct ui_interp_info *ui_interp = get_interp_info (ui); - gdb_assert (interp_lookup_existing (ui, interp->name) == NULL); + gdb_assert (interp_lookup_existing (ui, interp->name ()) == NULL); interp->next = ui_interp->interp_list; ui_interp->interp_list = interp; @@ -179,11 +173,11 @@ interp_set (struct interp *interp, bool top_level) /* We use interpreter_p for the "set interpreter" variable, so we need to make sure we have a malloc'ed copy for the set command to free. */ if (interpreter_p != NULL - && strcmp (interp->name, interpreter_p) != 0) + && strcmp (interp->name (), interpreter_p) != 0) { xfree (interpreter_p); - interpreter_p = xstrdup (interp->name); + interpreter_p = xstrdup (interp->name ()); } /* Run the init proc. */ @@ -215,7 +209,7 @@ interp_lookup_existing (struct ui *ui, const char *name) interp != NULL; interp = interp->next) { - if (strcmp (interp->name, name) == 0) + if (strcmp (interp->name (), name) == 0) return interp; } @@ -227,24 +221,18 @@ interp_lookup_existing (struct ui *ui, const char *name) struct interp * interp_lookup (struct ui *ui, const char *name) { - struct interp_factory *factory; - struct interp *interp; - int ix; - if (name == NULL || strlen (name) == 0) return NULL; /* Only create each interpreter once per top level. */ - interp = interp_lookup_existing (ui, name); + struct interp *interp = interp_lookup_existing (ui, name); if (interp != NULL) return interp; - for (ix = 0; - VEC_iterate (interp_factory_p, interpreter_factories, ix, factory); - ++ix) - if (strcmp (factory->name, name) == 0) + for (const interp_factory &factory : interpreter_factories) + if (strcmp (factory.name, name) == 0) { - interp = factory->func (name); + interp = factory.func (name); interp_add (ui, interp); return interp; } @@ -266,31 +254,19 @@ set_top_level_interpreter (const char *name) interp_set (interp, true); } -/* Returns the current interpreter. */ - -struct ui_out * -interp_ui_out (struct interp *interp) -{ - struct ui_interp_info *ui_interp = get_current_interp_info (); - - if (interp == NULL) - interp = ui_interp->current_interpreter; - return interp->interp_ui_out (); -} - void -current_interp_set_logging (ui_file_up logfile, - bool logging_redirect) +current_interp_set_logging (ui_file_up logfile, bool logging_redirect, + bool debug_redirect) { struct ui_interp_info *ui_interp = get_current_interp_info (); struct interp *interp = ui_interp->current_interpreter; - interp->set_logging (std::move (logfile), logging_redirect); + interp->set_logging (std::move (logfile), logging_redirect, debug_redirect); } /* Temporarily overrides the current interpreter. */ struct interp * -interp_set_temp (const char *name) +scoped_restore_interp::set_interp (const char *name) { struct ui_interp_info *ui_interp = get_current_interp_info (); struct interp *interp = interp_lookup (current_ui, name); @@ -301,14 +277,6 @@ interp_set_temp (const char *name) return old_interp; } -/* Returns the interpreter's name. */ - -const char * -interp_name (struct interp *interp) -{ - return interp->name; -} - /* Returns true if the current interp is the passed in name. */ int current_interp_named_p (const char *interp_name) @@ -317,7 +285,7 @@ current_interp_named_p (const char *interp_name) struct interp *interp = ui_interp->current_interpreter; if (interp != NULL) - return (strcmp (interp->name, interp_name) == 0); + return (strcmp (interp->name (), interp_name) == 0); return 0; } @@ -369,18 +337,11 @@ interp_exec (struct interp *interp, const char *command_str) { struct ui_interp_info *ui_interp = get_current_interp_info (); - struct gdb_exception ex; - struct interp *save_command_interp; - /* See `command_interp' for why we do this. */ - save_command_interp = ui_interp->command_interpreter; - ui_interp->command_interpreter = interp; - - ex = interp->exec (command_str); - - ui_interp->command_interpreter = save_command_interp; + scoped_restore save_command_interp + = make_scoped_restore (&ui_interp->command_interpreter, interp); - return ex; + return interp->exec (command_str); } /* A convenience routine that nulls out all the common command hooks. @@ -392,7 +353,6 @@ clear_interpreter_hooks (void) /*print_frame_more_info_hook = 0; */ deprecated_query_hook = 0; deprecated_warning_hook = 0; - deprecated_interactive_hook = 0; deprecated_readline_begin_hook = 0; deprecated_readline_hook = 0; deprecated_readline_end_hook = 0; @@ -403,28 +363,21 @@ clear_interpreter_hooks (void) } static void -interpreter_exec_cmd (char *args, int from_tty) +interpreter_exec_cmd (const char *args, int from_tty) { struct ui_interp_info *ui_interp = get_current_interp_info (); struct interp *old_interp, *interp_to_use; - char **prules = NULL; - char **trule = NULL; unsigned int nrules; unsigned int i; - struct cleanup *cleanup; if (args == NULL) error_no_arg (_("interpreter-exec command")); - prules = gdb_buildargv (args); - cleanup = make_cleanup_freeargv (prules); - - nrules = 0; - for (trule = prules; *trule != NULL; trule++) - nrules++; + gdb_argv prules (args); + nrules = prules.count (); if (nrules < 2) - error (_("usage: interpreter-exec [ ... ]")); + error (_("Usage: interpreter-exec INTERPRETER COMMAND...")); old_interp = ui_interp->current_interpreter; @@ -446,8 +399,6 @@ interpreter_exec_cmd (char *args, int from_tty) } interp_set (old_interp, 0); - - do_cleanups (cleanup); } /* See interps.h. */ @@ -457,35 +408,14 @@ interpreter_completer (struct cmd_list_element *ignore, completion_tracker &tracker, const char *text, const char *word) { - struct interp_factory *interp; - int textlen; - int ix; - - textlen = strlen (text); - for (ix = 0; - VEC_iterate (interp_factory_p, interpreter_factories, ix, interp); - ++ix) + int textlen = strlen (text); + + for (const interp_factory &interp : interpreter_factories) { - if (strncmp (interp->name, text, textlen) == 0) + if (strncmp (interp.name, text, textlen) == 0) { - char *match; - - match = (char *) xmalloc (strlen (word) + strlen (interp->name) + 1); - if (word == text) - strcpy (match, interp->name); - else if (word > text) - { - /* Return some portion of interp->name. */ - strcpy (match, interp->name + (word - text)); - } - else - { - /* Return some of text plus interp->name. */ - strncpy (match, word, text - word); - match[text - word] = '\0'; - strcat (match, interp->name); - } - tracker.add_completion (gdb::unique_xmalloc_ptr (match)); + tracker.add_completion + (make_completion_match_str (interp.name, text, word)); } } } @@ -516,8 +446,12 @@ _initialize_interpreter (void) c = add_cmd ("interpreter-exec", class_support, interpreter_exec_cmd, _("\ -Execute a command in an interpreter. It takes two arguments:\n\ +Execute a command in an interpreter.\n\ +Usage: interpreter-exec INTERPRETER COMMAND...\n\ The first argument is the name of the interpreter to use.\n\ -The second argument is the command to execute.\n"), &cmdlist); +The following arguments are the commands to execute.\n\ +A command can have arguments, separated by spaces.\n\ +These spaces must be escaped using \\ or the command\n\ +and its arguments must be enclosed in double quotes."), &cmdlist); set_cmd_completer (c, interpreter_completer); }