diff options
author | Simon Marchi <simon.marchi@ericsson.com> | 2014-12-15 11:38:03 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@ericsson.com> | 2014-12-15 11:40:00 -0500 |
commit | 38bcc89d48a20af944fe0d51eff3980f7dc8a88e (patch) | |
tree | 7375d3dd9a01fad783811546cd0e17b234751ad9 /gdb/top.c | |
parent | 89ed8ea187a460bc746a41f08fa8ee986716743b (diff) | |
download | fsf-binutils-gdb-38bcc89d48a20af944fe0d51eff3980f7dc8a88e.zip fsf-binutils-gdb-38bcc89d48a20af944fe0d51eff3980f7dc8a88e.tar.gz fsf-binutils-gdb-38bcc89d48a20af944fe0d51eff3980f7dc8a88e.tar.bz2 |
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.
gdb/ChangeLog:
* defs.h (gdb_readline): Constify argument.
(gdb_readline_wrapper): Same.
(command_line_input): Same.
(deprecated_readline_hook): Same.
* top.c (deprecated_readline_hook): Same.
(gdb_readline): Same.
(gdb_readline_wrapper): Same.
(command_line_input): Constify argument. Pass prompt to
called functions instead of local_prompt, overwriting prompt
if using annotations.
* event-top.h (display_gdb_prompt): Constify argument.
* event-top.c (display_gdb_prompt): Same.
* python/py-gdb-readline.c (gdbpy_readline_wrapper): Constify
argument if building with Python 3.4 and up.
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Diffstat (limited to 'gdb/top.c')
-rw-r--r-- | gdb/top.c | 30 |
1 files changed, 17 insertions, 13 deletions
@@ -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) |