Use function_view in cli-script.c
authorTom Tromey <tom@tromey.com>
Wed, 18 Apr 2018 22:53:07 +0000 (16:53 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 4 May 2018 21:58:08 +0000 (15:58 -0600)
This changes some functions in cli-script.c to use function_view
rather than a function pointer and closure argument.  This simplifies
the code a bit and is useful in a subsequent patch.

ChangeLog
2018-05-04  Tom Tromey  <tom@tromey.com>

* tracepoint.c (actions_command): Update.
* mi/mi-cmd-break.c (mi_command_line_array)
(mi_command_line_array_cnt, mi_command_line_array_ptr)
(mi_read_next_line): Remove.
(mi_cmd_break_commands): Update.
* cli/cli-script.h (read_command_lines, read_command_lines_1): Use
function_view.
* cli/cli-script.c (get_command_line): Update.
(process_next_line): Use function_view.  Constify.
(recurse_read_control_structure, read_command_lines)
(read_command_lines_1): Change argument types to function_view.
(do_define_command, document_command): Update.
* breakpoint.h (check_tracepoint_command): Don't declare.
* breakpoint.c (check_tracepoint_command): Remove.
(commands_command_1, create_tracepoint_from_upload): Update.

gdb/ChangeLog
gdb/breakpoint.c
gdb/breakpoint.h
gdb/cli/cli-script.c
gdb/cli/cli-script.h
gdb/mi/mi-cmd-break.c
gdb/tracepoint.c

index 9a67d97210eb4d01358dac9502c5c8b5c24aebb8..4cbec00ed69f00c41ad38115e5a01d8f0fd956c1 100644 (file)
@@ -1,3 +1,21 @@
+2018-05-04  Tom Tromey  <tom@tromey.com>
+
+       * tracepoint.c (actions_command): Update.
+       * mi/mi-cmd-break.c (mi_command_line_array)
+       (mi_command_line_array_cnt, mi_command_line_array_ptr)
+       (mi_read_next_line): Remove.
+       (mi_cmd_break_commands): Update.
+       * cli/cli-script.h (read_command_lines, read_command_lines_1): Use
+       function_view.
+       * cli/cli-script.c (get_command_line): Update.
+       (process_next_line): Use function_view.  Constify.
+       (recurse_read_control_structure, read_command_lines)
+       (read_command_lines_1): Change argument types to function_view.
+       (do_define_command, document_command): Update.
+       * breakpoint.h (check_tracepoint_command): Don't declare.
+       * breakpoint.c (check_tracepoint_command): Remove.
+       (commands_command_1, create_tracepoint_from_upload): Update.
+
 2018-05-04  Tom Tromey  <tom@tromey.com>
 
        PR gdb/11750:
index 72a3e1608de4ca1a88a2723a70adbcb20972a45f..d1955ec0538c349a47df371919d3557a6f82c84c 100644 (file)
@@ -1216,14 +1216,6 @@ breakpoint_set_task (struct breakpoint *b, int task)
     gdb::observers::breakpoint_modified.notify (b);
 }
 
-void
-check_tracepoint_command (char *line, void *closure)
-{
-  struct breakpoint *b = (struct breakpoint *) closure;
-
-  validate_actionline (line, b);
-}
-
 static void
 commands_command_1 (const char *arg, int from_tty,
                    struct command_line *control)
@@ -1256,10 +1248,15 @@ commands_command_1 (const char *arg, int from_tty,
                                    "%s, one per line."),
                                  arg);
 
-              cmd = read_command_lines (str.c_str (), from_tty, 1,
-                                        (is_tracepoint (b)
-                                         ? check_tracepoint_command : 0),
-                                        b);
+              auto do_validate = [=] (const char *line)
+                                 {
+                                   validate_actionline (line, b);
+                                 };
+              gdb::function_view<void (const char *)> validator;
+              if (is_tracepoint (b))
+                validator = do_validate;
+
+              cmd = read_command_lines (str.c_str (), from_tty, 1, validator);
             }
         }
 
@@ -14783,7 +14780,7 @@ create_tracepoint_from_upload (struct uploaded_tp *utp)
       this_utp = utp;
       next_cmd = 0;
 
-      cmd_list = read_command_lines_1 (read_uploaded_action, 1, NULL, NULL);
+      cmd_list = read_command_lines_1 (read_uploaded_action, 1, NULL);
 
       breakpoint_set_commands (tp, std::move (cmd_list));
     }
index e7332a4a6c7e7041a13cdb886951640f5ea2cec5..a1356f090ac54661863a4d2bc8b0a6b9b1f5efe8 100644 (file)
@@ -1608,10 +1608,6 @@ extern int is_tracepoint (const struct breakpoint *b);
    it.  */
 extern VEC(breakpoint_p) *static_tracepoints_here (CORE_ADDR addr);
 
-/* Function that can be passed to read_command_line to validate
-   that each command is suitable for tracepoint command list.  */
-extern void check_tracepoint_command (char *line, void *closure);
-
 /* Create an instance of this to start registering breakpoint numbers
    for a later "commands" command.  */
 
