OSDN Git Service

* gdbtk-wrapper.h: Add declarations for GDB_get_prev_frame, GDB_get_next_frame,
authorkseitz <kseitz>
Thu, 24 Feb 2000 03:11:47 +0000 (03:11 +0000)
committerkseitz <kseitz>
Thu, 24 Feb 2000 03:11:47 +0000 (03:11 +0000)
        GDB_find_relative_frame, GDB_get_current_frame.
        * gdbtk-wrapper.c (GDB_get_prev_frame, wrap_get_prev_frame): New functions.
        (GDB_get_next_frame, wrap_get_next_frame): New functions.
        (GDB_find_relative_frame, wrap_find_relative_frame): New functions.
        (GDB_get_current_frame, wrap_get_current_frame): New functions.

        * gdbtk-hooks.c (gdbtk_add_hooks): Use "specify_exec_file_hook" so
        that our hook is added to the list of hooks run instead of overwriting
        all other hooks.

        * gdbtk-cmds.c (gdb_stack): Wrap all calls to internal functions and
        deal with errors more gracefully.

gdb/gdbtk/generic/ChangeLog-gdbtk
gdb/gdbtk/generic/gdbtk-cmds.c
gdb/gdbtk/generic/gdbtk-hooks.c
gdb/gdbtk/generic/gdbtk-wrapper.c
gdb/gdbtk/generic/gdbtk-wrapper.h

index 5cf424d..e61d474 100644 (file)
@@ -1,3 +1,19 @@
+2000-02-23  Keith R Seitz  <kseitz@nwlink.com>
+
+       * gdbtk-wrapper.h: Add declarations for GDB_get_prev_frame, GDB_get_next_frame,
+       GDB_find_relative_frame, GDB_get_current_frame.
+       * gdbtk-wrapper.c (GDB_get_prev_frame, wrap_get_prev_frame): New functions.
+       (GDB_get_next_frame, wrap_get_next_frame): New functions.
+       (GDB_find_relative_frame, wrap_find_relative_frame): New functions.
+       (GDB_get_current_frame, wrap_get_current_frame): New functions.
+
+       * gdbtk-hooks.c (gdbtk_add_hooks): Use "specify_exec_file_hook" so
+       that our hook is added to the list of hooks run instead of overwriting
+       all other hooks.
+
+       * gdbtk-cmds.c (gdb_stack): Wrap all calls to internal functions and
+       deal with errors more gracefully.
+
 Wed Feb 23 13:01:36 2000  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * gdbtk-cmds.c (gdbtk_dis_asm_read_memory): Change LEN to unsigned
index 83d735b..ddbbe97 100644 (file)
@@ -46,6 +46,7 @@
 #include <tix.h>
 #include "guitcl.h"
 #include "gdbtk.h"
+#include "gdbtk-wrapper.h"
 
 #include <signal.h>
 #include <fcntl.h>
@@ -4090,37 +4091,47 @@ gdb_stack (clientData, interp, objc, objv)
       return TCL_ERROR;
     }
 
-  Tcl_SetListObj (result_ptr->obj_ptr, 0, NULL);
-
   if (target_has_stack)
     {
+      gdb_result r;
       struct frame_info *top;
       struct frame_info *fi;
 
       /* Find the outermost frame */
-      fi = get_current_frame ();
+      r  = GDB_get_current_frame (&fi);
+      if (r != GDB_OK)
+       return TCL_OK;
+
       while (fi != NULL)
-       {
-         top = fi;
-         fi = get_prev_frame (fi);
-       }
+        {
+          top = fi;
+         r = GDB_get_prev_frame (fi, &fi);
+         if (r != GDB_OK)
+           fi = NULL;
+        }
 
       /* top now points to the top (outermost frame) of the
          stack, so point it to the requested start */
       start = -start;
-      top = find_relative_frame (top, &start);
+      r = GDB_find_relative_frame (top, &start, &top);
+      
+      result_ptr->obj_ptr = Tcl_NewListObj (0, NULL);
+      if (r != GDB_OK)
+       return TCL_OK;
 
       /* If start != 0, then we have asked to start outputting
          frames beyond the innermost stack frame */
       if (start == 0)
-       {
-         fi = top;
-         while (fi && count--)
-           {
-             get_frame_name (interp, result_ptr->obj_ptr, fi);
-             fi = get_next_frame (fi);
-           }
-       }
+        {
+          fi = top; 
+          while (fi && count--)
+            {
+              get_frame_name (interp, result_ptr->obj_ptr, fi);
+              r = GDB_get_next_frame (fi, &fi);
+             if (r != GDB_OK)
+               break;
+            }
+        }
     }
 
   return TCL_OK;
