Add missing "breaks"
[deliverable/binutils-gdb.git] / gdb / mi / mi-cmd-stack.c
index 4b21015e25a66d726a1d8adcd2e8f5223fb55f6d..52660bdd498e16181ae681063c379abd7cc558ea 100644 (file)
@@ -1,5 +1,5 @@
 /* MI Command Set - stack commands.
 /* MI Command Set - stack commands.
-   Copyright (C) 2000-2013 Free Software Foundation, Inc.
+   Copyright (C) 2000-2018 Free Software Foundation, Inc.
    Contributed by Cygnus Solutions (a Red Hat company).
 
    This file is part of GDB.
    Contributed by Cygnus Solutions (a Red Hat company).
 
    This file is part of GDB.
 #include "block.h"
 #include "stack.h"
 #include "dictionary.h"
 #include "block.h"
 #include "stack.h"
 #include "dictionary.h"
-#include "gdb_string.h"
 #include "language.h"
 #include "valprint.h"
 #include "language.h"
 #include "valprint.h"
-#include "exceptions.h"
 #include "utils.h"
 #include "mi-getopt.h"
 #include "utils.h"
 #include "mi-getopt.h"
-#include "python/python.h"
+#include "extension.h"
 #include <ctype.h>
 #include "mi-parse.h"
 #include <ctype.h>
 #include "mi-parse.h"
+#include "common/gdb_optional.h"
 
 enum what_to_list { locals, arguments, all };
 
 
 enum what_to_list { locals, arguments, all };
 
-static void list_args_or_locals (enum what_to_list what, 
+static void list_args_or_locals (enum what_to_list what,
                                 enum print_values values,
                                 enum print_values values,
-                                struct frame_info *fi);
+                                struct frame_info *fi,
+                                int skip_unavailable);
 
 /* True if we want to allow Python-based frame filters.  */
 static int frame_filters = 0;
 
 void
 
 /* True if we want to allow Python-based frame filters.  */
 static int frame_filters = 0;
 
 void
-mi_cmd_enable_frame_filters (char *command, char **argv, int argc)
+mi_cmd_enable_frame_filters (const char *command, char **argv, int argc)
 {
   if (argc != 0)
     error (_("-enable-frame-filters: no arguments allowed"));
   frame_filters = 1;
 }
 
 {
   if (argc != 0)
     error (_("-enable-frame-filters: no arguments allowed"));
   frame_filters = 1;
 }
 
