From patchwork Mon Dec 8 16:44:19 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 4108 Received: (qmail 858 invoked by alias); 8 Dec 2014 16:44:25 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 841 invoked by uid 89); 8 Dec 2014 16:44:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: usevmg21.ericsson.net Received: from usevmg21.ericsson.net (HELO usevmg21.ericsson.net) (198.24.6.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Mon, 08 Dec 2014 16:44:22 +0000 Received: from EUSAAHC008.ericsson.se (Unknown_Domain [147.117.188.96]) by usevmg21.ericsson.net (Symantec Mail Security) with SMTP id D4.8E.25146.CE875845; Mon, 8 Dec 2014 11:09:49 +0100 (CET) Received: from [142.133.110.254] (147.117.188.8) by smtps-am.internal.ericsson.com (147.117.188.96) with Microsoft SMTP Server (TLS) id 14.3.195.1; Mon, 8 Dec 2014 11:44:19 -0500 Message-ID: <5485D563.9010209@ericsson.com> Date: Mon, 8 Dec 2014 11:44:19 -0500 From: Simon Marchi User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-Version: 1.0 To: Pedro Alves , Subject: Re: [PATCH] Fix build with Python 3.4 (PR python/16784) References: <1417009634-2356-1-git-send-email-simon.marchi@ericsson.com> <5480A49F.1010904@redhat.com> In-Reply-To: <5480A49F.1010904@redhat.com> X-IsSubscribed: yes On 2014-12-04 01:14 PM, Pedro Alves wrote: > On 11/26/2014 01:47 PM, Simon Marchi wrote: >> The type of the function pointer PyOS_ReadlineFunctionPointer (part of the >> Python C API), which we use, slightly changed starting with Python 3.4. The >> signature when from > > "went from" > >> I changed the signature of deprecated_readline_hook. I would've changed any >> user of it, but it seems like nothing is using it, > > You'd probably find it in the insight/gdbtk code. > >> --- a/gdb/python/py-gdb-readline.c >> +++ b/gdb/python/py-gdb-readline.c >> @@ -26,10 +26,13 @@ >> cases, sys_stdin and sys_stdout are always stdin and stdout >> respectively, as far as I can tell; they are ignored and >> command_line_input is used instead. */ >> - >> static char * > > Don't lose the empty line. > >> gdbpy_readline_wrapper (FILE *sys_stdin, FILE *sys_stdout, >> +#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 4 >> + const char *prompt) >> +#else >> char *prompt) >> +#endif >> > >> @@ -938,6 +938,8 @@ command_line_input (char *prompt_arg, int repeat, char *annotation_suffix) >> strcat (local_prompt, "\n\032\032"); >> strcat (local_prompt, annotation_suffix); >> strcat (local_prompt, "\n"); >> + >> + prompt_arg = local_prompt; > > I think it'd be even clearer if we avoided changing > the variable that is called "arg". How about we add: > > const char *prompt = prompt_arg; > > at the top, and then use "prompt" throughout, where > you're using "prompt_arg"? > > The 'local_prompt' variable could move to the "annotation_level > 1" > block too, for clarity. > > Thanks, > Pedro Alves Hi Pedro, Here is the v2, with changes according to your comments. From 8ccae8f39992e7515711d6fc193f1d68cb47eaf8 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Tue, 25 Nov 2014 21:02:15 -0500 Subject: [PATCH v2] Fix build with Python 3.4 (PR python/16784) The type of the function pointer PyOS_ReadlineFunctionPointer (part of the Python C API), which we use, slightly changed starting with Python 3.4. The signature went from PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, char *); to PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); The parameter that changed is the prompt text. This commits adjust gdb accordingly by making the prompt_arg parameter const, as well as the fallouts of that. I needed to rework how annotations are added to the prompt, since the it is now const. If annotations are enabled, it will make a copy of the prompt overwrite the prompt variable that is used throughout the function. Otherwise, no copy is done and the original prompt_arg value is passed. I changed the signature of deprecated_readline_hook. I would've changed any user of it, but it seems like nothing is using it, Built-tested with python 2.7.x, 3.3.y and 3.4.z. New in v2: * Formatting. * Don't change the prompt_arg argument, use a local variable instead. * Move local_prompt in a narrower scope. Signed-off-by: Simon Marchi --- gdb/defs.h | 8 ++++---- gdb/event-top.c | 2 +- gdb/event-top.h | 2 +- gdb/python/py-gdb-readline.c | 4 ++++ gdb/top.c | 30 +++++++++++++++++------------- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/gdb/defs.h b/gdb/defs.h index 6b63b6a..24e1e3b 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -259,11 +259,11 @@ extern void print_transfer_performance (struct ui_file *stream, typedef void initialize_file_ftype (void); -extern char *gdb_readline (char *); +extern char *gdb_readline (const char *); -extern char *gdb_readline_wrapper (char *); +extern char *gdb_readline_wrapper (const char *); -extern char *command_line_input (char *, int, char *); +extern char *command_line_input (const char *, int, char *); extern void print_prompt (void); @@ -636,7 +636,7 @@ extern void (*deprecated_warning_hook) (const char *, va_list) extern void (*deprecated_interactive_hook) (void); extern void (*deprecated_readline_begin_hook) (char *, ...) ATTRIBUTE_FPTR_PRINTF_1; -extern char *(*deprecated_readline_hook) (char *); +extern char *(*deprecated_readline_hook) (const char *); extern void (*deprecated_readline_end_hook) (void); extern void (*deprecated_register_changed_hook) (int regno); extern void (*deprecated_context_hook) (int); diff --git a/gdb/event-top.c b/gdb/event-top.c index cb438ac..55caf72 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -288,7 +288,7 @@ gdb_rl_callback_handler_reinstall (void) 3. On prompting for pagination. */ void -display_gdb_prompt (char *new_prompt) +display_gdb_prompt (const char *new_prompt) { char *actual_gdb_prompt = NULL; struct cleanup *old_chain; diff --git a/gdb/event-top.h b/gdb/event-top.h index 919287e..0c8baae 100644 --- a/gdb/event-top.h +++ b/gdb/event-top.h @@ -27,7 +27,7 @@ struct cmd_list_element; /* Exported functions from event-top.c. FIXME: these should really go into top.h. */ -extern void display_gdb_prompt (char *new_prompt); +extern void display_gdb_prompt (const char *new_prompt); void gdb_setup_readline (void); void gdb_disable_readline (void); extern void async_init_signals (void); diff --git a/gdb/python/py-gdb-readline.c b/gdb/python/py-gdb-readline.c index d98a196..ab419bc 100644 --- a/gdb/python/py-gdb-readline.c +++ b/gdb/python/py-gdb-readline.c @@ -29,7 +29,11 @@ static char * gdbpy_readline_wrapper (FILE *sys_stdin, FILE *sys_stdout, +#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 4 + const char *prompt) +#else char *prompt) +#endif { int n; char *p = NULL, *q; diff --git a/gdb/top.c b/gdb/top.c index 83d858a..7f38562 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -215,7 +215,7 @@ void (*deprecated_warning_hook) (const char *, va_list); window and it can close it. */ void (*deprecated_readline_begin_hook) (char *, ...); -char *(*deprecated_readline_hook) (char *); +char *(*deprecated_readline_hook) (const char *); void (*deprecated_readline_end_hook) (void); /* Called as appropriate to notify the interface that we have attached @@ -620,7 +620,7 @@ prevent_dont_repeat (void) A NULL return means end of file. */ char * -gdb_readline (char *prompt_arg) +gdb_readline (const char *prompt_arg) { int c; char *result; @@ -812,7 +812,7 @@ gdb_readline_wrapper_cleanup (void *arg) } char * -gdb_readline_wrapper (char *prompt) +gdb_readline_wrapper (const char *prompt) { struct cleanup *back_to; struct gdb_readline_wrapper_cleanup *cleanup; @@ -912,14 +912,14 @@ gdb_rl_operate_and_get_next (int count, int key) simple input as the user has requested. */ char * -command_line_input (char *prompt_arg, int repeat, char *annotation_suffix) +command_line_input (const char *prompt_arg, int repeat, char *annotation_suffix) { static char *linebuffer = 0; static unsigned linelength = 0; + const char *prompt = prompt_arg; char *p; char *p1; char *rl; - char *local_prompt = prompt_arg; char *nline; char got_eof = 0; @@ -929,15 +929,19 @@ command_line_input (char *prompt_arg, int repeat, char *annotation_suffix) if (annotation_level > 1 && instream == stdin) { - local_prompt = alloca ((prompt_arg == NULL ? 0 : strlen (prompt_arg)) + char *local_prompt; + + local_prompt = alloca ((prompt == NULL ? 0 : strlen (prompt)) + strlen (annotation_suffix) + 40); - if (prompt_arg == NULL) + if (prompt == NULL) local_prompt[0] = '\0'; else - strcpy (local_prompt, prompt_arg); + strcpy (local_prompt, prompt); strcat (local_prompt, "\n\032\032"); strcat (local_prompt, annotation_suffix); strcat (local_prompt, "\n"); + + prompt = local_prompt; } if (linebuffer == 0) @@ -979,15 +983,15 @@ 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); + rl = (*deprecated_readline_hook) (prompt); } else if (command_editing_p && input_from_terminal_p ()) { - rl = gdb_readline_wrapper (local_prompt); + rl = gdb_readline_wrapper (prompt); } else { - rl = gdb_readline (local_prompt); + rl = gdb_readline (prompt); } if (annotation_level > 1 && instream == stdin) @@ -1021,7 +1025,7 @@ command_line_input (char *prompt_arg, int repeat, char *annotation_suffix) break; p--; /* Put on top of '\'. */ - local_prompt = (char *) 0; + prompt = NULL; } #ifdef STOP_SIGNAL @@ -1064,7 +1068,7 @@ command_line_input (char *prompt_arg, int repeat, char *annotation_suffix) if (expanded < 0) { xfree (history_value); - return command_line_input (prompt_arg, repeat, + return command_line_input (prompt, repeat, annotation_suffix); } if (strlen (history_value) > linelength)