Convert D printing to value-based API
authorTom Tromey <tom@tromey.com>
Fri, 13 Mar 2020 23:39:52 +0000 (17:39 -0600)
committerTom Tromey <tom@tromey.com>
Sat, 14 Mar 2020 00:03:40 +0000 (18:03 -0600)
As with Rust and Go, it was straightforward to convert D to the
value-based API directly.

gdb/ChangeLog
2020-03-13  Tom Tromey  <tom@tromey.com>

* d-valprint.c (dynamic_array_type): Call d_value_print_inner.
(d_value_print_inner): New function.
* d-lang.h (d_value_print_inner): Declare.
* d-lang.c (d_language_defn): Use d_value_print_inner.

gdb/ChangeLog
gdb/d-lang.c
gdb/d-lang.h
gdb/d-valprint.c

index 862d4bc7e93e1aaff10ca23c6ccd5f478a75189f..892ad87838d374f56eeb546ab6bd85fec638f5a8 100644 (file)
@@ -1,3 +1,10 @@
+2020-03-13  Tom Tromey  <tom@tromey.com>
+
+       * d-valprint.c (dynamic_array_type): Call d_value_print_inner.
+       (d_value_print_inner): New function.
+       * d-lang.h (d_value_print_inner): Declare.
+       * d-lang.c (d_language_defn): Use d_value_print_inner.
+
 2020-03-13  Tom Tromey  <tom@tromey.com>
 
        * go-valprint.c (go_value_print_inner): New function.
index 71dc4c6feb24950d85ac2c23e5f75ba95daea352..4dbcf53bba77157e7c82f04b75e788ccc1bb8931 100644 (file)
@@ -225,7 +225,7 @@ extern const struct language_defn d_language_defn =
   c_print_typedef,             /* Print a typedef using appropriate
                                   syntax.  */
   d_val_print,                 /* Print a value using appropriate syntax.  */
-  nullptr,                     /* la_value_print_inner */
+  d_value_print_inner,         /* la_value_print_inner */
   c_value_print,               /* Print a top-level value.  */
   default_read_var_value,      /* la_read_var_value */
   NULL,                                /* Language specific skip_trampoline.  */
index 88e1ea3e1ee626b629d8ec7fd6e6a37b7f103dca..9b4e504024f93d951ee701567feda435fea7b9bb 100644 (file)
@@ -84,4 +84,10 @@ extern void d_val_print (struct type *type,
                         struct value *val,
                         const struct value_print_options *options);
 
+/* Implement la_value_print_inner for D.  */
+
+extern void d_value_print_inner (struct value *val,
+                                struct ui_file *stream, int recurse,
+                                const struct value_print_options *options);
+
 #endif /* !defined (D_LANG_H) */
index b499121f3d87d67e53381c44fb1461fe456a5289..e26c1ea8fa11ba93477163221bb40dbf03210d7f 100644 (file)
@@ -63,9 +63,7 @@ dynamic_array_type (struct type *type,
       ival = value_at (true_type, addr);
       true_type = value_type (ival);
 
-      d_val_print (true_type,
-                  value_embedded_offset (ival), addr,
-                  stream, recurse + 1, ival, options);
+      d_value_print_inner (ival, stream, recurse + 1, options);
       return 0;
     }
   return 1;
@@ -94,3 +92,27 @@ d_val_print (struct type *type, int embedded_offset,
                     recurse, val, options);
     }
 }
+
+/* See d-lang.h.  */
+
+void
+d_value_print_inner (struct value *val, struct ui_file *stream, int recurse,
+                    const struct value_print_options *options)
+{
+  int ret;
+
+  struct type *type = check_typedef (value_type (val));
+  switch (TYPE_CODE (type))
+    {
+      case TYPE_CODE_STRUCT:
+       ret = dynamic_array_type (type, value_embedded_offset (val),
+                                 value_address (val),
+                                 stream, recurse, val, options);
+       if (ret == 0)
+         break;
+       /* Fall through.  */
+      default:
+       c_value_print_inner (val, stream, recurse, options);
+       break;
+    }
+}