-/* Parse the --no-frame-filters option in commands where we cannot use
-   mi_getopt. */
-static int
-parse_no_frames_option (const char *arg)
-{
-  if (arg && (strcmp (arg, "--no-frame-filters") == 0))
-    return 1;
+/* Like apply_ext_lang_frame_filter, but take a print_values */
 
 
-  return 0;
+static enum ext_lang_bt_status
+mi_apply_ext_lang_frame_filter (struct frame_info *frame,
+                               frame_filter_flags flags,
+                               enum print_values print_values,
+                               struct ui_out *out,
+                               int frame_low, int frame_high)
+{
+  /* ext_lang_frame_args's MI options are compatible with MI print
+     values.  */
+  return apply_ext_lang_frame_filter (frame, flags,
+                                     (enum ext_lang_frame_args) print_values,
+                                     out,
+                                     frame_low, frame_high);
 }
 
 /* Print a list of the stack frames.  Args can be none, in which case
 }
 
 /* Print a list of the stack frames.  Args can be none, in which case
@@ -72,14 +78,13 @@ parse_no_frames_option (const char *arg)
    displayed.  */
 
 void
    displayed.  */
 
 void
-mi_cmd_stack_list_frames (char *command, char **argv, int argc)
+mi_cmd_stack_list_frames (const char *command, char **argv, int argc)
 {
   int frame_low;
   int frame_high;
   int i;
 {
   int frame_low;
   int frame_high;
   int i;
-  struct cleanup *cleanup_stack;
   struct frame_info *fi;
   struct frame_info *fi;
-  enum py_bt_status result = PY_BT_ERROR;
+  enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
   int raw_arg = 0;
   int oind = 0;
   enum opt
   int raw_arg = 0;
   int oind = 0;
   enum opt
@@ -138,11 +143,11 @@ mi_cmd_stack_list_frames (char *command, char **argv, int argc)
   if (fi == NULL)
     error (_("-stack-list-frames: Not enough frames in stack."));
 
   if (fi == NULL)
     error (_("-stack-list-frames: Not enough frames in stack."));
 
-  cleanup_stack = make_cleanup_ui_out_list_begin_end (current_uiout, "stack");
+  ui_out_emit_list list_emitter (current_uiout, "stack");
 
   if (! raw_arg && frame_filters)
     {
 
   if (! raw_arg && frame_filters)
     {
-      int flags = PRINT_LEVEL | PRINT_FRAME_INFO;
+      frame_filter_flags flags = PRINT_LEVEL | PRINT_FRAME_INFO;
       int py_frame_low = frame_low;
 
       /* We cannot pass -1 to frame_low, as that would signify a
       int py_frame_low = frame_low;
 
       /* We cannot pass -1 to frame_low, as that would signify a
@@ -151,14 +156,14 @@ mi_cmd_stack_list_frames (char *command, char **argv, int argc)
       if (py_frame_low == -1)
        py_frame_low++;
 
       if (py_frame_low == -1)
        py_frame_low++;
 
-      result = apply_frame_filter (get_current_frame (), flags,
-                                  NO_VALUES,  current_uiout,
-                                  py_frame_low, frame_high);
+      result = apply_ext_lang_frame_filter (get_current_frame (), flags,
+                                           NO_VALUES,  current_uiout,
+                                           py_frame_low, frame_high);
     }
 
   /* Run the inbuilt backtrace if there are no filters registered, or
      if "--no-frame-filters" has been specified from the command.  */
     }
 
   /* Run the inbuilt backtrace if there are no filters registered, or
      if "--no-frame-filters" has been specified from the command.  */
-  if (! frame_filters || raw_arg  || result == PY_BT_NO_FILTERS)
+  if (! frame_filters || raw_arg  || result == EXT_LANG_BT_NO_FILTERS)
     {
       /* Now let's print the frames up to frame_high, or until there are
         frames in the stack.  */
     {
       /* Now let's print the frames up to frame_high, or until there are
         frames in the stack.  */
@@ -169,15 +174,13 @@ mi_cmd_stack_list_frames (char *command, char **argv, int argc)
          QUIT;
          /* Print the location and the address always, even for level 0.
             If args is 0, don't print the arguments.  */
          QUIT;
          /* Print the location and the address always, even for level 0.
             If args is 0, don't print the arguments.  */
-         print_frame_info (fi, 1, LOC_AND_ADDRESS, 0 /* args */ );
+         print_frame_info (fi, 1, LOC_AND_ADDRESS, 0 /* args */, 0);
        }
     }
        }
     }
-
-  do_cleanups (cleanup_stack);
 }
 
 void
 }
 
 void
-mi_cmd_stack_info_depth (char *command, char **argv, int argc)
+mi_cmd_stack_info_depth (const char *command, char **argv, int argc)
 {
   int frame_high;
   int i;
 {
   int frame_high;
   int i;
@@ -198,7 +201,7 @@ mi_cmd_stack_info_depth (char *command, char **argv, int argc)
        i++, fi = get_prev_frame (fi))
     QUIT;
 
        i++, fi = get_prev_frame (fi))
     QUIT;
 
-  ui_out_field_int (current_uiout, "depth", i);
+  current_uiout->field_int ("depth", i);
 }
 
 /* Print a list of the locals for the current frame.  With argument of
 }
 
 /* Print a list of the locals for the current frame.  With argument of
@@ -206,36 +209,73 @@ mi_cmd_stack_info_depth (char *command, char **argv, int argc)
    values.  */
 
 void
    values.  */
 
 void