index 3f0462b..caab118 100644 (file)
@@ -144,7 +144,7 @@ gdbtk_add_hooks (void)
   pre_add_symbol_hook = gdbtk_pre_add_symbol;
   post_add_symbol_hook = gdbtk_post_add_symbol;
   file_changed_hook = gdbtk_file_changed;
-  exec_file_display_hook = gdbtk_exec_file_display;
+  specify_exec_file_hook (gdbtk_exec_file_display);
 
   create_tracepoint_hook = gdbtk_create_tracepoint;
   delete_tracepoint_hook = gdbtk_delete_tracepoint;
index b18825e..40d3006 100644 (file)
@@ -30,12 +30,12 @@ gdb_result GDB_value_fetch_lazy PARAMS ((value_ptr));
 
 gdb_result GDB_evaluate_expression PARAMS ((struct expression *, value_ptr *));
 
-gdb_result GDB_type_print (value_ptr, char *, struct ui_file *, int);
+gdb_result GDB_type_print PARAMS ((value_ptr, char *, struct ui_file *, int));
 
-gdb_result GDB_val_print (struct type * type, char *valaddr,
-                         CORE_ADDR address, struct ui_file *stream,
-                         int format, int deref_ref, int recurse,
-                         enum val_prettyprint pretty);
+gdb_result GDB_val_print PARAMS ((struct type * type, char *valaddr,
+                                 CORE_ADDR address, struct ui_file * stream,
+                                 int format, int deref_ref, int recurse,
+                                 enum val_prettyprint pretty));
 
 gdb_result GDB_select_frame PARAMS ((struct frame_info *, int));
 
