This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] MI: Allow non-raw varobj evaluation


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0625771b9e29116dc1fb0b597501f18e4bb0e18c

commit 0625771b9e29116dc1fb0b597501f18e4bb0e18c
Author: Leszek Swirski via gdb-patches <gdb-patches@sourceware.org>
Date:   Thu Feb 1 23:23:28 2018 -0500

    MI: Allow non-raw varobj evaluation
    
    Make the MI variable object expression evaluation, with the
    -var-evaluate-expression command, recursively call pretty printers, to
    match the output of normal expression printing.
    
    Consider the following code:
    
            struct Foo { int val; };
            struct Wrapper { Foo foo; };
    
            int main() {
                    Wrapper w;
                    w.foo.val = 23;
            }
    
    and this pretty printer file:
    
            import gdb.printing
    
            class FooPrinter:
              def __init__(self, val):
                self.val = val
              def to_string(self):
                return "Foo" + str(self.val["val"])
    
            class WrapperPrinter:
              def __init__(self, val):
                self.val = val
              def to_string(self):
                return self.val["foo"]
    
            test_printer = gdb.printing.RegexpCollectionPrettyPrinter("test")
            test_printer.add_printer('Foo', '^Foo$', FooPrinter)
            test_printer.add_printer('Wrapper', '^Wrapper$', WrapperPrinter)
    
            gdb.printing.register_pretty_printer(None, test_printer)
    
    Setting a breakpoint at the end of the function, we call the following commands:
    
            -enable-pretty-printing
            ^done
    
            -var-create var_w @ w
            ^done,name="var_w",numchild="0",value="{val = 23}",type="Wrapper",dynamic="1",has_more="0"
            -var-create var_w_foo @ w.foo
            ^done,name="var_w_foo",numchild="0",value="Foo23",type="Foo",dynamic="1",has_more="0"
    
            -var-evaluate-expression var_w
            ^done,value="{val = 23}"
            -var-evaluate-expression var_w_foo
            ^done,value="Foo23"
    
            -data-evaluate-expression w
            ^done,value="Foo23"
            -data-evaluate-expression w.foo
            ^done,value="Foo23"
    
    So, in the -var-evaluate-expression var_w case, we print the "raw" value
    of w.foo, while in the -data-evaluate-expression w case, we print the
    pretty printed w.foo value. After this patch, all of the above print
    "Foo23".
    
    gdb/ChangeLog:
    
    	* varobj.c (varobj_formatted_print_options): Allow recursive
    	pretty printing if pretty printing is enabled.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.python/py-prettyprint.c
    	(struct to_string_returns_value_inner,
    	struct to_string_returns_value_wrapper): New.
    	(main): Add tsrvw variable.
    	* gdb.python/py-prettyprint.py (ToStringReturnsValueInner,
    	ToStringReturnsValueWrapper): New classes.
    	(register_pretty_printers): Register new pretty-printers.
    	* gdb.python/py-prettyprint.exp (run_lang_tests): Test printing
    	recursive pretty printer.
    	* gdb.python/py-mi.exp: Likewise.

Diff:
---
 gdb/ChangeLog                               |  5 +++++
 gdb/testsuite/ChangeLog                     | 14 ++++++++++++++
 gdb/testsuite/gdb.python/py-mi.exp          | 10 ++++++++++
 gdb/testsuite/gdb.python/py-prettyprint.c   | 11 +++++++++++
 gdb/testsuite/gdb.python/py-prettyprint.exp |  4 ++++
 gdb/testsuite/gdb.python/py-prettyprint.py  | 26 +++++++++++++++++++++++++-
 gdb/varobj.c                                |  2 +-
 7 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7081f9e..b341da9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 2018-02-01  Leszek Swirski  <leszeks@google.com>
 
+	* varobj.c (varobj_formatted_print_options): Allow recursive
+	pretty printing if pretty printing is enabled.
+
+2018-02-01  Leszek Swirski  <leszeks@google.com>
+
 	* c-exp.y (lex_one_token, classify_name, yylex): Don't classify
 	names after a structop as a filename.
 
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 1558ed1..0251584 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,17 @@
+2018-02-01  Simon Marchi  <simon.marchi@polymtl.ca>
+	    Leszek Swirski  <leszeks@google.com>
+
+	* gdb.python/py-prettyprint.c
+	(struct to_string_returns_value_inner,
+	struct to_string_returns_value_wrapper): New.
+	(main): Add tsrvw variable.
+	* gdb.python/py-prettyprint.py (ToStringReturnsValueInner,
+	ToStringReturnsValueWrapper): New classes.
+	(register_pretty_printers): Register new pretty-printers.
+	* gdb.python/py-prettyprint.exp (run_lang_tests): Test printing
+	recursive pretty printer.
+	* gdb.python/py-mi.exp: Likewise.
+
 2018-02-01  Leszek Swirski  <leszeks@google.com>
 
 	* gdb.cp/filename.cc, gdb.cp/filename.exp: Test that member
diff --git a/gdb/testsuite/gdb.python/py-mi.exp b/gdb/testsuite/gdb.python/py-mi.exp
index bbe1266..f982947 100644
--- a/gdb/testsuite/gdb.python/py-mi.exp
+++ b/gdb/testsuite/gdb.python/py-mi.exp
@@ -295,6 +295,16 @@ mi_gdb_test "-var-evaluate-expression me" \
 mi_create_dynamic_varobj children_as_list children_as_list 1 \
     "printer whose children are returned as a list"
 