-mi_cmd_stack_list_locals (char *command, char **argv, int argc)
+mi_cmd_stack_list_locals (const char *command, char **argv, int argc)
 {
   struct frame_info *frame;
   int raw_arg = 0;
 {
   struct frame_info *frame;
   int raw_arg = 0;
-  enum py_bt_status result = PY_BT_ERROR;
-  int print_value;
+  enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
+  enum print_values print_value;
+  int oind = 0;
+  int skip_unavailable = 0;
 
 
-  if (argc > 0)
-    raw_arg = parse_no_frames_option (argv[0]);
+  if (argc > 1)
+    {
+      enum opt
+      {
+       NO_FRAME_FILTERS,
+       SKIP_UNAVAILABLE,
+      };
+      static const struct mi_opt opts[] =
+       {
+         {"-no-frame-filters", NO_FRAME_FILTERS, 0},
+         {"-skip-unavailable", SKIP_UNAVAILABLE, 0},
+         { 0, 0, 0 }
+       };
 
 
-  if (argc < 1 || argc > 2 || (argc == 2 && ! raw_arg)
-      || (argc == 1 && raw_arg))
-    error (_("-stack-list-locals: Usage: [--no-frame-filters] PRINT_VALUES"));
+      while (1)
+       {
+         char *oarg;
+         /* Don't parse 'print-values' as an option.  */
+         int opt = mi_getopt ("-stack-list-locals", argc - 1, argv,
+                              opts, &oind, &oarg);
+
+         if (opt < 0)
+           break;
+         switch ((enum opt) opt)
+           {
+           case NO_FRAME_FILTERS:
+             raw_arg = oind;
+             break;
+           case SKIP_UNAVAILABLE:
+             skip_unavailable = 1;
+             break;
+           }
+       }
+    }
+
+  /* After the last option is parsed, there should be only
+     'print-values'.  */
+  if (argc - oind != 1)
+    error (_("-stack-list-locals: Usage: [--no-frame-filters] "
+            "[--skip-unavailable] PRINT_VALUES"));
 
   frame = get_selected_frame (NULL);
 
   frame = get_selected_frame (NULL);
-  print_value = mi_parse_print_values (argv[raw_arg]);
+  print_value = mi_parse_print_values (argv[oind]);
 
    if (! raw_arg && frame_filters)
      {
 
    if (! raw_arg && frame_filters)
      {
-       int flags = PRINT_LEVEL | PRINT_LOCALS;
+       frame_filter_flags flags = PRINT_LEVEL | PRINT_LOCALS;
 
 
-       result = apply_frame_filter (frame, flags, print_value,
-                                   current_uiout, 0, 0);
+       result = mi_apply_ext_lang_frame_filter (frame, flags, print_value,
+                                               current_uiout, 0, 0);
      }
 
    /* Run the inbuilt backtrace if there are no filters registered, or
       if "--no-frame-filters" has been specified from the command.  */
      }
 
    /* Run the inbuilt backtrace if there are no filters registered, or
       if "--no-frame-filters" has been specified from the command.  */
-   if (! frame_filters || raw_arg  || result == PY_BT_NO_FILTERS)
+   if (! frame_filters || raw_arg  || result == EXT_LANG_BT_NO_FILTERS)
      {
      {
-       list_args_or_locals (locals, print_value, frame);
+       list_args_or_locals (locals, print_value, frame,
+                           skip_unavailable);
      }
 }
 
      }
 }
 
@@ -244,29 +284,58 @@ mi_cmd_stack_list_locals (char *command, char **argv, int argc)
    values.  */
 
 void
    values.  */
 
 void
