summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <patrick@parcs.ath.cx>2015-04-26 14:13:59 -0400
committerPatrick Palka <patrick@parcs.ath.cx>2015-05-13 09:26:54 -0400
commitebfd00d210ca6190239140b250499e194fd5af20 (patch)
tree84e4818522e594061a05093d548e86c36b90e659
parente69c76f4bfaf4c1b72f020f811afe03a5f7cd831 (diff)
downloadbinutils-gdb-ebfd00d210ca6190239140b250499e194fd5af20.tar.gz
Fix PR gdb/17820
This patch is a comprehensive fix for PR 17820 which reports that using "set history size unlimited" inside one's gdbinit file doesn't really work. There are three small changes in this patch. The most important change this patch makes is to decode the argument of the "size" subcommand using add_setshow_zuinteger_unlimited_cmd() instead of using add_setshow_uinteger_cmd(). The new decoder takes an int * and maps unlimited to -1 whereas the old decoder takes an unsigned int * and maps unlimited to UINT_MAX. Using the new decoder simplifies our handling of unlimited and makes it easier to interface with readline which itself expects a signed-int history size. The second change is the factoring of the [stifle|unstifle]_history logic into a common function which is now used by both init_history() and set_history_size_command(). This is technically the change that fixes the PR itself. Thirdly, this patch initializes history_size_setshow_var to -2 to mean that the variable has not been set yet. Now init_history() tests for -2 instead of 0 to determine whether to give the variable a default value. This means that having "set history size 0" in one's gdbinit file will actually keep the history size at 0 and not reset it to 256. gdb/ChangeLog: PR gdb/17820 * top.c (history_size_setshow_var): Change type to signed. Initialize to -2. Update documentation. (set_readline_history_size): Define. (set_history_size_command): Use it. Remove logic for handling out-of-range sizes. (init_history): Use set_readline_history_size(). Test for a value of -2 instead of 0 when determining whether to set a default history size. (init_main): Decode the argument of the "size" command as a zuinteger_unlimited. gdb/testsuite/ChangeLog: PR gdb/17820 * gdb.base/gdbinit-history.exp: New test. * gdb.base/gdbinit-history/unlimited/.gdbinit: New file. * gdb.base/gdbinit-history/zero/.gdbinit: New file.
-rw-r--r--gdb/ChangeLog14
-rw-r--r--gdb/testsuite/ChangeLog7
-rw-r--r--gdb/testsuite/gdb.base/gdbinit-history.exp51
-rw-r--r--gdb/testsuite/gdb.base/gdbinit-history/unlimited/.gdbinit1
-rw-r--r--gdb/testsuite/gdb.base/gdbinit-history/zero/.gdbinit1
-rw-r--r--gdb/top.c51
6 files changed, 95 insertions, 30 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 61bc846c5ad..082886e188d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2015-05-13 Patrick Palka <patrick@parcs.ath.cx>
+
+ PR gdb/17820
+ * top.c (history_size_setshow_var): Change type to signed.
+ Initialize to -2. Update documentation.
+ (set_readline_history_size): Define.
+ (set_history_size_command): Use it. Remove logic for handling
+ out-of-range sizes.
+ (init_history): Use set_readline_history_size(). Test for a
+ value of -2 instead of 0 when determining whether to set a
+ default history size.
+ (init_main): Decode the argument of the "size" command as a
+ zuinteger_unlimited.
+
2015-05-12 Doug Evans <dje@google.com>
* dwarf2read.c (struct file_entry): Tweak comments.
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 52140bd9536..db8f3ce83a2 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2015-05-13 Patrick Palka <patrick@parcs.ath.cx>
+
+ PR gdb/17820
+ * gdb.base/gdbinit-history.exp: New test.
+ * gdb.base/gdbinit-history/unlimited/.gdbinit: New file.
+ * gdb.base/gdbinit-history/zero/.gdbinit: New file.
+
2015-05-09 Siva Chandra Reddy <sivachandra@google.com>
* gdb.python/py-xmethods.cc: Enhance test case.
diff --git a/gdb/testsuite/gdb.base/gdbinit-history.exp b/gdb/testsuite/gdb.base/gdbinit-history.exp
new file mode 100644
index 00000000000..474680a7e13
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdbinit-history.exp
@@ -0,0 +1,51 @@
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+# Test the setting of "history size" via $HOME/.gdbinit
+
+
+# Check that the history size is properly set to SIZE when reading the .gdbinit
+# file located in HOME.
+
+proc test_gdbinit_history_setting { home size } {
+ global env
+ global INTERNAL_GDBFLAGS
+ global srcdir
+ global subdir
+
+ set old_home $env(HOME)
+ set env(HOME) "$srcdir/$subdir/$home"
+ set saved_internal_gdbflags $INTERNAL_GDBFLAGS
+ set INTERNAL_GDBFLAGS [string map {"-nx" ""} $INTERNAL_GDBFLAGS]
+
+ gdb_exit
+ gdb_start
+
+ gdb_test "show history size" "The size of the command history is $size."
+
+ if { $size == "0" } {
+ gdb_test_no_output "show commands"
+ } elseif { $size != "1" } {
+ gdb_test "show commands" " . show history size\r\n . show commands"
+ }
+
+ set INTERNAL_GDBFLAGS $saved_internal_gdbflags
+ set $env(HOME) $old_home
+}
+
+test_gdbinit_history_setting "gdbinit-history/unlimited" "unlimited"
+test_gdbinit_history_setting "gdbinit-history/zero" "0"
diff --git a/gdb/testsuite/gdb.base/gdbinit-history/unlimited/.gdbinit b/gdb/testsuite/gdb.base/gdbinit-history/unlimited/.gdbinit
new file mode 100644
index 00000000000..6604d8fd39c
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdbinit-history/unlimited/.gdbinit
@@ -0,0 +1 @@
+set history size unlimited
diff --git a/gdb/testsuite/gdb.base/gdbinit-history/zero/.gdbinit b/gdb/testsuite/gdb.base/gdbinit-history/zero/.gdbinit
new file mode 100644
index 00000000000..7cd6b24e93c
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdbinit-history/zero/.gdbinit
@@ -0,0 +1 @@
+set history size 0
diff --git a/gdb/top.c b/gdb/top.c
index deb4108987b..74e1e071370 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -687,8 +687,8 @@ show_write_history_p (struct ui_file *file, int from_tty,
}
/* The variable associated with the "set/show history size"
- command. */
-static unsigned int history_size_setshow_var;
+ command. The value -1 means unlimited, and -2 means undefined. */
+static int history_size_setshow_var = -2;
static void
show_history_size (struct ui_file *file, int from_tty,
@@ -1610,34 +1610,26 @@ show_commands (char *args, int from_tty)
}
}
-/* Called by do_setshow_command. */
-static void
-set_history_size_command (char *args, int from_tty, struct cmd_list_element *c)
-{
- /* Readline's history interface works with 'int', so it can only
- handle history sizes up to INT_MAX. The command itself is
- uinteger, so UINT_MAX means "unlimited", but we only get that if
- the user does "set history size 0" -- "set history size <UINT_MAX>"
- throws out-of-range. */
- if (history_size_setshow_var > INT_MAX
- && history_size_setshow_var != UINT_MAX)
- {
- unsigned int new_value = history_size_setshow_var;
+/* Update the size of our command history file to HISTORY_SIZE.
- /* Restore previous value before throwing. */
- if (history_is_stifled ())
- history_size_setshow_var = history_max_entries;
- else
- history_size_setshow_var = UINT_MAX;
+ A HISTORY_SIZE of -1 stands for unlimited. */
- error (_("integer %u out of range"), new_value);
- }
+static void
+set_readline_history_size (int history_size)
+{
+ gdb_assert (history_size >= -1);
- /* Commit the new value to readline's history. */
- if (history_size_setshow_var == UINT_MAX)
+ if (history_size == -1)
unstifle_history ();
else
- stifle_history (history_size_setshow_var);
+ stifle_history (history_size);
+}
+
+/* Called by do_setshow_command. */
+static void
+set_history_size_command (char *args, int from_tty, struct cmd_list_element *c)
+{
+ set_readline_history_size (history_size_setshow_var);
}
void
@@ -1705,12 +1697,10 @@ init_history (void)
history_size_setshow_var = var;
}
/* If the init file hasn't set a size yet, pick the default. */
- else if (history_size_setshow_var == 0)
+ else if (history_size_setshow_var == -2)
history_size_setshow_var = 256;
- /* Note that unlike "set history size 0", "HISTSIZE=0" really sets
- the history size to 0... */
- stifle_history (history_size_setshow_var);
+ set_readline_history_size (history_size_setshow_var);
tmpenv = getenv ("GDBHISTFILE");
if (tmpenv)
@@ -1859,7 +1849,8 @@ Without an argument, saving is enabled."),
show_write_history_p,
&sethistlist, &showhistlist);
- add_setshow_uinteger_cmd ("size", no_class, &history_size_setshow_var, _("\
+ add_setshow_zuinteger_unlimited_cmd ("size", no_class,
+ &history_size_setshow_var, _("\
Set the size of the command history,"), _("\
Show the size of the command history,"), _("\
ie. the number of previous commands to keep a record of.\n\