diff options
author | Tom Tromey <tromey@redhat.com> | 2009-05-28 01:09:20 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2009-05-28 01:09:20 +0000 |
commit | b6313243984b74ee6772dd8273b0e6073ad1815b (patch) | |
tree | 79db018823e681990855f3c379c40e2cc7de9f6e /gdb/testsuite | |
parent | a6bac58e84001d33b9540e208e9ca6d6ab265bf3 (diff) | |
download | gdb-b6313243984b74ee6772dd8273b0e6073ad1815b.zip gdb-b6313243984b74ee6772dd8273b0e6073ad1815b.tar.gz gdb-b6313243984b74ee6772dd8273b0e6073ad1815b.tar.bz2 |
gdb
2009-05-27 Vladimir Prus <vladimir@codesourcery.com>
Tom Tromey <tromey@redhat.com>
Thiago Jung Bauermann <bauerman@br.ibm.com>
* mi/mi-main.c (mi_cmd_list_features): List "python" feature.
* varobj.h (varobj_set_visualizer): Declare.
(varobj_get_display_hint): Likewise.
(varobj_update_result_t) <children_changed, value_installed>: New
fields.
* mi/mi-cmds.c (mi_cmds): Add var-set-visualizer.
* mi/mi-cmds.h (mi_cmd_var_set_visualizer,
mi_cmd_var_set_child_range): Declare.
* mi/mi-cmd-var.c (mi_cmd_var_set_visualizer): New function.
(mi_cmd_var_list_children): Emit display hint.
(varobj_update_one): Emit display hint. Handle dynamic children.
* python/python.c (GdbMethods): Add "default_visualizer".
* python/python-internal.h (apply_varobj_pretty_printer,
gdbpy_get_varobj_pretty_printer, gdbpy_get_display_hint):
Declare.
(gdbpy_default_visualizer): Likewise.
* varobj.c: Include python.h, python-internal.h.
(PyObject): New typedef.
(struct varobj) <children_requested, pretty_printer>: New fields.
(varobj_create): Call install_default_visualizer.
(instantiate_pretty_printer): New function.
(varobj_set_display_format): Update.
(varobj_get_display_hint): New function.
(update_dynamic_varobj_children): New function.
(varobj_get_num_children): Handle dynamic children.
(varobj_list_children): Likewise.
(install_new_value): Likewise.
(varobj_add_child): New function.
(install_visualizer): Likewise.
(install_default_visualizer): Likewise.
(varobj_set_visualizer): Likewise.
(varobj_update): Handle dynamic children.
(create_child): Use create_child_with_value.
(create_child_with_value): New function.
(value_get_print_value): Call pretty printer. Add value_formatter
argument.
(c_value_of_variable): Update.
(varobj_invalidate): Always free all_rootvarobj.
* python/python-prettyprint.c (apply_varobj_pretty_printer): New
function.
(gdbpy_get_varobj_pretty_printer): Likewise.
(gdbpy_default_visualizer): Likewise.
gdb/doc
2009-05-27 Tom Tromey <tromey@redhat.com>
* gdb.texinfo (GDB/MI Miscellaneous Commands): Document "python"
feature.
(GDB/MI Variable Objects): Document -var-set-visualizer.
gdb/testsuite
2009-05-27 Tom Tromey <tromey@redhat.com>
Thiago Jung Bauermann <bauerman@br.ibm.com>
* lib/mi-support.exp (mi_varobj_update_dynamic): New proc.
(mi_child_regexp): Likewise.
(mi_list_varobj_children_range): Likewise.
(mi_get_features): Likewise.
(mi_list_varobj_children): Rewrite.
* gdb.python/python-mi.exp: New file.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/python-mi.exp | 99 | ||||
-rw-r--r-- | gdb/testsuite/lib/mi-support.exp | 105 |
3 files changed, 190 insertions, 24 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index f1b0464..c4b0fab 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,15 @@ 2009-05-27 Tom Tromey <tromey@redhat.com> Thiago Jung Bauermann <bauerman@br.ibm.com> + + * lib/mi-support.exp (mi_varobj_update_dynamic): New proc. + (mi_child_regexp): Likewise. + (mi_list_varobj_children_range): Likewise. + (mi_get_features): Likewise. + (mi_list_varobj_children): Rewrite. + * gdb.python/python-mi.exp: New file. + +2009-05-27 Tom Tromey <tromey@redhat.com> + Thiago Jung Bauermann <bauerman@br.ibm.com> Phil Muldoon <pmuldoon@redhat.com> Paul Pluzhnikov <ppluzhnikov@google.com> diff --git a/gdb/testsuite/gdb.python/python-mi.exp b/gdb/testsuite/gdb.python/python-mi.exp new file mode 100644 index 0000000..3258810 --- /dev/null +++ b/gdb/testsuite/gdb.python/python-mi.exp @@ -0,0 +1,99 @@ +# Copyright (C) 2008, 2009 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 Python-based +# pretty-printing for MI. + +load_lib mi-support.exp +set MIFLAGS "-i=mi2" + +gdb_exit +if [mi_gdb_start] { + continue +} + +set testfile "python-prettyprint" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DMI}] != "" } { + untested mi2-var-child.exp + return -1 +} + +mi_delete_breakpoints +mi_gdb_reinitialize_dir $srcdir/$subdir +mi_gdb_load ${binfile} + +if {[lsearch -exact [mi_get_features] python] < 0} { + unsupported "python support is disabled" + return -1 +} + +mi_runto main + +mi_gdb_test "python execfile ('${srcdir}/${subdir}/${testfile}.py')" "" + +mi_continue_to_line [gdb_get_line_number {MI breakpoint here} ${testfile}.c] \ + "step to breakpoint" + +mi_create_floating_varobj container c "create container varobj" + +mi_list_varobj_children container { +} "examine container children=0" + +mi_next "next over update 1" + +mi_varobj_update_dynamic container { + { {container.\[0\]} {\[0\]} 0 int } +} "varobj update 1" + +mi_next "next over update 2" + +mi_varobj_update_dynamic container { + { {container.\[0\]} {\[0\]} 0 int } + { {container.\[1\]} {\[1\]} 0 int } +} "varobj update 2" + +mi_gdb_test "-var-set-visualizer container None" \ + "\\^done" \ + "clear visualizer" + +mi_gdb_test "-var-update container" \ + "\\^done,changelist=\\\[\\\]" \ + "varobj update after clearing" + +mi_gdb_test "-var-set-visualizer container gdb.default_visualizer" \ + "\\^done" \ + "choose default visualizer" + +mi_varobj_update_dynamic container { + { {container.\[0\]} {\[0\]} 0 int } + { {container.\[1\]} {\[1\]} 0 int } +} "varobj update after choosing default" + +mi_gdb_test "-var-set-visualizer container ContainerPrinter" \ + "\\^done" \ + "choose visualizer using expression" + +mi_varobj_update_dynamic container { + { {container.\[0\]} {\[0\]} 0 int } + { {container.\[1\]} {\[1\]} 0 int } +} "varobj update after choosing via expression" + +mi_continue_to_line \ + [gdb_get_line_number {Another MI breakpoint} ${testfile}.c] \ + "step to second breakpoint" + +mi_varobj_update_with_type_change container int 0 "update after type change" diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp index c31111b..ad78360 100644 --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp @@ -1249,6 +1249,21 @@ proc mi_varobj_update_with_type_change { name new_type new_children testname } { mi_gdb_test "-var-update $name" $er $testname } +# Update a dynamic varobj named NAME. CHILDREN is a list of children, +# in the same form as mi_list_varobj_children. TESTNAME is the name +# of the test. +proc mi_varobj_update_dynamic {name children testname} { + set children_exp_j [mi_child_regexp $children 0] + + set er "\\^done,changelist=\\\[" + + append er "{name=\"$name\",in_scope=\"true\",type_changed=\"false\"" + append er ",children=\\\[$children_exp_j.*\\\]}\\\]" + + verbose -log "Expecting: $er" + mi_gdb_test "-var-update $name" $er $testname +} + proc mi_check_varobj_value { name value testname } { mi_gdb_test "-var-evaluate-expression $name" \ @@ -1256,6 +1271,42 @@ proc mi_check_varobj_value { name value testname } { $testname } +# Helper proc which constructs a child regexp for +# mi_list_varobj_children and mi_varobj_update_dynamic. +proc mi_child_regexp {children add_child} { + set children_exp {} + set whatever "\"\[^\"\]+\"" + + if {$add_child} { + set pre "child=" + } else { + set pre "" + } + + foreach item $children { + + set name [lindex $item 0] + set exp [lindex $item 1] + set numchild [lindex $item 2] + if {[llength $item] == 5} { + set type [lindex $item 3] + set value [lindex $item 4] + + lappend children_exp\ + "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",value=\"$value\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}" + } elseif {[llength $item] == 4} { + set type [lindex $item 3] + + lappend children_exp\ + "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}" + } else { + lappend children_exp\ + "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\"(,thread-id=\"\[0-9\]+\")?}" + } + } + return [join $children_exp ","] +} + # Check the results of the: # # -var-list-children VARNAME @@ -1277,39 +1328,23 @@ proc mi_check_varobj_value { name value testname } { # have no value. # proc mi_list_varobj_children { varname children testname } { + mi_list_varobj_children_range $varname [llength $children] $children \ + $testname +} +# Like mi_list_varobj_children, but assumes that a subrange has been +# selected with -var-set-child-range. NUMCHILDREN is the total number +# of children. +proc mi_list_varobj_children_range {varname numchildren children testname} { set options "" if {[llength $varname] == 2} { set options [lindex $varname 1] set varname [lindex $varname 0] } - set numchildren [llength $children] - set children_exp {} set whatever "\"\[^\"\]+\"" - foreach item $children { - - set name [lindex $item 0] - set exp [lindex $item 1] - set numchild [lindex $item 2] - if {[llength $item] == 5} { - set type [lindex $item 3] - set value [lindex $item 4] - - lappend children_exp\ - "child={name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",value=\"$value\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}" - } elseif {[llength $item] == 4} { - set type [lindex $item 3] - - lappend children_exp\ - "child={name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}" - } else { - lappend children_exp\ - "child={name=\"$name\",exp=\"$exp\",numchild=\"$numchild\"(,thread-id=\"\[0-9\]+\")?}" - } - } - set children_exp_j [join $children_exp ","] + set children_exp_j [mi_child_regexp $children 1] if {$numchildren} { set expected "\\^done,numchild=\".*\",children=\\\[$children_exp_j.*\\\]" } { @@ -1782,3 +1817,25 @@ proc mi_check_thread_states { xstates test } { verbose -log "expecting: $pattern" mi_gdb_test "-thread-info" $pattern $test } + +# Return a list of MI features supported by this gdb. +proc mi_get_features {} { + global expect_out mi_gdb_prompt + + send_gdb "-list-features\n" + + gdb_expect { + -re "\\^done,features=\\\[(.*)\\\]\r\n$mi_gdb_prompt$" { + regsub -all -- \" $expect_out(1,string) "" features + return [split $features ,] + } + -re ".*\r\n$mi_gdb_prompt$" { + verbose -log "got $expect_out(buffer)" + return "" + } + timeout { + verbose -log "timeout in mi_gdb_prompt" + return "" + } + } +} |