X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fguile%2Fguile.c;h=39bec8724f46d5fa1d49878275d3f988fa7c4cab;hb=268a13a5a3f7c6b9b6ffc5ac2d1b24eb41f3fbdc;hp=3a19eecc2a7c95e49ad4121e9f51360ac2784024;hpb=ddb6d633875b76f9d772af901118233fc498253a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/guile/guile.c b/gdb/guile/guile.c index 3a19eecc2a..39bec8724f 100644 --- a/gdb/guile/guile.c +++ b/gdb/guile/guile.c @@ -1,6 +1,6 @@ /* General GDB/Guile code. - Copyright (C) 2014-2016 Free Software Foundation, Inc. + Copyright (C) 2014-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -30,7 +30,7 @@ #include "top.h" #include "extension-priv.h" #include "utils.h" -#include "version.h" +#include "gdbsupport/version.h" #ifdef HAVE_GUILE #include "guile.h" #include "guile-internal.h" @@ -46,8 +46,10 @@ int gdbscm_guile_major_version; int gdbscm_guile_minor_version; int gdbscm_guile_micro_version; +#ifdef HAVE_GUILE /* The guile subdirectory within gdb's data-directory. */ static const char *guile_datadir; +#endif /* Declared constants and enum for guile exception printing. */ const char gdbscm_print_excp_none[] = "none"; @@ -161,12 +163,9 @@ const struct extension_language_ops guile_extension_ops = /* Implementation of the gdb "guile-repl" command. */ static void -guile_repl_command (char *arg, int from_tty) +guile_repl_command (const char *arg, int from_tty) { - struct cleanup *cleanup; - - cleanup = make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore restore_async = make_scoped_restore (¤t_ui->async, 0); arg = skip_spaces (arg); @@ -183,8 +182,6 @@ guile_repl_command (char *arg, int from_tty) dont_repeat (); gdbscm_enter_repl (); } - - do_cleanups (cleanup); } /* Implementation of the gdb "guile" command. @@ -194,34 +191,25 @@ guile_repl_command (char *arg, int from_tty) TODO: Add the result to Guile's history? */ static void -guile_command (char *arg, int from_tty) +guile_command (const char *arg, int from_tty) { - struct cleanup *cleanup; - - cleanup = make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore restore_async = make_scoped_restore (¤t_ui->async, 0); arg = skip_spaces (arg); if (arg && *arg) { - char *msg = gdbscm_safe_eval_string (arg, 1); + gdb::unique_xmalloc_ptr msg = gdbscm_safe_eval_string (arg, 1); if (msg != NULL) - { - make_cleanup (xfree, msg); - error ("%s", msg); - } + error ("%s", msg.get ()); } else { - struct command_line *l = get_command_line (guile_control, ""); + counted_command_line l = get_command_line (guile_control, ""); - make_cleanup_free_command_lines (&l); - execute_control_command_untraced (l); + execute_control_command_untraced (l.get ()); } - - do_cleanups (cleanup); } /* Given a command_line, return a command string suitable for passing @@ -262,24 +250,16 @@ static void gdbscm_eval_from_control_command (const struct extension_language_defn *extlang, struct command_line *cmd) { - char *script, *msg; - struct cleanup *cleanup; + char *script; - if (cmd->body_count != 1) + if (cmd->body_list_1 != nullptr) error (_("Invalid \"guile\" block structure.")); - cleanup = make_cleanup (null_cleanup, NULL); - - script = compute_scheme_string (cmd->body_list[0]); - msg = gdbscm_safe_eval_string (script, 0); + script = compute_scheme_string (cmd->body_list_0.get ()); + gdb::unique_xmalloc_ptr msg = gdbscm_safe_eval_string (script, 0); xfree (script); if (msg != NULL) - { - make_cleanup (xfree, msg); - error ("%s", msg); - } - - do_cleanups (cleanup); + error ("%s", msg.get ()); } /* Read a file as Scheme code. @@ -311,56 +291,33 @@ gdbscm_execute_gdb_command (SCM command_scm, SCM rest) int from_tty = 0, to_string = 0; const SCM keywords[] = { from_tty_keyword, to_string_keyword, SCM_BOOL_F }; char *command; - char *result = NULL; - struct cleanup *cleanups; - struct gdb_exception except = exception_none; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#tt", command_scm, &command, rest, &from_tty_arg_pos, &from_tty, &to_string_arg_pos, &to_string); - /* Note: The contents of "command" may get modified while it is - executed. */ - cleanups = make_cleanup (xfree, command); - - TRY + return gdbscm_wrap ([=] { - struct cleanup *inner_cleanups; + gdb::unique_xmalloc_ptr command_holder (command); + std::string to_string_res; - inner_cleanups = make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore restore_async = make_scoped_restore (¤t_ui->async, + 0); - prevent_dont_repeat (); + scoped_restore preventer = prevent_dont_repeat (); if (to_string) - result = execute_command_to_string (command, from_tty); + to_string_res = execute_command_to_string (command, from_tty, false); else - { - execute_command (command, from_tty); - result = NULL; - } + execute_command (command, from_tty); /* Do any commands attached to breakpoint we stopped at. */ bpstat_do_actions (); - do_cleanups (inner_cleanups); - } - CATCH (ex, RETURN_MASK_ALL) - { - except = ex; - } - END_CATCH - - do_cleanups (cleanups); - GDBSCM_HANDLE_GDB_EXCEPTION (except); - - if (result) - { - SCM r = gdbscm_scm_from_c_string (result); - xfree (result); - return r; - } - return SCM_UNSPECIFIED; + if (to_string) + return gdbscm_scm_from_c_string (to_string_res.c_str ()); + return SCM_UNSPECIFIED; + }); } /* (data-directory) -> string */ @@ -409,7 +366,7 @@ gdbscm_target_config (void) commands. */ static void -guile_repl_command (char *arg, int from_tty) +guile_repl_command (const char *arg, int from_tty) { arg = skip_spaces (arg); if (arg && *arg) @@ -418,7 +375,7 @@ guile_repl_command (char *arg, int from_tty) } static void -guile_command (char *arg, int from_tty) +guile_command (const char *arg, int from_tty) { arg = skip_spaces (arg); if (arg && *arg) @@ -427,11 +384,9 @@ guile_command (char *arg, int from_tty) { /* Even if Guile isn't enabled, we still have to slurp the command list to the corresponding "end". */ - struct command_line *l = get_command_line (guile_control, ""); - struct cleanup *cleanups = make_cleanup_free_command_lines (&l); + counted_command_line l = get_command_line (guile_control, ""); - execute_control_command_untraced (l); - do_cleanups (cleanups); + execute_control_command_untraced (l.get ()); } } @@ -446,7 +401,7 @@ static struct cmd_list_element *info_guile_list; /* Function for use by 'set guile' prefix command. */ static void -set_guile_command (char *args, int from_tty) +set_guile_command (const char *args, int from_tty) { help_list (set_guile_list, "set guile ", all_commands, gdb_stdout); } @@ -454,7 +409,7 @@ set_guile_command (char *args, int from_tty) /* Function for use by 'show guile' prefix command. */ static void -show_guile_command (char *args, int from_tty) +show_guile_command (const char *args, int from_tty) { cmd_show_list (show_guile_list, from_tty, ""); } @@ -464,7 +419,7 @@ show_guile_command (char *args, int from_tty) "info scheme" with no args. */ static void -info_guile_command (char *args, int from_tty) +info_guile_command (const char *args, int from_tty) { printf_unfiltered (_("\"info guile\" must be followed" " by the name of an info command.\n")); @@ -613,7 +568,7 @@ handle_boot_error (void *boot_scm_file, SCM key, SCM args) warning (_("Could not complete Guile gdb module initialization from:\n" "%s.\n" "Limited Guile support is available.\n" - "Suggest passing --data-directory=/path/to/gdb/data-directory.\n"), + "Suggest passing --data-directory=/path/to/gdb/data-directory."), (const char *) boot_scm_file); return SCM_UNSPECIFIED; @@ -626,7 +581,6 @@ static void initialize_scheme_side (void) { char *boot_scm_path; - char *msg; guile_datadir = concat (gdb_datadir, SLASH_STRING, "guile", (char *) NULL); boot_scm_path = concat (guile_datadir, SLASH_STRING, "gdb", @@ -746,6 +700,9 @@ gdbscm_set_backtrace (int enable) #endif /* HAVE_GUILE */ +/* See guile.h. */ +cmd_list_element *guile_cmd_element = nullptr; + /* Install the various gdb commands used by Guile. */ static void @@ -771,7 +728,7 @@ This command is only a placeholder.") /* Since "help guile" is easy to type, and intuitive, we add general help in using GDB+Guile to this command. */ - add_com ("guile", class_obscure, guile_command, + guile_cmd_element = add_com ("guile", class_obscure, guile_command, #ifdef HAVE_GUILE _("\ Evaluate one or more Guile expressions.\n\ @@ -836,9 +793,6 @@ message == an error message without a stack will be printed."), &set_guile_list, &show_guile_list); } -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_guile; - void _initialize_guile (void) {