-mi_cmd_stack_list_args (char *command, char **argv, int argc)
+mi_cmd_stack_list_args (const char *command, char **argv, int argc)
 {
   int frame_low;
   int frame_high;
   int i;
   struct frame_info *fi;
 {
   int frame_low;
   int frame_high;
   int i;
   struct frame_info *fi;
-  struct cleanup *cleanup_stack_args;
   enum print_values print_values;
   struct ui_out *uiout = current_uiout;
   int raw_arg = 0;
   enum print_values print_values;
   struct ui_out *uiout = current_uiout;
   int raw_arg = 0;
-  enum py_bt_status result = PY_BT_ERROR;
+  int oind = 0;
+  int skip_unavailable = 0;
+  enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
+  enum opt
+  {
+    NO_FRAME_FILTERS,
+    SKIP_UNAVAILABLE,
+  };
+  static const struct mi_opt opts[] =
+    {
+      {"-no-frame-filters", NO_FRAME_FILTERS, 0},
+      {"-skip-unavailable", SKIP_UNAVAILABLE, 0},
+      { 0, 0, 0 }
+    };
 
 
-  if (argc > 0)
-    raw_arg = parse_no_frames_option (argv[0]);
+  while (1)
+    {
+      char *oarg;
+      int opt = mi_getopt_allow_unknown ("-stack-list-args", argc, argv,
+                                        opts, &oind, &oarg);
+
+      if (opt < 0)
+       break;
+      switch ((enum opt) opt)
+       {
+       case NO_FRAME_FILTERS:
+         raw_arg = oind;
+         break;
+       case SKIP_UNAVAILABLE:
+         skip_unavailable = 1;
+         break;
+       }
+    }
 
 
-  if (argc < 1 || (argc > 3 && ! raw_arg) || (argc == 2 && ! raw_arg))
-    error (_("-stack-list-arguments: Usage: " \
-            "[--no-frame-filters] PRINT_VALUES [FRAME_LOW FRAME_HIGH]"));
+  if (argc - oind != 1 && argc - oind != 3)
+    error (_("-stack-list-arguments: Usage: "  \
+            "[--no-frame-filters] [--skip-unavailable] "
+            "PRINT_VALUES [FRAME_LOW FRAME_HIGH]"));
 
 
-  if (argc >= 3)
+  if (argc - oind == 3)
     {
     {
-      frame_low = atoi (argv[1 + raw_arg]);
-      frame_high = atoi (argv[2 + raw_arg]);
+      frame_low = atoi (argv[1 + oind]);
+      frame_high = atoi (argv[2 + oind]);
     }
   else
     {
     }
   else
     {
@@ -276,7 +345,7 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc)
       frame_high = -1;
     }
 
       frame_high = -1;
     }
 
-  print_values = mi_parse_print_values (argv[raw_arg]);
+  print_values = mi_parse_print_values (argv[oind]);
 
   /* Let's position fi on the frame at which to start the
      display. Could be the innermost frame if the whole stack needs
 
   /* Let's position fi on the frame at which to start the
      display. Could be the innermost frame if the whole stack needs
@@ -288,12 +357,11 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc)
   if (fi == NULL)
     error (_("-stack-list-arguments: Not enough frames in stack."));
 
   if (fi == NULL)
     error (_("-stack-list-arguments: Not enough frames in stack."));
 
-  cleanup_stack_args
-    = make_cleanup_ui_out_list_begin_end (uiout, "stack-args");
+  ui_out_emit_list list_emitter (uiout, "stack-args");
 
   if (! raw_arg && frame_filters)
     {
 
   if (! raw_arg && frame_filters)
     {
-      int flags = PRINT_LEVEL | PRINT_ARGS;
+      frame_filter_flags flags = PRINT_LEVEL | PRINT_ARGS;
       int py_frame_low = frame_low;
 
       /* We cannot pass -1 to frame_low, as that would signify a
       int py_frame_low = frame_low;
 
       /* We cannot pass -1 to frame_low, as that would signify a
@@ -302,14 +370,14 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc)
       if (py_frame_low == -1)
        py_frame_low++;
 
       if (py_frame_low == -1)
        py_frame_low++;
 
-      result = apply_frame_filter (get_current_frame (), flags,
-                                  print_values, current_uiout,
-                                  py_frame_low, frame_high);
+      result = mi_apply_ext_lang_frame_filter (get_current_frame (), flags,
+                                              print_values, current_uiout,
+                                              py_frame_low, frame_high);
     }
 
      /* Run the inbuilt backtrace if there are no filters registered, or
       if "--no-frame-filters" has been specified from the command.  */
     }
 
      /* Run the inbuilt backtrace if there are no filters registered, or
       if "--no-frame-filters" has been specified from the command.  */