@@ -71,6 +71,18 @@ gdb_result GDB_value_cast PARAMS ((struct type * type, value_ptr val, value_ptr
 
 gdb_result GDB_get_frame_block PARAMS ((struct frame_info * fi, struct block ** rval));
 
+gdb_result GDB_get_prev_frame PARAMS ((struct frame_info *fi,
+                                      struct frame_info **result));
+
+gdb_result GDB_get_next_frame PARAMS ((struct frame_info *fi,
+                                      struct frame_info **result));
+
+gdb_result GDB_find_relative_frame PARAMS ((struct frame_info *fi,
+                                           int *start,
+                                           struct frame_info **result));
+
+gdb_result GDB_get_current_frame PARAMS ((struct frame_info **result));
+
 /*
  * Private functions for this file
  */
@@ -113,6 +125,14 @@ static int wrap_value_cast PARAMS ((char *opaque_arg));
 
 static int wrap_get_frame_block PARAMS ((char *opaque_arg));
 
+static int wrap_get_prev_frame PARAMS ((char *opaque_arg));
+
+static int wrap_get_next_frame PARAMS ((char *opaque_arg));
+
+static int wrap_find_relative_frame PARAMS ((char *opaque_arg));
+
+static int wrap_get_current_frame PARAMS ((char *opaque_arg));
+\f
 static gdb_result
 call_wrapped_function (fn, arg)
      catch_errors_ftype *fn;
@@ -704,6 +724,110 @@ wrap_get_frame_block (opaque_arg)
 
   return 1;
 }
+
+gdb_result
+GDB_get_prev_frame (struct frame_info *fi, struct frame_info **result)
+{
+  struct gdb_wrapper_arguments args;
+  gdb_result r;
+
+  args.args[0] = (char *) fi;
+  r = call_wrapped_function ((catch_errors_ftype *) wrap_get_prev_frame, &args);
+  if (r != GDB_OK)
+    return r;
+
+  *result = (struct frame_info *) args.result;
+  return GDB_OK;
+}
+
+static int
+wrap_get_prev_frame (char *opaque_arg)
+{
+  struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg;
+  struct frame_info *fi = (struct frame_info *) (*args)->args[0];
+
+  (*args)->result = (char *) get_prev_frame (fi);
+  return 1;
+}
+
+gdb_result
+GDB_get_next_frame (struct frame_info *fi, struct frame_info **result)
+{
+  struct gdb_wrapper_arguments args;
+  gdb_result r;
+
+  args.args[0] = (char *) fi;
+  r = call_wrapped_function ((catch_errors_ftype *) wrap_get_next_frame, &args);
+  if (r != GDB_OK)
+    return r;
+
+  *result = (struct frame_info *) args.result;
+  return GDB_OK;
+}
+
+static int
+wrap_get_next_frame (char *opaque_arg)
+{
+  struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg;
+  struct frame_info *fi = (struct frame_info *) (*args)->args[0];
+
+  (*args)->result = (char *) get_next_frame (fi);
+  return 1;
+}
+
+gdb_result
+GDB_find_relative_frame (struct frame_info *fi, int *start,
+                        struct frame_info **result)
+{
+  struct gdb_wrapper_arguments args;
+  gdb_result r;
+
+  args.args[0] = (char *) fi;
+  args.args[1] = (char *) start;
+
+  r = call_wrapped_function ((catch_errors_ftype *) wrap_find_relative_frame, 
+                            &args);
+  if (r != GDB_OK)
+    return r;
+
+  *result = (struct frame_info *) args.result;
+  return GDB_OK;
+}
+
+static int
+wrap_find_relative_frame (char *opaque_arg)
+{
+  struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg;
+  struct frame_info *fi = (struct frame_info *) (*args)->args[0];
+  int *start = (int *) (*args)->args[1];
+
+  (*args)->result = (char *) find_relative_frame (fi, start);
+  return 1;
+}
+
+gdb_result
+GDB_get_current_frame (struct frame_info **result)
+{
+  struct gdb_wrapper_arguments args;
+  gdb_result r;
+
+  r = call_wrapped_function ((catch_errors_ftype *) wrap_get_current_frame, 
+                            &args);
+  if (r != GDB_OK)
+    return r;
+
+  *result = (struct frame_info *) args.result;
+  return GDB_OK;
+}
+
+static int
+wrap_get_current_frame (char *opaque_arg)
+{
+  struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg;
+
+  (*args)->result = (char *) get_current_frame ();
+  return 1;
+}
 \f
 
 
index e70a12c..7c534d9 100644 (file)
@@ -39,12 +39,12 @@ typedef enum gdb_wrapper_status { GDB_OK, GDB_ERROR } gdb_result;
    function. */
 extern gdb_result GDB_evaluate_expression PARAMS ((struct expression *expr, value_ptr *val));
 extern gdb_result GDB_select_frame PARAMS ((struct frame_info *fi, int level));
-extern gdb_result GDB_type_print (value_ptr val, char *varstring,
-                                 struct ui_file *stream, int show);
-extern gdb_result GDB_val_print (struct type *type, char *valaddr,
-                                CORE_ADDR address, struct ui_file *stream,
-                                int format, int deref_ref, int recurse,
-                                enum val_prettyprint pretty);
+extern gdb_result GDB_type_print PARAMS ((value_ptr val, char *varstring,
+                                         struct ui_file *stream, int show));
+extern gdb_result GDB_val_print PARAMS ((struct type *type, char *valaddr,
+                                  CORE_ADDR address, struct ui_file *stream,
+                                  int format, int deref_ref, int recurse,
+                                  enum val_prettyprint pretty));
 extern gdb_result GDB_value_fetch_lazy PARAMS ((value_ptr value));
 extern gdb_result GDB_value_equal PARAMS ((value_ptr val1, value_ptr val2, int *result));
 extern gdb_result GDB_parse_exp_1 PARAMS ((char **stringptr, struct block *block, int comma,
@@ -66,6 +66,14 @@ extern gdb_result GDB_value_struct_elt PARAMS ((value_ptr *argp, value_ptr *args
 extern gdb_result GDB_value_cast PARAMS ((struct type *type, value_ptr val,
                                          value_ptr *rval));
 gdb_result GDB_get_frame_block PARAMS ((struct frame_info *fi, struct block **rval));
+extern gdb_result GDB_get_prev_frame PARAMS ((struct frame_info *fi,
+                                             struct frame_info **result));
+extern gdb_result GDB_get_next_frame PARAMS ((struct frame_info *fi,
+                                             struct frame_info **result));
+extern gdb_result GDB_find_relative_frame PARAMS ((struct frame_info *fi,
+                                                  int *start,
+                                                  struct frame_info **result));
+extern gdb_result GDB_get_current_frame PARAMS ((struct frame_info **result));
 #endif /* GDBTK_WRAPPER_H */
 \f
 /* Local variables: */