gdb: change xml_fetch_another a function_view
authorSimon Marchi <simon.marchi@polymtl.ca>
Mon, 14 Sep 2020 15:12:55 +0000 (11:12 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Mon, 14 Sep 2020 15:30:58 +0000 (11:30 -0400)
The xml_fetch_another is currently a plain function pointer type, with a
`void *` baton parameter.  To improve type-safety, change this to a
function_view.  Any required data is captured by a lambda at the call
site.

gdb/ChangeLog:

* xml-support.h (xml_fetch_another): Change type to be a
function_view.
(xml_process_xincludes): Remove baton parameter.
(xml_fetch_content_from_file): Change baton parameter to
dirname.
* xml-support.c (struct xinclude_parsing_data)
<xinclude_parsing_data>: Remove baton parameter.
<fetcher_baton>: Remove.
(xinclude_start_include): Adjust.
(xml_process_xincludes): Adjust.
(xml_fetch_content_from_file): Replace baton parameter with
dirname.
* xml-syscall.c (syscall_parse_xml): Remove baton parameter.
(xml_init_syscalls_info): Use a lambda.
* xml-tdesc.c (tdesc_parse_xml): Remove baton parameter.
(file_read_description_xml): Use a lambda.
(fetch_available_features_from_target): Change baton parameter
to target_ops.
(target_read_description_xml): Use a lambda.
(target_fetch_description_xml): Use a lambda.
(string_read_description_xml): Update.

Change-Id: I7ba4b8f5e97fc6a952c6c20ccc3be92a06cc2bd2

gdb/ChangeLog
gdb/xml-support.c
gdb/xml-support.h
gdb/xml-syscall.c
gdb/xml-tdesc.c

index 0ccbb8919242528c00a791254e9f023c17371d5a..8451cadcd5b04ba034514c5deca66bc619175e7e 100644 (file)
@@ -1,3 +1,27 @@
+2020-09-14  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * xml-support.h (xml_fetch_another): Change type to be a
+       function_view.
+       (xml_process_xincludes): Remove baton parameter.
+       (xml_fetch_content_from_file): Change baton parameter to
+       dirname.
+       * xml-support.c (struct xinclude_parsing_data)
+       <xinclude_parsing_data>: Remove baton parameter.
+       <fetcher_baton>: Remove.
+       (xinclude_start_include): Adjust.
+       (xml_process_xincludes): Adjust.
+       (xml_fetch_content_from_file): Replace baton parameter with
+       dirname.
+       * xml-syscall.c (syscall_parse_xml): Remove baton parameter.
+       (xml_init_syscalls_info): Use a lambda.
+       * xml-tdesc.c (tdesc_parse_xml): Remove baton parameter.
+       (file_read_description_xml): Use a lambda.
+       (fetch_available_features_from_target): Change baton parameter
+       to target_ops.
+       (target_read_description_xml): Use a lambda.
+       (target_fetch_description_xml): Use a lambda.
+       (string_read_description_xml): Update.
+
 2020-09-14  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * gdbtypes.h (TYPE_ENDIANITY_NOT_DEFAULT): Remove, replace all
index c906b69fda0b6d79817296b6b54e9020d9a1a1da..8b698e511f12c572f79528c909b01545ef21ab34 100644 (file)
@@ -745,13 +745,12 @@ gdb_xml_parse_attr_enum (struct gdb_xml_parser *parser,
 struct xinclude_parsing_data
 {
   xinclude_parsing_data (std::string &output_,
-                        xml_fetch_another fetcher_, void *fetcher_baton_,
+                        xml_fetch_another fetcher_,
                         int include_depth_)
     : output (output_),
       skip_depth (0),
       include_depth (include_depth_),
-      fetcher (fetcher_),
-      fetcher_baton (fetcher_baton_)
+      fetcher (fetcher_)
   {}
 
   /* Where the output goes.  */
@@ -770,7 +769,6 @@ struct xinclude_parsing_data
   /* A function to call to obtain additional features, and its
      baton.  */
   xml_fetch_another fetcher;
-  void *fetcher_baton;
 };
 
 static void
@@ -789,14 +787,12 @@ xinclude_start_include (struct gdb_xml_parser *parser,
     gdb_xml_error (parser, _("Maximum XInclude depth (%d) exceeded"),
                   MAX_XINCLUDE_DEPTH);
 
-  gdb::optional<gdb::char_vector> text
-    = data->fetcher (href, data->fetcher_baton);
+  gdb::optional<gdb::char_vector> text = data->fetcher (href);
   if (!text)
     gdb_xml_error (parser, _("Could not load XML document \"%s\""), href);
 
   if (!xml_process_xincludes (data->output, parser->name (),
                              text->data (), data->fetcher,
-                             data->fetcher_baton,
                              data->include_depth + 1))
     gdb_xml_error (parser, _("Parsing \"%s\" failed"), href);
 
@@ -878,10 +874,9 @@ const struct gdb_xml_element xinclude_elements[] = {
 bool
 xml_process_xincludes (std::string &result,
                       const char *name, const char *text,
-                      xml_fetch_another fetcher, void *fetcher_baton,
-                      int depth)
+                      xml_fetch_another fetcher, int depth)
 {
-  xinclude_parsing_data data (result, fetcher, fetcher_baton, depth);
+  xinclude_parsing_data data (result, fetcher, depth);
 
   gdb_xml_parser parser (name, xinclude_elements, &data);
   parser.set_is_xinclude (true);
@@ -968,12 +963,11 @@ show_debug_xml (struct ui_file *file, int from_tty,
 }
 
 gdb::optional<gdb::char_vector>
-xml_fetch_content_from_file (const char *filename, void *baton)
+xml_fetch_content_from_file (const char *filename, const char *dirname)
 {
-  const char *dirname = (const char *) baton;
   gdb_file_up file;
 
-  if (dirname && *dirname)
+  if (dirname != nullptr && *dirname != '\0')
     {
       char *fullname = concat (dirname, "/", filename, (char *) NULL);
 
index 7880aaa97fbc62a9996396b3bcbc2656963fca72..429d9ca2e995f84d43b23cff1e7bbcdf52ce6f48 100644 (file)
@@ -25,6 +25,7 @@
 #include "gdbsupport/xml-utils.h"
 #include "gdbsupport/byte-vector.h"
 #include "gdbsupport/gdb_optional.h"
+#include "gdbsupport/function-view.h"
 
 struct gdb_xml_parser;
 struct gdb_xml_element;
@@ -48,12 +49,12 @@ LONGEST xml_builtin_xfer_partial (const char *filename,
 
 /* Callback to fetch a new XML file, based on the provided HREF.  */
 
-typedef gdb::optional<gdb::char_vector> (*xml_fetch_another) (const char *href,
-                                                             void *baton);
+using xml_fetch_another = gdb::function_view<gdb::optional<gdb::char_vector>
+                                            (const char * /* href */)>;
 
 /* Append the expansion of TEXT after processing <xi:include> tags in
-   RESULT.  FETCHER will be called (with FETCHER_BATON) to retrieve
-   any new files.  DEPTH should be zero on the initial call.
+   RESULT.  FETCHER will be called to retrieve any new files.  DEPTH
+   should be zero on the initial call.
 
    On failure, this function uses NAME in a warning and returns false.
    It may throw an exception, but does not for XML parsing
@@ -61,8 +62,7 @@ typedef gdb::optional<gdb::char_vector> (*xml_fetch_another) (const char *href,
 
 bool xml_process_xincludes (std::string &result,
                            const char *name, const char *text,
-                           xml_fetch_another fetcher, void *fetcher_baton,
-                           int depth);
+                           xml_fetch_another fetcher, int depth);
 
 /* Simplified XML parser infrastructure.  */
 
@@ -231,6 +231,6 @@ ULONGEST gdb_xml_parse_ulongest (struct gdb_xml_parser *parser,
    and warn.  */
 
 extern gdb::optional<gdb::char_vector> xml_fetch_content_from_file
-    (const char *filename, void *baton);
+    (const char *filename, const char *dirname);
 
 #endif
index 8cca875c740b38071731744341b6b52305c79750..effb37960eea825e38309a98bb386a7c5f83aac0 100644 (file)
@@ -287,8 +287,7 @@ static const struct gdb_xml_element syselements[] = {
 };
 
 static struct syscalls_info *
-syscall_parse_xml (const char *document, xml_fetch_another fetcher,
-                   void *fetcher_baton)
+syscall_parse_xml (const char *document, xml_fetch_another fetcher)
 {
   struct syscall_parsing_data data;
   syscalls_info_up sysinfo (new syscalls_info ());
@@ -322,9 +321,13 @@ xml_init_syscalls_info (const char *filename)
   if (!full_file)
     return NULL;
 
-  return syscall_parse_xml (full_file->data (),
-                           xml_fetch_content_from_file,
-                           (void *) ldirname (filename).c_str ());
+  const std::string dirname = ldirname (filename);
+  auto fetch_another = [&dirname] (const char *name)
+    {
+      return xml_fetch_content_from_file (name, dirname.c_str ());
+    };
+
+  return syscall_parse_xml (full_file->data (), fetch_another);
 }
 
 /* Initializes the syscalls_info structure according to the
index 6f108a4e3ef620361b2f611efbfd251964662519..6e21ff42dafd9cdb4c23aa02bdbeb3722e7839b1 100644 (file)
@@ -617,8 +617,7 @@ static const struct gdb_xml_element tdesc_elements[] = {
 /* Parse DOCUMENT into a target description and return it.  */
 
 static struct target_desc *
-tdesc_parse_xml (const char *document, xml_fetch_another fetcher,
-                void *fetcher_baton)
+tdesc_parse_xml (const char *document, xml_fetch_another fetcher)
 {
   struct tdesc_parsing_data data;
 
@@ -627,7 +626,7 @@ tdesc_parse_xml (const char *document, xml_fetch_another fetcher,
 
   if (!xml_process_xincludes (expanded_text,
                              _("target description"),
-                             document, fetcher, fetcher_baton, 0))
+                             document, fetcher, 0))
     {
       warning (_("Could not load XML target description; ignoring"));
       return NULL;
@@ -673,8 +672,13 @@ file_read_description_xml (const char *filename)
       return NULL;
     }
 
-  return tdesc_parse_xml (tdesc_str->data (), xml_fetch_content_from_file,
-                         (void *) ldirname (filename).c_str ());
+  const std::string dirname = ldirname (filename);
+  auto fetch_another = [&dirname] (const char *name)
+    {
+      return xml_fetch_content_from_file (name, dirname.c_str ());
+    };
+
+  return tdesc_parse_xml (tdesc_str->data (), fetch_another);
 }
 
 /* Read a string representation of available features from the target,
@@ -685,10 +689,8 @@ file_read_description_xml (const char *filename)
    for <xi:include>.  */
 
 static gdb::optional<gdb::char_vector>
-fetch_available_features_from_target (const char *name, void *baton_)
+fetch_available_features_from_target (const char *name, target_ops *ops)
 {
-  struct target_ops *ops = (struct target_ops *) baton_;
-
   /* Read this object as a string.  This ensures that a NUL
      terminator is added.  */
   return target_read_stralloc (ops,
@@ -708,9 +710,12 @@ target_read_description_xml (struct target_ops *ops)
   if (!tdesc_str)
     return NULL;
 
-  return tdesc_parse_xml (tdesc_str->data (),
-                         fetch_available_features_from_target,
-                         ops);
+  auto fetch_another = [ops] (const char *name)
+    {
+      return fetch_available_features_from_target (name, ops);
+    };
+
+  return tdesc_parse_xml (tdesc_str->data (), fetch_another);
 }
 
 /* Fetches an XML target description using OPS,  processing
@@ -737,11 +742,14 @@ target_fetch_description_xml (struct target_ops *ops)
   if (!tdesc_str)
     return {};
 
+  auto fetch_another = [ops] (const char *name)
+    {
+      return fetch_available_features_from_target (name, ops);
+    };
   std::string output;
   if (!xml_process_xincludes (output,
                              _("target description"),
-                             tdesc_str->data (),
-                             fetch_available_features_from_target, ops, 0))
+                             tdesc_str->data (), fetch_another, 0))
     {
       warning (_("Could not load XML target description; ignoring"));
       return {};
@@ -755,9 +763,9 @@ target_fetch_description_xml (struct target_ops *ops)
 const struct target_desc *
 string_read_description_xml (const char *xml)
 {
-  return tdesc_parse_xml (xml, [] (const char *href, void *baton)
+  return tdesc_parse_xml (xml, [] (const char *href)
     {
       error (_("xincludes are unsupported with this method"));
       return gdb::optional<gdb::char_vector> ();
-    }, nullptr);
+    });
 }