aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.guile/scm-lazy-string.exp
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2017-03-15 15:44:45 -0700
committerDoug Evans <dje@google.com>2017-03-16 09:31:29 -0700
commita7c0469f992721b30665ba92f4f2f74d29032a84 (patch)
treea969a42f1d28f0d33360ecbdb053d947974182d3 /gdb/testsuite/gdb.guile/scm-lazy-string.exp
parent34b433203b5f56149c27a8dfea21a921392cb158 (diff)
downloadbinutils-a7c0469f992721b30665ba92f4f2f74d29032a84.zip
binutils-a7c0469f992721b30665ba92f4f2f74d29032a84.tar.gz
binutils-a7c0469f992721b30665ba92f4f2f74d29032a84.tar.bz2
Copy lazy string handling fixes from Python.
This patch keeps the Scheme side of lazy string handling in sync with the python size, bringing over fixes for PRs python/17728, python/18439, python/18779. gdb/ChangeLog: * guile/scm-lazy-string.c (lazy_string_smob): Clarify use of LENGTH member. Change type of TYPE member to SCM. All uses updated. (lsscm_make_lazy_string_smob): Add assert. (lsscm_make_lazy_string): Flag bad length values. (lsscm_elt_type): New function. (gdbscm_lazy_string_to_value): Rewrite to use lsscm_safe_lazy_string_to_value. (lsscm_safe_lazy_string_to_value): Fix handling of TYPE_CODE_PTR. * guile/scm-value.c (gdbscm_value_to_lazy_string): Flag bad length values. Fix TYPE_CODE_PTR. Handle TYPE_CODE_ARRAY. Handle typedefs in incoming type. * guile/guile-internal.h (tyscm_scm_to_type): Declare. * guile/scm-type.c (tyscm_scm_to_type): New function. gdb/testsuite/ChangeLog: * gdb.guile/scm-value.c (main) Delete locals sptr, sn. * gdb.guile/scm-lazy-string.c: New file. * gdb.guile/scm-value.exp: Move lazy string tests to ... * gdb.guile/scm-lazy-string.exp: ... here, new file. Add more tests for pointer, array, typedef lazy strings.
Diffstat (limited to 'gdb/testsuite/gdb.guile/scm-lazy-string.exp')
-rw-r--r--gdb/testsuite/gdb.guile/scm-lazy-string.exp82
1 files changed, 82 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.guile/scm-lazy-string.exp b/gdb/testsuite/gdb.guile/scm-lazy-string.exp
new file mode 100644
index 0000000..a3ab441
--- /dev/null
+++ b/gdb/testsuite/gdb.guile/scm-lazy-string.exp
@@ -0,0 +1,82 @@
+# Copyright (C) 2008-2016 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.
+# It tests the mechanism exposing lazy strings to Guile.
+
+load_lib gdb-guile.exp
+
+standard_testfile
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
+ return
+}
+
+# Skip all tests if Guile scripting is not enabled.
+if { [skip_guile_tests] } { continue }
+
+#gdb_install_guile_utils
+#gdb_install_guile_module
+
+# The following tests require execution.
+
+if ![gdb_guile_runto_main] {
+ fail "Can't run to main"
+ return
+}
+
+gdb_breakpoint [gdb_get_line_number "break here"]
+gdb_continue_to_breakpoint "break here"
+
+gdb_scm_test_silent_cmd "gu (define null (parse-and-eval \"null\"))" 1
+
+gdb_scm_test_silent_cmd "gu (define nullstr (value->lazy-string null #:length 0))" "create a null lazy string" 1
+gdb_test "gu (print (lazy-string-length nullstr))" "= 0" "null lazy string length"
+gdb_test "gu (print (lazy-string-address nullstr))" "= 0" "null lazy string address"
+gdb_test "gu (print (lazy-string-type nullstr))" "const char \\*" "null lazy string type"
+gdb_test "gu (print (lazy-string->value nullstr))" \
+ "Out of range: cannot create a value from NULL.*Error while executing Scheme code." \
+ "create value from NULL"
+gdb_test "gu (print (lazy-string->value (value->lazy-string null #:length 3)))" \
+ "Out of range: cannot create a lazy string with address 0x0, and a non-zero length.*Error while executing Scheme code." \
+ "null lazy string with non-zero length"
+gdb_test "gu (print (value->lazy-string null #:length -2))" \
+ "Out of range: invalid length.*Error while executing Scheme code." \
+ "bad length"
+
+foreach var_spec { { "ptr" "pointer" "const char \\*" -1 } \
+ { "array" "array" "const char \\[6\\]" 6 } \
+ { "typedef_ptr" "typedef pointer" "pointer" -1 } } {
+ set var [lindex $var_spec 0]
+ set value [lindex $var_spec 1]
+ set type [lindex $var_spec 2]
+ set length [lindex $var_spec 3]
+ with_test_prefix $var {
+ gdb_test "print $var" "\"$value\""
+ gdb_scm_test_silent_cmd "gu (define $var (history-ref 0))" "get value from history" 1
+ gdb_scm_test_silent_cmd "gu (define l$var (value->lazy-string $var))" "acquire lazy string" 1
+ gdb_test "gu (print (value-type $var))" "$type" "string type name equality"
+ gdb_test "gu (print (lazy-string-type l$var))" "$type" "lazy-string type name equality"
+ gdb_test "gu (print (lazy-string-length l$var))" "$length" "lazy string length"
+ gdb_test "gu (print (lazy-string->value l$var))" "\"$value\"" "lazy string value"
+ gdb_scm_test_silent_cmd "gu (define l2$var (value->lazy-string $var #:length 2))" "acquire lazy string, length 2" 1
+ gdb_test "gu (print (lazy-string-length l2$var))" "2" "lazy string length 2"
+ gdb_test "gu (print (lazy-string->value l2$var))" "\"[string range $value 0 1]\"" "lazy string length 2 value"
+ # This test will have to wait until gdb can handle it. There's no way,
+ # currently, to internally specify an array of length zero in the C
+ # language support. PR 20786
+ #gdb_test "gu (print (lazy-string->value (value->lazy-string $var #:length 0)))" "\"\"" "empty lazy string value"
+ }
+}