-   if (! frame_filters || raw_arg  || result == PY_BT_NO_FILTERS)
+   if (! frame_filters || raw_arg  || result == EXT_LANG_BT_NO_FILTERS)
      {
       /* Now let's print the frames up to frame_high, or until there are
         frames in the stack.  */
      {
       /* Now let's print the frames up to frame_high, or until there are
         frames in the stack.  */
@@ -317,16 +385,12 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc)
           fi && (i <= frame_high || frame_high == -1);
           i++, fi = get_prev_frame (fi))
        {
           fi && (i <= frame_high || frame_high == -1);
           i++, fi = get_prev_frame (fi))
        {
-         struct cleanup *cleanup_frame;
-
          QUIT;
          QUIT;
-         cleanup_frame = make_cleanup_ui_out_tuple_begin_end (uiout, "frame");
-         ui_out_field_int (uiout, "level", i);
-         list_args_or_locals (arguments, print_values, fi);
-         do_cleanups (cleanup_frame);
+         ui_out_emit_tuple tuple_emitter (uiout, "frame");
+         uiout->field_int ("level", i);
+         list_args_or_locals (arguments, print_values, fi, skip_unavailable);
        }
     }
        }
     }
-  do_cleanups (cleanup_stack_args);
 }
 
 /* Print a list of the local variables (including arguments) for the 
 }
 
 /* Print a list of the local variables (including arguments) for the 
@@ -335,37 +399,73 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc)
    parse_print_value for possible values.  */
 
 void
    parse_print_value for possible values.  */
 
 void
-mi_cmd_stack_list_variables (char *command, char **argv, int argc)
+mi_cmd_stack_list_variables (const char *command, char **argv, int argc)
 {
   struct frame_info *frame;
   int raw_arg = 0;
 {
   struct frame_info *frame;
   int raw_arg = 0;
-  enum py_bt_status result = PY_BT_ERROR;
-  int print_value;
+  enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
+  enum print_values print_value;
+  int oind = 0;
+  int skip_unavailable = 0;
 
 
-  if (argc > 0)
-    raw_arg = parse_no_frames_option (argv[0]);
+  if (argc > 1)
+    {
+      enum opt
+      {
+       NO_FRAME_FILTERS,
+       SKIP_UNAVAILABLE,
+      };
+      static const struct mi_opt opts[] =
+       {
+         {"-no-frame-filters", NO_FRAME_FILTERS, 0},
+         {"-skip-unavailable", SKIP_UNAVAILABLE, 0},
+         { 0, 0, 0 }
+       };
 
 
-  if (argc < 1 || argc > 2 || (argc == 2 && ! raw_arg)
-      || (argc == 1 && raw_arg))
-    error (_("-stack-list-variables: Usage: " \
-            "[--no-frame-filters] PRINT_VALUES"));
+      while (1)
+       {
+         char *oarg;
+         /* Don't parse 'print-values' as an option.  */
+         int opt = mi_getopt ("-stack-list-variables", argc - 1,
+                              argv, opts, &oind, &oarg);
+         if (opt < 0)
+           break;
+         switch ((enum opt) opt)
+           {
+           case NO_FRAME_FILTERS:
+             raw_arg = oind;
+             break;
+           case SKIP_UNAVAILABLE:
+             skip_unavailable = 1;
+             break;
+           }
+       }
+    }
+
+  /* After the last option is parsed, there should be only
+     'print-values'.  */
+  if (argc - oind != 1)
+    error (_("-stack-list-variables: Usage: [--no-frame-filters] " \
+            "[--skip-unavailable] PRINT_VALUES"));
 
    frame = get_selected_frame (NULL);
 
    frame = get_selected_frame (NULL);
-   print_value = mi_parse_print_values (argv[raw_arg]);
+   print_value = mi_parse_print_values (argv[oind]);
 
    if (! raw_arg && frame_filters)
      {
 
    if (! raw_arg && frame_filters)
      {
-       int flags = PRINT_LEVEL | PRINT_ARGS | PRINT_LOCALS;
+       frame_filter_flags flags = PRINT_LEVEL | PRINT_ARGS | PRINT_LOCALS;
 
 
-       result = apply_frame_filter (frame, flags, print_value,
-                                   current_uiout, 0, 0);
+       result = mi_apply_ext_lang_frame_filter (frame, flags,
+                                               print_value,
+                                               current_uiout, 0, 0);
      }
 
    /* Run the inbuilt backtrace if there are no filters registered, or
       if "--no-frame-filters" has been specified from the command.  */
      }
 
    /* Run the inbuilt backtrace if there are no filters registered, or
       if "--no-frame-filters" has been specified from the command.  */
-   if (! frame_filters || raw_arg  || result == PY_BT_NO_FILTERS)
+   if (! frame_filters || raw_arg  || result == EXT_LANG_BT_NO_FILTERS)
      {
      {
-       list_args_or_locals (all, print_value, frame);
+       list_args_or_locals (all, print_value, frame,
+                           skip_unavailable);
      }
 }
 
      }
 }
 
