From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17118 invoked by alias); 30 Apr 2012 16:26:23 -0000 Received: (qmail 17091 invoked by uid 22791); 30 Apr 2012 16:26:19 -0000 X-SWARE-Spam-Status: No, hits=-2.7 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,KHOP_THREADED,RCVD_IN_DNSWL_NONE,RCVD_IN_HOSTKARMA_YE,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from elasmtp-scoter.atl.sa.earthlink.net (HELO elasmtp-scoter.atl.sa.earthlink.net) (209.86.89.67) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 30 Apr 2012 16:25:57 +0000 Received: from [68.96.200.16] (helo=macbook2.local) by elasmtp-scoter.atl.sa.earthlink.net with esmtpa (Exim 4.67) (envelope-from ) id 1SOtQC-00073H-Kg for gdb-patches@sourceware.org; Mon, 30 Apr 2012 12:25:56 -0400 Message-ID: <4F9EBD0D.2090701@earthlink.net> Date: Mon, 30 Apr 2012 16:55:00 -0000 From: Stan Shebs User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20120327 Thunderbird/11.0.1 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: Re: GDB/MI and ">" prompts References: <83vckviv3b.fsf@gnu.org> <20120419154853.GM25623@adacore.com> <83sjfzitxx.fsf@gnu.org> <83r4vjitnj.fsf@gnu.org> <20120419185329.GO25623@adacore.com> <83mx67ikxm.fsf@gnu.org> <837gx7hhxa.fsf@gnu.org> <83lilg6ysn.fsf@gnu.org> In-Reply-To: <83lilg6ysn.fsf@gnu.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-ELNK-Trace: ae6f8838ff913eba0cc1426638a40ef67e972de0d01da940bea2a9cca7649358ddf8a9035abdf7c1350badd9bab72f9c350badd9bab72f9c350badd9bab72f9c X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-04/txt/msg01077.txt.bz2 On 4/28/12 1:33 AM, Eli Zaretskii wrote: > Ping! Is the patch below OK for committing? It seems logically correct... Did you try Eclipse? This is the kind of thing that CDT's MI and console bits can be sensitive to, even though it's not supposed to be. :-) If you haven't tried it, doing some breakpoint commands (both from breakpoint window and console window) with any recent released Eclipse should be a sufficient sniff test. If Eclipse is good, then this is OK to commit. Stan > >> Date: Sun, 22 Apr 2012 19:04:17 +0300 >> From: Eli Zaretskii >> Cc: gdb-patches@sourceware.org >> >> [I moved this to gdb-patches, since I propose a patch below.] >> >>> Date: Thu, 19 Apr 2012 22:24:53 +0300 >>> From: Eli Zaretskii >>> Cc: gdb@sourceware.org >>> >>> The crux of my question was why non-interactive mode does display a >>> prompt while the interactive one doesn't. >> To answer my own question, here's why: >> >> char * >> command_line_input (char *prompt_arg, int repeat, char *annotation_suffix) >> { >> ... >> /* Don't use fancy stuff if not talking to stdin. */ >> if (deprecated_readline_hook&& input_from_terminal_p ()) >> { >> rl = (*deprecated_readline_hook) (local_prompt); >> } >> else if (command_editing_p&& input_from_terminal_p ()) >> { >> rl = gdb_readline_wrapper (local_prompt); >> } >> else >> { >> rl = gdb_readline (local_prompt); >> } >> >> Now, the code is clear, but I cannot say I understand the logic. If >> the input is from terminal, we ask (inside gdb_readline_wrapper) the >> current interpreter whether to show the prompt. But if input is _not_ >> from terminal, we display the prompt unconditionally (inside >> gdb_readline). How does this make sense? >> >>> Date: Thu, 19 Apr 2012 11:53:29 -0700 >>> From: Joel Brobecker >>> Cc: gdb@sourceware.org >>> >>> The other thing that occured to me was that, perhaps, we should instead >>> be switching the interpreter while executing the console command, >> I arrived to the same conclusion, eventually. See below. >> >>> but I doubt that would be correct. >> Why not? The patch below works for me. >> >> --- gdb/interps.c~0 2012-01-06 06:43:17.000000000 +0200 >> +++ gdb/interps.c 2012-04-22 08:55:27.056588400 +0300 >> @@ -253,6 +253,18 @@ interp_ui_out (struct interp *interp) >> return current_interpreter->procs->ui_out_proc (current_interpreter); >> } >> >> +/* Temporarily overrides the current interpreter. */ >> +struct interp * >> +interp_set_temp (const char *name) >> +{ >> + struct interp *interp = interp_lookup (name); >> + struct interp *old_interp = current_interpreter; >> + >> + if (interp) >> + current_interpreter = interp; >> + return old_interp; >> +} >> + >> /* Returns the interpreter's cookie. */ >> >> void * >> --- gdb/interps.h~0 2012-01-06 06:43:17.000000000 +0200 >> +++ gdb/interps.h 2012-04-22 08:42:05.687879800 +0300 >> @@ -69,6 +69,7 @@ >> extern struct ui_out *interp_ui_out (struct interp *interp); >> extern void *interp_data (struct interp *interp); >> extern const char *interp_name (struct interp *interp); >> +extern struct interp *interp_set_temp (const char *name); >> >> extern int current_interp_named_p (const char *name); >> extern int current_interp_display_prompt_p (void); >> --- gdb/cli/cli-script.c~0 2012-01-06 06:43:32.000000000 +0200 >> +++ gdb/cli/cli-script.c 2012-04-22 09:04:23.533807200 +0300 >> @@ -1178,6 +1178,12 @@ recurse_read_control_structure (char * ( >> return ret; >> } >> >> +static void >> +restore_interp (void *arg) >> +{ >> + interp_set_temp (interp_name ((struct interp *)arg)); >> +} >> + >> /* Read lines from the input stream and accumulate them in a chain of >> struct command_line's, which is then returned. For input from a >> terminal, the special command "end" is used to mark the end of the >> @@ -1210,8 +1216,21 @@ read_command_lines (char *prompt_arg, in >> } >> } >> >> - head = read_command_lines_1 (read_next_line, parse_commands, >> - validator, closure); >> + >> + /* Reading commands assumes the CLI behavior, so temporarily >> + override the current interpreter with CLI. */ >> + if (current_interp_named_p (INTERP_CONSOLE)) >> + head = read_command_lines_1 (read_next_line, parse_commands, >> + validator, closure); >> + else >> + { >> + struct interp *old_interp = interp_set_temp (INTERP_CONSOLE); >> + struct cleanup *old_chain = make_cleanup (restore_interp, old_interp); >> + >> + head = read_command_lines_1 (read_next_line, parse_commands, >> + validator, closure); >> + do_cleanups (old_chain); >> + } >> >> if (deprecated_readline_end_hook&& from_tty&& input_from_terminal_p ()) >> { >>