Fix bug in -var-evaluate-expression
authorTom Tromey <tromey@adacore.com>
Thu, 31 Aug 2023 19:58:49 +0000 (13:58 -0600)
committerTom Tromey <tromey@adacore.com>
Thu, 7 Sep 2023 20:04:53 +0000 (14:04 -0600)
This bug points out that if one uses -var-set-visualizer with "None"
-- to disable a pretty-printer for a varobj -- then
-var-evaluate-expression will still use pretty-printing.

This is a combination of bugs.  First, setting the visualizer does not
update the display text; and second, computing the display text should
use "raw" when Python is available but no visualizer is desired.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=11738
Reviewed-by: Keith Seitz <keiths@redhat.com>
gdb/testsuite/gdb.python/py-varobj.c
gdb/testsuite/gdb.python/py-varobj.exp
gdb/testsuite/gdb.python/py-varobj.py
gdb/varobj.c

index 894ce8fca069e19caaf201fd872de6865aae5367..88d0e74b7e078072441f524dd67a6ce9dc81671d 100644 (file)
@@ -21,6 +21,8 @@ struct test {
 
 struct test tval = {23};
 
+struct test *test_ptr = &tval;
+
 int main () {
   return 0;
 }
index 0e0978352a52e08fcddb15ebcd5694d7f3e5aa4b..f1eb35265b0b401dc2e20c2e2f766d6b15272575 100644 (file)
@@ -47,3 +47,15 @@ mi_gdb_test "-var-create tval * tval" \
 
 mi_gdb_test "-var-list-children --all-values tval" \
     ".*value=.*flicker.*"
+
+mi_gdb_test "-var-create test_ptr * test_ptr" \
+   "\\^done.*"
+
+mi_gdb_test "-var-evaluate-expression test_ptr" \
+   "\\^done,value=\"map\""
+mi_gdb_test "-var-set-visualizer test_ptr None" \
+    "\\^done.*"
+# mi_gdb_test "-var-update test_ptr" ".*"
+mi_gdb_test "-var-evaluate-expression test_ptr" \
+   "\\^done,value=\"$hex.*\"" \
+    "evaluate without visualizer"
index bc31a19829791885d17e0c8885de2663b3216a8a..578ad14d4df1798153f1bac48021de7ef640040f 100644 (file)
@@ -12,6 +12,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+import gdb
 import gdb.printing
 
 
@@ -30,6 +31,7 @@ def str_lookup_function(val):
     lookup_tag = val.type.tag
     if lookup_tag == "test":
         return TestPrinter(val)
-
+    if val.type.code == gdb.TYPE_CODE_PTR and val.type.target().tag == "test":
+        return TestPrinter(val.dereference())
 
 gdb.printing.register_pretty_printer(None, str_lookup_function)
index 3ae8d728e82c856badda7abcc42e3c8cff74364b..a4fcbffc3116ed246a29e13cab1c98b79e806169 100644 (file)
@@ -1393,6 +1393,9 @@ varobj_set_visualizer (struct varobj *var, const char *visualizer)
   /* If there are any children now, wipe them.  */
   varobj_delete (var, 1 /* children only */);
   var->num_children = -1;
+
+  /* Also be sure to reset the print value.  */
+  varobj_set_display_format (var, var->format);
 #else
   error (_("Python support required"));
 #endif
@@ -2212,6 +2215,12 @@ varobj_value_get_print_value (struct value *value,
                return "{...}";
            }
        }
+      else
+       {
+         /* If we've made it here, we don't want a pretty-printer --
+            if we had one, it would already have been used.  */
+         opts.raw = true;
+       }
     }
 #endif