From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31843 invoked by alias); 30 Aug 2011 19:18:29 -0000 Received: (qmail 31835 invoked by uid 22791); 30 Aug 2011 19:18:27 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,TW_CP X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 30 Aug 2011 19:18:06 +0000 Received: (qmail 30226 invoked from network); 30 Aug 2011 19:18:05 -0000 Received: from unknown (HELO scottsdale.localnet) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 30 Aug 2011 19:18:05 -0000 From: Pedro Alves To: gdb-patches@sourceware.org, pmuldoon@redhat.com Subject: Re: [patch] [python] Prompt substitution Date: Tue, 30 Aug 2011 19:18:00 -0000 User-Agent: KMail/1.13.6 (Linux/2.6.38-11-generic; KDE/4.7.0; x86_64; ; ) Cc: Tom Tromey References: In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <201108302018.03489.pedro@codesourcery.com> 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: 2011-08/txt/msg00629.txt.bz2 On Wednesday 20 July 2011 12:33:24, Phil Muldoon wrote: > @@ -258,7 +259,7 @@ void > display_gdb_prompt (char *new_prompt) > { > int prompt_length =3D 0; > - char *gdb_prompt =3D get_prompt (); > + char *actual_gdb_prompt =3D NULL; >=20=20 > /* Reset the nesting depth used when trace-commands is set. */ > reset_command_nest_depth (); > @@ -268,6 +269,25 @@ display_gdb_prompt (char *new_prompt) > if (!current_interp_display_prompt_p ()) > return; >=20=20 > + /* Get the prompt before the observers are called as observer hook > + functions may change the prompt. Do not call observers on an > + explicit prompt change as passed to this function, as this forms > + a temporary prompt, IE, displayed but not set. */ > + if (! new_prompt) > + { > + char *post_gdb_prompt =3D NULL; > + char *pre_gdb_prompt =3D xstrdup (get_prompt ()); > + > + observer_notify_before_prompt (pre_gdb_prompt); > + post_gdb_prompt =3D get_prompt (); > + > + /* If the observer changed the prompt, use that prompt. */ > + if (strcmp (pre_gdb_prompt, post_gdb_prompt) !=3D 0) > + actual_gdb_prompt =3D post_gdb_prompt; > +=20=20=20=20=20=20 > + xfree (pre_gdb_prompt); > + } > + > if (sync_execution && is_running (inferior_ptid)) > { > /* This is to trick readline into not trying to display the > @@ -289,27 +309,35 @@ display_gdb_prompt (char *new_prompt) > return; > } >=20=20 > - if (!new_prompt) > + /* If the observer changed the prompt, ACTUAL_GDB_PROMPT will not be > + NULL. Otherwise, either copy the existing prompt, or set it to > + NEW_PROMPT. */ > + if (! actual_gdb_prompt) > { > - /* Just use the top of the prompt stack. */ > - prompt_length =3D strlen (PREFIX (0)) + > - strlen (SUFFIX (0)) + > - strlen (gdb_prompt) + 1; > - > - new_prompt =3D (char *) alloca (prompt_length); > - > - /* Prefix needs to have new line at end. */ > - strcpy (new_prompt, PREFIX (0)); > - strcat (new_prompt, gdb_prompt); > - /* Suffix needs to have a new line at end and \032 \032 at > - beginning. */ > - strcat (new_prompt, SUFFIX (0)); > + if (! new_prompt) > + { > + /* Just use the top of the prompt stack. */ > + prompt_length =3D strlen (PREFIX (0)) + > + strlen (SUFFIX (0)) + > + strlen (get_prompt()) + 1; > + > + actual_gdb_prompt =3D (char *) alloca (prompt_length); > + > + /* Prefix needs to have new line at end. */ > + strcpy (actual_gdb_prompt, PREFIX (0)); > + strcat (actual_gdb_prompt, get_prompt()); > + /* Suffix needs to have a new line at end and \032 \032 at > + beginning. */ > + strcat (actual_gdb_prompt, SUFFIX (0)); > + } > + else > + actual_gdb_prompt =3D new_prompt;; > } I believe this to be a bit broken in the annotations (prefix and suffix !=3D NULL) case. If the observer changes the prompt, we won't print either the prefix or the suffix, but will print directly what the observer on the prompt itself only (get_prompt). Make use of Matt's bug where the python prompt only works the second time (so to trigger the strcmp): $ gdb -quiet -ex 'set prompt (foo) ' -ex 'python def prompt(x): return "(ba= r) "' -ex 'python gdb.prompt_hook =3D prompt' (foo) set annotate 2 (bar)=20 While without the hook: $ gdb -quiet (gdb) set annotate 2 =E2=96=92=E2=96=92pre-prompt (gdb)=20 =E2=96=92=E2=96=92prompt I believe it was not intended for the hook to be able to override the prefix and the suffix as well. Right? I'm fixing this along with the get-rid-of-prompt-stack change. --=20 Pedro Alves