index d679e04e552a19e40ac854dff8fb71a74e1d3d8b..e336c58ad0ce7f5587a0e103e3ec8abd0f501c43 100644 (file)
 /* Prototypes for local functions.  */
 
 static enum command_control_type
-recurse_read_control_structure (char * (*read_next_line_func) (void),
-                               struct command_line *current_cmd,
-                               void (*validator)(char *, void *),
-                               void *closure);
+recurse_read_control_structure
+    (gdb::function_view<const char * ()> read_next_line_func,
+     struct command_line *current_cmd,
+     gdb::function_view<void (const char *)> validator);
 
 static void do_define_command (const char *comname, int from_tty,
                               const counted_command_line *commands);
@@ -163,7 +163,7 @@ get_command_line (enum command_control_type type, const char *arg)
                            command_lines_deleter ());
 
   /* Read in the body of this command.  */
-  if (recurse_read_control_structure (read_next_line, cmd.get (), 0, 0)
+  if (recurse_read_control_structure (read_next_line, cmd.get (), 0)
       == invalid_control)
     {
       warning (_("Error reading in canned sequence of commands."));
@@ -897,11 +897,13 @@ line_first_arg (const char *p)
    Otherwise, only "end" is recognized.  */
 
 static enum misc_command_type
-process_next_line (char *p, struct command_line **command, int parse_commands,
-                  void (*validator)(char *, void *), void *closure)
+process_next_line (const char *p, struct command_line **command,
+                  int parse_commands,
+                  gdb::function_view<void (const char *)> validator)
+
 {
-  char *p_end;
-  char *p_start;
+  const char *p_end;
+  const char *p_start;
   int not_handled = 0;
 
   /* Not sure what to do here.  */
@@ -1013,10 +1015,9 @@ process_next_line (char *p, struct command_line **command, int parse_commands,
 
   if (validator)
     {
-
       TRY
        {
-         validator ((*command)->line, closure);
+         validator ((*command)->line);
        }
       CATCH (ex, RETURN_MASK_ALL)
        {
@@ -1035,10 +1036,9 @@ process_next_line (char *p, struct command_line **command, int parse_commands,
    obtain lines of the command.  */
 
 static enum command_control_type
-recurse_read_control_structure (char * (*read_next_line_func) (void),
+recurse_read_control_structure (gdb::function_view<const char * ()> read_next_line_func,
                                struct command_line *current_cmd,
-                               void (*validator)(char *, void *),
-                               void *closure)
+                               gdb::function_view<void (const char *)> validator)
 {
   enum misc_command_type val;
   enum command_control_type ret;
@@ -1061,7 +1061,7 @@ recurse_read_control_structure (char * (*read_next_line_func) (void),
                               current_cmd->control_type != python_control
                               && current_cmd->control_type != guile_control
                               && current_cmd->control_type != compile_control,
-                              validator, closure);
+                              validator);
 
       /* Just skip blanks and comments.  */
       if (val == nop_command)
@@ -1114,7 +1114,7 @@ recurse_read_control_structure (char * (*read_next_line_func) (void),
        {
          control_level++;
          ret = recurse_read_control_structure (read_next_line_func, next,
-                                               validator, closure);
+                                               validator);
          control_level--;
 
          if (ret != simple_control)
@@ -1140,7 +1140,7 @@ recurse_read_control_structure (char * (*read_next_line_func) (void),
 
 counted_command_line
 read_command_lines (const char *prompt_arg, int from_tty, int parse_commands,
-                   void (*validator)(char *, void *), void *closure)
+                   gdb::function_view<void (const char *)> validator)
 {
   if (from_tty && input_interactive_p (current_ui))
     {
@@ -1163,13 +1163,13 @@ read_command_lines (const char *prompt_arg, int from_tty, int parse_commands,
   counted_command_line head (nullptr, command_lines_deleter ());
   if (current_interp_named_p (INTERP_CONSOLE))
     head = read_command_lines_1 (read_next_line, parse_commands,
-                                validator, closure);
+                                validator);
   else
     {
       scoped_restore_interp interp_restorer (INTERP_CONSOLE);
 
       head = read_command_lines_1 (read_next_line, parse_commands,
-                                  validator, closure);
+                                  validator);
     }
 
   if (from_tty && input_interactive_p (current_ui)
@@ -1184,8 +1184,9 @@ read_command_lines (const char *prompt_arg, int from_tty, int parse_commands,
    obtained using READ_NEXT_LINE_FUNC.  */
 
 counted_command_line
-read_command_lines_1 (char * (*read_next_line_func) (void), int parse_commands,
-                     void (*validator)(char *, void *), void *closure)
+read_command_lines_1 (gdb::function_view<const char * ()> read_next_line_func,
+                     int parse_commands,
+                     gdb::function_view<void (const char *)> validator)
 {
   struct command_line *tail, *next;
   counted_command_line head (nullptr, command_lines_deleter ());
@@ -1199,7 +1200,7 @@ read_command_lines_1 (char * (*read_next_line_func) (void), int parse_commands,
     {
       dont_repeat ();
       val = process_next_line (read_next_line_func (), &next, parse_commands,
-                              validator, closure);
+                              validator);
 
       /* Ignore blank lines or comments.  */
       if (val == nop_command)
@@ -1221,7 +1222,7 @@ read_command_lines_1 (char * (*read_next_line_func) (void), int parse_commands,
        {
          control_level++;
          ret = recurse_read_control_structure (read_next_line_func, next,
-                                               validator, closure);
+                                               validator);
          control_level--;
 
          if (ret == invalid_control)
@@ -1407,7 +1408,7 @@ do_define_command (const char *comname, int from_tty,
     {
       std::string prompt
        = string_printf ("Type commands for definition of \"%s\".", comfull);
-      cmds = read_command_lines (prompt.c_str (), from_tty, 1, 0, 0);
+      cmds = read_command_lines (prompt.c_str (), from_tty, 1, 0);
     }
   else
     cmds = *commands;
@@ -1464,7 +1465,7 @@ document_command (const char *comname, int from_tty)
   std::string prompt = string_printf ("Type documentation for \"%s\".",
                                      comfull);
   counted_command_line doclines = read_command_lines (prompt.c_str (),
-                                                     from_tty, 0, 0, 0);
+                                                     from_tty, 0, 0);
 
   if (c->doc)
     xfree ((char *) c->doc);
index 0bd0d597aec587b4e9cd8fc2b2d14a8affaf463f..3bebd0ed9d70fda71b03ac87d2e8649a5ce7af15 100644 (file)
@@ -106,12 +106,11 @@ private:
   }
 };
 
-extern counted_command_line read_command_lines (const char *, int, int,
-                                               void (*)(char *, void *),
-                                               void *);
-extern counted_command_line read_command_lines_1 (char * (*) (void), int,
-                                                 void (*)(char *, void *),
-                                                 void *);
+extern counted_command_line read_command_lines
+    (const char *, int, int, gdb::function_view<void (const char *)>);
+extern counted_command_line read_command_lines_1
+    (gdb::function_view<const char * ()>, int,
+     gdb::function_view<void (const char *)>);
 
 
 /* Exported to cli/cli-cmds.c */
index 1772fad43cbb904ea60690283782e8576454573a..8897117bb8ca7cc865d7867ee58958f77adc1556 100644 (file)
@@ -32,6 +32,7 @@
 #include "linespec.h"
 #include "gdb_obstack.h"
 #include <ctype.h>
+#include "tracepoint.h"
 
 enum
   {
@@ -468,24 +469,6 @@ mi_cmd_break_watch (const char *command, char **argv, int argc)
     }
 }
 
-/* The mi_read_next_line consults these variable to return successive
-   command lines.  While it would be clearer to use a closure pointer,
-   it is not expected that any future code will use read_command_lines_1,
-   therefore no point of overengineering.  */
-
-static char **mi_command_line_array;
-static int mi_command_line_array_cnt;
-static int mi_command_line_array_ptr;
-
-static char *
-mi_read_next_line (void)
-{
-  if (mi_command_line_array_ptr == mi_command_line_array_cnt)
-    return NULL;
-  else
-    return mi_command_line_array[mi_command_line_array_ptr++];
-}
-
 void
 mi_cmd_break_commands (const char *command, char **argv, int argc)
 {
@@ -509,15 +492,24 @@ mi_cmd_break_commands (const char *command, char **argv, int argc)
   if (b == NULL)
     error (_("breakpoint %d not found."), bnum);
 
-  mi_command_line_array = argv;
-  mi_command_line_array_ptr = 1;
-  mi_command_line_array_cnt = argc;
+  int count = 1;
+  auto reader
+    = [&] ()
+      {
+       const char *result = nullptr;
+       if (count < argc)
+         result = argv[count++];
+       return result;
+      };
 
   if (is_tracepoint (b))
-    break_command = read_command_lines_1 (mi_read_next_line, 1,
-                                         check_tracepoint_command, b);
+    break_command = read_command_lines_1 (reader, 1,
+                                         [=] (const char *line)
+                                           {
+                                             validate_actionline (line, b);
+                                           });
   else
-    break_command = read_command_lines_1 (mi_read_next_line, 1, 0, 0);
+    break_command = read_command_lines_1 (reader, 1, 0);
 
   breakpoint_set_commands (b, std::move (break_command));
 }
index 189a97d49f0865b78bbdc04ec20647b1c9c3747b..e170d704bc9193fb10a9320d879fe0ddcada030f 100644 (file)
@@ -579,8 +579,10 @@ actions_command (const char *args, int from_tty)
 
       counted_command_line l = read_command_lines (tmpbuf.c_str (),
                                                   from_tty, 1,
-                                                  check_tracepoint_command,
-                                                  t);
+                                                  [=] (const char *line)
+                                                    {
+                                                      validate_actionline (line, t);
+                                                    });
       breakpoint_set_commands (t, std::move (l));
     }
   /* else just return */