@@ -373,18 +473,14 @@ mi_cmd_stack_list_variables (char *command, char **argv, int argc)
    WHAT and VALUES see list_args_or_locals.
 
    Errors are printed as if they would be the parameter value.  Use
    WHAT and VALUES see list_args_or_locals.
 
    Errors are printed as if they would be the parameter value.  Use
-   zeroed ARG iff it should not be printed according to VALUES.  */
+   zeroed ARG iff it should not be printed according to VALUES.  If
+   SKIP_UNAVAILABLE is true, only print ARG if it is available.  */
 
 static void
 list_arg_or_local (const struct frame_arg *arg, enum what_to_list what,
 
 static void
 list_arg_or_local (const struct frame_arg *arg, enum what_to_list what,
-                  enum print_values values)
+                  enum print_values values, int skip_unavailable)
 {
 {
-  struct cleanup *old_chain;
   struct ui_out *uiout = current_uiout;
   struct ui_out *uiout = current_uiout;
-  struct ui_file *stb;
-
-  stb = mem_fileopen ();
-  old_chain = make_cleanup_ui_file_delete (stb);
 
   gdb_assert (!arg->val || !arg->error);
   gdb_assert ((values == PRINT_NO_VALUES && arg->val == NULL
 
   gdb_assert (!arg->val || !arg->error);
   gdb_assert ((values == PRINT_NO_VALUES && arg->val == NULL
@@ -396,68 +492,82 @@ list_arg_or_local (const struct frame_arg *arg, enum what_to_list what,
              || (arg->entry_kind == print_entry_values_only
                  && (arg->val || arg->error)));
 
              || (arg->entry_kind == print_entry_values_only
                  && (arg->val || arg->error)));
 
+  if (skip_unavailable && arg->val != NULL
+      && (value_entirely_unavailable (arg->val)
+         /* A scalar object that does not have all bits available is
+            also considered unavailable, because all bits contribute
+            to its representation.  */
+         || (val_print_scalar_type_p (value_type (arg->val))
+             && !value_bytes_available (arg->val,
+                                        value_embedded_offset (arg->val),
+                                        TYPE_LENGTH (value_type (arg->val))))))
+    return;
+
+  gdb::optional<ui_out_emit_tuple> tuple_emitter;
   if (values != PRINT_NO_VALUES || what == all)
   if (values != PRINT_NO_VALUES || what == all)
-    make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
+    tuple_emitter.emplace (uiout, nullptr);
 
 
-  fputs_filtered (SYMBOL_PRINT_NAME (arg->sym), stb);
+  string_file stb;
+
+  stb.puts (SYMBOL_PRINT_NAME (arg->sym));
   if (arg->entry_kind == print_entry_values_only)
   if (arg->entry_kind == print_entry_values_only)
-    fputs_filtered ("@entry", stb);
-  ui_out_field_stream (uiout, "name", stb);
+    stb.puts ("@entry");
+  uiout->field_stream ("name", stb);
 
   if (what == all && SYMBOL_IS_ARGUMENT (arg->sym))
 
   if (what == all && SYMBOL_IS_ARGUMENT (arg->sym))
-    ui_out_field_int (uiout, "arg", 1);
+    uiout->field_int ("arg", 1);
 
   if (values == PRINT_SIMPLE_VALUES)
     {
       check_typedef (arg->sym->type);
 
   if (values == PRINT_SIMPLE_VALUES)
     {
       check_typedef (arg->sym->type);
-      type_print (arg->sym->type, "", stb, -1);
-      ui_out_field_stream (uiout, "type", stb);
+      type_print (arg->sym->type, "", &stb, -1);
+      uiout->field_stream ("type", stb);
     }
 
   if (arg->val || arg->error)
     {
     }
 
   if (arg->val || arg->error)
     {
-      volatile struct gdb_exception except;
+      const char *error_message = NULL;
 
       if (arg->error)
 
       if (arg->error)
-       except.message = arg->error;
+       error_message = arg->error;
       else
        {
       else
        {
-         /* TRY_CATCH has two statements, wrap it in a block.  */
-
-         TRY_CATCH (except, RETURN_MASK_ERROR)
+         TRY
            {
              struct value_print_options opts;
 
            {
              struct value_print_options opts;
 
-             get_raw_print_options (&opts);
+             get_no_prettyformat_print_options (&opts);
              opts.deref_ref = 1;
              opts.deref_ref = 1;
-             common_val_print (arg->val, stb, 0, &opts,
+             common_val_print (arg->val, &stb, 0, &opts,
                                language_def (SYMBOL_LANGUAGE (arg->sym)));
            }
                                language_def (SYMBOL_LANGUAGE (arg->sym)));
            }
+         CATCH (except, RETURN_MASK_ERROR)
+           {
+             error_message = except.message;
+           }
+         END_CATCH
        }
        }
-      if (except.message)
-       fprintf_filtered (stb, _("<error reading variable: %s>"),
-                         except.message);
-      ui_out_field_stream (uiout, "value", stb);
+      if (error_message != NULL)
+       stb.printf (_("<error reading variable: %s>"), error_message);
+      uiout->field_stream ("value", stb);
     }
     }
-
-  do_cleanups (old_chain);
 }
 
 }
 
-/* Print a list of the locals or the arguments for the currently
-   selected frame.  If the argument passed is 0, printonly the names
-   of the variables, if an argument of 1 is passed, print the values
-   as well.  */
+/* Print a list of the objects for the frame FI in a certain form,
+   which is determined by VALUES.  The objects can be locals,
+   arguments or both, which is determined by WHAT.  If SKIP_UNAVAILABLE
+   is true, only print the arguments or local variables whose values
+   are available.  */
 
 static void
 list_args_or_locals (enum what_to_list what, enum print_values values,
 
 static void
 list_args_or_locals (enum what_to_list what, enum print_values values,
-                    struct frame_info *fi)
+                    struct frame_info *fi, int skip_unavailable)
 {
 {
-  struct block *block;
+  const struct block *block;
   struct symbol *sym;
   struct block_iterator iter;
   struct symbol *sym;
   struct block_iterator iter;
-  struct cleanup *cleanup_list;
   struct type *type;
   struct type *type;
-  char *name_of_result;
+  const char *name_of_result;
   struct ui_out *uiout = current_uiout;
 
   block = get_frame_block (fi, 0);
   struct ui_out *uiout = current_uiout;
 
   block = get_frame_block (fi, 0);
@@ -478,7 +588,7 @@ list_args_or_locals (enum what_to_list what, enum print_values values,
                      "unexpected what_to_list: %d", (int) what);
     }
 
                      "unexpected what_to_list: %d", (int) what);
     }
 
-  cleanup_list = make_cleanup_ui_out_list_begin_end (uiout, name_of_result);
+  ui_out_emit_list list_emitter (uiout, name_of_result);
 
   while (block != 0)
     {
 
   while (block != 0)
     {
@@ -523,7 +633,7 @@ list_args_or_locals (enum what_to_list what, enum print_values values,
              if (SYMBOL_IS_ARGUMENT (sym))
                sym2 = lookup_symbol (SYMBOL_LINKAGE_NAME (sym),
                                      block, VAR_DOMAIN,
              if (SYMBOL_IS_ARGUMENT (sym))
                sym2 = lookup_symbol (SYMBOL_LINKAGE_NAME (sym),
                                      block, VAR_DOMAIN,
-                                     NULL);
+                                     NULL).symbol;
              else
                sym2 = sym;
              gdb_assert (sym2 != NULL);
              else
                sym2 = sym;
              gdb_assert (sym2 != NULL);
@@ -544,15 +654,18 @@ list_args_or_locals (enum what_to_list what, enum print_values values,
                      && TYPE_CODE (type) != TYPE_CODE_UNION)
                    {
                case PRINT_ALL_VALUES:
                      && TYPE_CODE (type) != TYPE_CODE_UNION)
                    {
                case PRINT_ALL_VALUES:
-                     read_frame_arg (sym2, fi, &arg, &entryarg);
+                 if (SYMBOL_IS_ARGUMENT (sym))
+                   read_frame_arg (sym2, fi, &arg, &entryarg);
+                 else
+                   read_frame_local (sym2, fi, &arg);
                    }
                  break;
                }
 
              if (arg.entry_kind != print_entry_values_only)
                    }
                  break;
                }
 
              if (arg.entry_kind != print_entry_values_only)
-               list_arg_or_local (&arg, what, values);
+               list_arg_or_local (&arg, what, values, skip_unavailable);
              if (entryarg.entry_kind != print_entry_values_no)
              if (entryarg.entry_kind != print_entry_values_no)
-               list_arg_or_local (&entryarg, what, values);
+               list_arg_or_local (&entryarg, what, values, skip_unavailable);
              xfree (arg.error);
              xfree (entryarg.error);
            }
              xfree (arg.error);
              xfree (entryarg.error);
            }