+# Test that when a pretty-printer returns a gdb.Value in its to_string, we call
+# the pretty-printer of that value too.
+mi_create_varobj_checked tsrvw tsrvw  \
+    "struct to_string_returns_value_wrapper" \
+    "create tsrvw varobj"
+mi_check_varobj_value tsrvw "Inner to_string 1989" "check tsrvw varobj value"
+mi_gdb_test "-data-evaluate-expression tsrvw" \
+    "\\^done,value=\"Inner to_string 1989\"" \
+    "check tsrvw expression value"
+
 # Regression test for bug 14741.
 mi_continue_to_line \
     [gdb_get_line_number {breakpoint bug 14741} ${srcfile}] \
diff --git a/gdb/testsuite/gdb.python/py-prettyprint.c b/gdb/testsuite/gdb.python/py-prettyprint.c
index fc0d829..35ef5e0 100644
--- a/gdb/testsuite/gdb.python/py-prettyprint.c
+++ b/gdb/testsuite/gdb.python/py-prettyprint.c
@@ -112,6 +112,16 @@ class Fake
 };
 #endif
 
+struct to_string_returns_value_inner
+{
+  int val;
+};
+
+struct to_string_returns_value_wrapper
+{
+  struct to_string_returns_value_inner inner;
+};
+
 struct substruct {
   int a;
   int b;
@@ -284,6 +294,7 @@ main ()
   struct lazystring estring, estring2, estring3;
   struct hint_error hint_error;
   struct children_as_list children_as_list;
+  struct to_string_returns_value_wrapper tsrvw = { { 1989 } };
 
   nstype.elements = narray;
   nstype.len = 0;
diff --git a/gdb/testsuite/gdb.python/py-prettyprint.exp b/gdb/testsuite/gdb.python/py-prettyprint.exp
index 5df6f69..2671cb8 100644
--- a/gdb/testsuite/gdb.python/py-prettyprint.exp
+++ b/gdb/testsuite/gdb.python/py-prettyprint.exp
@@ -64,6 +64,10 @@ proc run_lang_tests {exefile lang} {
     
     gdb_test "print arraystruct" " = {$nl *y = 7, *$nl *x = { a=<23> b=<$hex>,  a=<24> b=<$hex>} *$nl *}"
 
+    # Test that when a pretty-printer returns a gdb.Value in its to_string, we
+    # call the pretty-printer of that value too.
+    gdb_test "print tsrvw" " = Inner to_string 1989"
+
     if {$lang == "c++"} {
 	gdb_test "print cps" "=  a=<8> b=<$hex>"
 	gdb_test "print cpss" " = {$nl *zss = 9, *$nl *s =  a=<10> b=<$hex>$nl}"
diff --git a/gdb/testsuite/gdb.python/py-prettyprint.py b/gdb/testsuite/gdb.python/py-prettyprint.py
index ea6caae..7357f05 100644
--- a/gdb/testsuite/gdb.python/py-prettyprint.py
+++ b/gdb/testsuite/gdb.python/py-prettyprint.py
@@ -84,6 +84,25 @@ class NoStringContainerPrinter (object):
     def children(self):
         return _iterator_except (self.val['elements'], self.val['len'])
 
+# See ToStringReturnsValueWrapper.
+class ToStringReturnsValueInner:
+
+    def __init__(self, val):
+        self.val = val
+
+    def to_string(self):
+        return 'Inner to_string {}'.format(int(self.val['val']))
+
+# Test a printer that returns a gdb.Value in its to_string.  That gdb.Value
+# also has its own pretty-printer.
+class ToStringReturnsValueWrapper:
+
+    def __init__(self, val):
+        self.val = val
+
+    def to_string(self):
+        return self.val['inner']
+
 class pp_s (object):
     def __init__(self, val):
         self.val = val
@@ -316,7 +335,12 @@ def register_pretty_printers ():
     pretty_printers_dict[re.compile ('^string_repr$')] = string_print
     pretty_printers_dict[re.compile ('^container$')] = ContainerPrinter
     pretty_printers_dict[re.compile ('^justchildren$')] = NoStringContainerPrinter
-    
+
+    pretty_printers_dict[re.compile ('^struct to_string_returns_value_inner$')] = ToStringReturnsValueInner
+    pretty_printers_dict[re.compile ('^to_string_returns_value_inner$')] = ToStringReturnsValueInner
+    pretty_printers_dict[re.compile ('^struct to_string_returns_value_wrapper$')] = ToStringReturnsValueWrapper
+    pretty_printers_dict[re.compile ('^to_string_returns_value_wrapper$')] = ToStringReturnsValueWrapper
+
     pretty_printers_dict[re.compile ('^struct ns$')]  = pp_ns
     pretty_printers_dict[re.compile ('^ns$')]  = pp_ns
 
diff --git a/gdb/varobj.c b/gdb/varobj.c
index b6a2d8f..f23243f 100644
--- a/gdb/varobj.c
+++ b/gdb/varobj.c
@@ -2274,7 +2274,7 @@ varobj_formatted_print_options (struct value_print_options *opts,
 {
   get_formatted_print_options (opts, format_code[(int) format]);
   opts->deref_ref = 0;
-  opts->raw = 1;
+  opts->raw = !pretty_printing;
 }
 
 std::string


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]