| # Copyright 2003 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 2 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, write to the Free Software |
| # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| |
| # This file was written by Jim Ingham <jingham@apple.com> |
| |
| # This file tests some aspects of the APPLE LOCAL var-path-expression |
| # commands, particularly with classes & base classes. |
| |
| # This file is part of the gdb testsuite |
| |
| load_lib mi-support.exp |
| set MIFLAGS "-i=mi1" |
| |
| if $tracelevel then { |
| strace $tracelevel |
| } |
| |
| gdb_exit |
| if [mi_gdb_start] { |
| continue |
| } |
| |
| set notQuote {\[^"\]*} |
| proc compare_var_and_expression {varObj value {type {}} {typecode {}}} { |
| global expect_out hex notQuote |
| |
| if {[string equal $type ""]} { set type $notQuote } |
| if {[string equal $typecode ""]} { set typecode $notQuote } |
| |
| mi_gdb_test "-var-evaluate-expression $varObj" \ |
| "\\^done,value=(\"$value\")" \ |
| "get the value of $varObj" |
| set originalValue $expect_out(2,string) |
| |
| mi_gdb_test "-var-info-path-expression $varObj" \ |
| {\^done,path_expr=("[^"]*")} \ |
| "get path expression for $varObj" |
| set expression $expect_out(2,string) |
| |
| mi_gdb_test "-var-create - * $expression" \ |
| "\\^done,name=\"(\[^\"\]*)\",numchild=\"0\",type=\"$type\",typecode=\"$typecode\",dynamic_type=\"\[^\"\]*\",resolved_type=\"$type\",in_scope=\"true\",block_start_addr=\"$hex\",block_end_addr=\"$hex\"" \ |
| "Create varobj for $varObj expression" |
| set exprVar $expect_out(2,string) |
| |
| mi_gdb_test "-var-evaluate-expression $exprVar" \ |
| "\\^done,value=(\"$value\")" \ |
| "Get value for $varObj expression" |
| set exprValue $expect_out(2,string) |
| |
| if {[string equal $originalValue $exprValue]} { |
| pass "varobj and expression have same value for $varObj" |
| } else { |
| fail "varobj and expression have same value for $varObj" |
| } |
| } |
| |
| set testfile "var-path-expr" |
| set srcfile ${testfile}.cpp |
| set binfile ${objdir}/${subdir}/${testfile} |
| if { [gdb_compile "$srcdir/$subdir/$srcfile" "${binfile}" executable {debug c++}] != "" } { |
| gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." |
| } |
| |
| mi_delete_breakpoints |
| mi_gdb_reinitialize_dir $srcdir/$subdir |
| mi_gdb_load ${binfile} |
| |
| mi_run_to_main |
| |
| set lineNum 99 |
| mi_gdb_test "-break-insert $lineNum" \ |
| "\\^done,bkpt=\{number=\"$decimal\",.*func=\"main\",.*file=\".*$srcfile\".*\}" \ |
| "breakpoint in main after all the work's done" |
| |
| mi_continue_to 2 main {} var-path-expr.cpp $lineNum {run to break in main} |
| |
| # In this section we drill down to a class member that is a polymorphic object, and make sure |
| # we can print a member from the real dynamic type of the object. |
| |
| mi_gdb_test {-var-create fooVar * myFoo} \ |
| {\^done,name="fooVar",.*numchild="1",.*type="Foo".*} \ |
| "create varobj for fooVar" |
| |
| mi_gdb_test {-var-list-children fooVar} \ |
| {\^done,numchild="1",children=\[child={name="fooVar.private",.*exp="private",.*type="",typecode="FAKE_CHILD",.*dynamic_type="",resolved_type=""}\]} \ |
| "list children of fooVar" |
| |
| mi_gdb_test {-var-list-children fooVar.private} \ |
| {\^done,numchild="1",children=\[child={name="fooVar.private.contents",exp="contents",numchild="2",type="class Container \*",typecode="PTR",dynamic_type="FancyIntContainer \*",resolved_type="class Container \*"}\]} \ |
| "list children of fooVar.private" |
| |
| mi_gdb_test {-var-list-children fooVar.private.contents} \ |
| {\^done,numchild="2",children=\[child={name="fooVar.private.contents.IntContainer",exp="IntContainer",numchild="3",type="IntContainer \*",typecode="PTR",dynamic_type="",resolved_type="IntContainer \*"},child={name="fooVar.private.contents.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \ |
| "list children of fooVar.private.contents" |
| |
| mi_gdb_test {-var-list-children fooVar.private.contents.private} \ |
| {\^done,numchild="1",children=\[child={name="fooVar.private.contents.private.multiplier",exp="multiplier",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int"}\]} \ |
| "list children of fooVar.private.contents.private" |
| |
| compare_var_and_expression fooVar.private.contents.private.multiplier 10 int INT |
| |
| # Now we'll look at the base classes of this polymorphic object, and make sure we get the expressions |
| # for them right as well. |
| |
| mi_gdb_test {-var-list-children fooVar.private.contents.IntContainer} \ |
| {\^done,numchild="3",children=\[child={name="fooVar.private.contents.IntContainer.Container",exp="Container",numchild="1",type="Container \*",typecode="PTR",dynamic_type="",resolved_type="Container \*"},child={name="fooVar.private.contents.IntContainer.SomeOtherStuff",exp="SomeOtherStuff",numchild="1",type="SomeOtherStuff \*",typecode="PTR",dynamic_type="",resolved_type="SomeOtherStuff \*"},child={name="fooVar.private.contents.IntContainer.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \ |
| "Create varobj for IntContainerfooVar.private.contents.IntContainer" |
| |
| mi_gdb_test {-var-list-children fooVar.private.contents.IntContainer.SomeOtherStuff} \ |
| {\^done,numchild="1",children=\[child={name="fooVar.private.contents.IntContainer.SomeOtherStuff.private",exp="private",numchild="2",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \ |
| "Create varobj for fooVar.private.contents.IntContainer.SomeOtherStuff" |
| |
| mi_gdb_test {-var-list-children fooVar.private.contents.IntContainer.SomeOtherStuff.private} \ |
| {\^done,numchild="2",children=\[child={name="fooVar.private.contents.IntContainer.SomeOtherStuff.private.myInt",exp="myInt",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int"},child={name="fooVar.private.contents.IntContainer.SomeOtherStuff.private.myDouble",exp="myDouble",numchild="0",type="double",typecode="FLT",dynamic_type="",resolved_type="double"}\]} \ |
| "Create varobj for fooVar.private.contents.IntContainer.SomeOtherStuff.private" |
| |
| compare_var_and_expression fooVar.private.contents.IntContainer.SomeOtherStuff.private.myDouble 5 double FLT |
| |
| # Now chase through the class heirarchy where we have an object, not a pointer to an object. |
| |
| mi_gdb_test {-var-create contVar * myContainer} \ |
| "\\^done,name=\"contVar\",numchild=\"2\",type=\"FancyIntContainer\",typecode=\"STRUCT\",dynamic_type=\"\",resolved_type=\"FancyIntContainer\",in_scope=\"true\",block_start_addr=\"$hex\",block_end_addr=\"$hex\"" \ |
| "Create myContainer varobj" |
| |
| mi_gdb_test {-var-list-children contVar} \ |
| {\^done,numchild="2",children=\[child={name="contVar.IntContainer",exp="IntContainer",numchild="3",type="IntContainer",typecode="STRUCT",dynamic_type="",resolved_type="IntContainer"},child={name="contVar.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \ |
| "List children of contVar" |
| |
| mi_gdb_test {-var-list-children contVar.IntContainer} \ |
| {\^done,numchild="3",children=\[child={name="contVar.IntContainer.Container",exp="Container",numchild="1",type="Container",typecode="STRUCT",dynamic_type="",resolved_type="Container"},child={name="contVar.IntContainer.SomeOtherStuff",exp="SomeOtherStuff",numchild="1",type="SomeOtherStuff",typecode="STRUCT",dynamic_type="",resolved_type="SomeOtherStuff"},child={name="contVar.IntContainer.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \ |
| "List children of contVar.intContainer" |
| |
| mi_gdb_test {-var-list-children contVar.IntContainer.private} \ |
| {\^done,numchild="1",children=\[child={name="contVar.IntContainer.private.intValue",exp="intValue",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int"}\]} \ |
| "List children of contVar.IntContainer.private" |
| |
| compare_var_and_expression contVar.IntContainer.private.intValue 5 int INT |
| |
| mi_gdb_test {-var-list-children contVar.IntContainer.Container} \ |
| {\^done,numchild="1",children=\[child={name="contVar.IntContainer.Container.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \ |
| "List children of contVar.IntContainer.Container" |
| |
| mi_gdb_test {-var-list-children contVar.IntContainer.Container.private} \ |
| {\^done,numchild="1",children=\[child={name="contVar.IntContainer.Container.private.errorNo",exp="errorNo",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int"}\]} \ |
| "List children of contVar.IntContainer.Container.private" |
| |
| compare_var_and_expression contVar.IntContainer.Container.private.errorNo -1 int INT |
| |
| |