@@ -563,11 +676,10 @@ list_args_or_locals (enum what_to_list what, enum print_values values,
       else
        block = BLOCK_SUPERBLOCK (block);
     }
       else
        block = BLOCK_SUPERBLOCK (block);
     }
-  do_cleanups (cleanup_list);
 }
 
 void
 }
 
 void
-mi_cmd_stack_select_frame (char *command, char **argv, int argc)
+mi_cmd_stack_select_frame (const char *command, char **argv, int argc)
 {
   if (argc == 0 || argc > 1)
     error (_("-stack-select-frame: Usage: FRAME_SPEC"));
 {
   if (argc == 0 || argc > 1)
     error (_("-stack-select-frame: Usage: FRAME_SPEC"));
@@ -576,10 +688,10 @@ mi_cmd_stack_select_frame (char *command, char **argv, int argc)
 }
 
 void
 }
 
 void
-mi_cmd_stack_info_frame (char *command, char **argv, int argc)
+mi_cmd_stack_info_frame (const char *command, char **argv, int argc)
 {
   if (argc > 0)
     error (_("-stack-info-frame: No arguments allowed"));
 
 {
   if (argc > 0)
     error (_("-stack-info-frame: No arguments allowed"));
 
-  print_frame_info (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 0);
+  print_frame_info (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 0, 1);
 }
 }
This page took 0.033194 seconds and 4 git commands to generate.