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.
+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
#include <tix.h>
#include "guitcl.h"
#include "gdbtk.h"
+#include "gdbtk-wrapper.h"
#include <signal.h>
#include <fcntl.h>
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;
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;
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));
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
*/
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;
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
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,
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: */