X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Finterps.c;h=90b5b2d51536112da68d860fe50ad3d8c17ce3f2;hb=2608dbf8a3ee666ac0a7d5d7c45611d489edcda5;hp=fc14196883c2421467458240ffe3e37b6a96dd51;hpb=8c042590f977f3f8da4a8e9357ab4c11a7363438;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/interps.c b/gdb/interps.c index fc14196883..90b5b2d515 100644 --- a/gdb/interps.c +++ b/gdb/interps.c @@ -1,7 +1,6 @@ /* Manages interpreters for GDB, the GNU debugger. - Copyright (C) 2000, 2002-2003, 2007-2012 Free Software Foundation, - Inc. + Copyright (C) 2000-2015 Free Software Foundation, Inc. Written by Jim Ingham of Apple Computer, Inc. @@ -37,10 +36,7 @@ #include "event-top.h" #include "interps.h" #include "completer.h" -#include "gdb_string.h" -#include "gdb_assert.h" #include "top.h" /* For command_loop. */ -#include "exceptions.h" #include "continuations.h" /* True if the current interpreter in is async mode. See interps.h @@ -71,9 +67,6 @@ struct interp int quiet_p; }; -/* Functions local to this file. */ -static void initialize_interps (void); - /* The magic initialization routine for this module. */ void _initialize_interpreter (void); @@ -84,8 +77,6 @@ static struct interp *interp_list = NULL; static struct interp *current_interpreter = NULL; static struct interp *top_level_interpreter_ptr = NULL; -static int interpreter_initialized = 0; - /* interp_new - This allocates space for a new interpreter, fills the fields from the inputs, and returns a pointer to the interpreter. */ @@ -94,7 +85,7 @@ interp_new (const char *name, const struct interp_procs *procs) { struct interp *new_interp; - new_interp = XMALLOC (struct interp); + new_interp = XNEW (struct interp); new_interp->name = xstrdup (name); new_interp->data = NULL; @@ -102,6 +93,9 @@ interp_new (const char *name, const struct interp_procs *procs) new_interp->procs = procs; new_interp->inited = 0; + /* Check for required procs. */ + gdb_assert (procs->command_loop_proc != NULL); + return new_interp; } @@ -110,9 +104,6 @@ interp_new (const char *name, const struct interp_procs *procs) void interp_add (struct interp *interp) { - if (!interpreter_initialized) - initialize_interps (); - gdb_assert (interp_lookup (interp->name) == NULL); interp->next = interp_list; @@ -202,19 +193,11 @@ interp_set (struct interp *interp, int top_level) return 0; } - /* Finally, put up the new prompt to show that we are indeed here. - Also, display_gdb_prompt for the console does some readline magic - which is needed for the console interpreter, at least... */ - - if (!first_time) + if (!first_time && !interp_quiet_p (interp)) { - if (!interp_quiet_p (interp)) - { - xsnprintf (buffer, sizeof (buffer), - "Switching to interpreter \"%.24s\".\n", interp->name); - ui_out_text (current_uiout, buffer); - } - display_gdb_prompt (NULL); + xsnprintf (buffer, sizeof (buffer), + "Switching to interpreter \"%.24s\".\n", interp->name); + ui_out_text (current_uiout, buffer); } return 1; @@ -302,34 +285,36 @@ current_interp_named_p (const char *interp_name) return 0; } -/* This is called in display_gdb_prompt. If the proc returns a zero - value, display_gdb_prompt will return without displaying the - prompt. */ -int -current_interp_display_prompt_p (void) +/* The interpreter that is active while `interp_exec' is active, NULL + at all other times. */ +static struct interp *command_interpreter; + +/* The interpreter that was active when a command was executed. + Normally that'd always be CURRENT_INTERPRETER, except that MI's + -interpreter-exec command doesn't actually flip the current + interpreter when running its sub-command. The + `command_interpreter' global tracks when interp_exec is called + (IOW, when -interpreter-exec is called). If that is set, it is + INTERP in '-interpreter-exec INTERP "CMD"' or in 'interpreter-exec + INTERP "CMD". Otherwise, interp_exec isn't active, and so the + interpreter running the command is the current interpreter. */ + +struct interp * +command_interp (void) { - if (current_interpreter == NULL - || current_interpreter->procs->prompt_proc_p == NULL) - return 0; + if (command_interpreter != NULL) + return command_interpreter; else - return current_interpreter->procs->prompt_proc_p (current_interpreter-> - data); + return current_interpreter; } /* Run the current command interpreter's main loop. */ void current_interp_command_loop (void) { - /* Somewhat messy. For the moment prop up all the old ways of - selecting the command loop. `deprecated_command_loop_hook' - should be deprecated. */ - if (deprecated_command_loop_hook != NULL) - deprecated_command_loop_hook (); - else if (current_interpreter != NULL - && current_interpreter->procs->command_loop_proc != NULL) - current_interpreter->procs->command_loop_proc (current_interpreter->data); - else - cli_command_loop (); + gdb_assert (current_interpreter != NULL); + + current_interpreter->procs->command_loop_proc (current_interpreter->data); } int @@ -352,20 +337,24 @@ interp_set_quiet (struct interp *interp, int quiet) /* interp_exec - This executes COMMAND_STR in the current interpreter. */ -int -interp_exec_p (struct interp *interp) -{ - return interp->procs->exec_proc != NULL; -} struct gdb_exception interp_exec (struct interp *interp, const char *command_str) { - if (interp->procs->exec_proc != NULL) - { - return interp->procs->exec_proc (interp->data, command_str); - } - return exception_none; + struct gdb_exception ex; + struct interp *save_command_interp; + + gdb_assert (interp->procs->exec_proc != NULL); + + /* See `command_interp' for why we do this. */ + save_command_interp = command_interpreter; + command_interpreter = interp; + + ex = interp->procs->exec_proc (interp->data, command_str); + + command_interpreter = save_command_interp; + + return ex; } /* A convenience routine that nulls out all the common command hooks. @@ -387,18 +376,6 @@ clear_interpreter_hooks (void) deprecated_target_wait_hook = 0; deprecated_call_command_hook = 0; deprecated_error_begin_hook = 0; - deprecated_command_loop_hook = 0; -} - -/* This is a lazy init routine, called the first time the interpreter - module is used. I put it here just in case, but I haven't thought - of a use for it yet. I will probably bag it soon, since I don't - think it will be necessary. */ -static void -initialize_interps (void) -{ - interpreter_initialized = 1; - /* Don't know if anything needs to be done here... */ } static void @@ -410,12 +387,13 @@ interpreter_exec_cmd (char *args, int from_tty) unsigned int nrules; unsigned int i; int old_quiet, use_quiet; + struct cleanup *cleanup; if (args == NULL) error_no_arg (_("interpreter-exec command")); prules = gdb_buildargv (args); - make_cleanup_freeargv (prules); + cleanup = make_cleanup_freeargv (prules); nrules = 0; for (trule = prules; *trule != NULL; trule++) @@ -453,11 +431,14 @@ interpreter_exec_cmd (char *args, int from_tty) interp_set (old_interp, 0); interp_set_quiet (interp_to_use, use_quiet); interp_set_quiet (old_interp, old_quiet); + + do_cleanups (cleanup); } /* List the possible interpreters which could complete the given text. */ static VEC (char_ptr) * -interpreter_completer (struct cmd_list_element *ignore, char *text, char *word) +interpreter_completer (struct cmd_list_element *ignore, + const char *text, const char *word) { int textlen; VEC (char_ptr) *matches = NULL;