aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>1998-06-04 18:10:21 +0000
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>1998-06-04 18:10:21 +0000
commitfed03c013db5576a26ffac9db0b5a13ac236a1a3 (patch)
tree7e2575c76ccbf4917c7db8bb6e8747d605b92a2b /gdb
parentecc6e8426e12d884bb5aecd87dc23d65fca03197 (diff)
downloadfsf-binutils-gdb-fed03c013db5576a26ffac9db0b5a13ac236a1a3.zip
fsf-binutils-gdb-fed03c013db5576a26ffac9db0b5a13ac236a1a3.tar.gz
fsf-binutils-gdb-fed03c013db5576a26ffac9db0b5a13ac236a1a3.tar.bz2
Thu Jun 4 10:15:03 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
* gdbtk.c: merged: - Elena Zannoni <ezannoni@kwikemart.cygnus.com> (call_obj_wrapper): in case of error, copy the error message from the result to the error_string. (gdbtk_fputs): add comments. (gdb_actions_command): call validate_actionline when installing the tracepoint, to do the syntax checking of the actions for us. - Elena Zannoni <ezannoni@kwikemart.cygnus.com> (gdb_get_trace_frame_num): new function to get the trace frame number from gdb. (gdbtk_init): added new command gdb_get_trace_frame_num. - Jim Blandy <jimb@zwingli.cygnus.com> (struct wrapped_call_objs): Change the `func' member to be a Tcl_ObjCmdProc, not an Tcl_CmdProc, since it accepts a vector of objects as arguments. Change the object vector to be const, since that's what all the users of this structure seem to expect. (call_obj_wrapper): Cast clientData properly before storing it in the wrapped_args structure.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog-gdbtk22
-rw-r--r--gdb/gdbtk.c74
2 files changed, 89 insertions, 7 deletions
diff --git a/gdb/ChangeLog-gdbtk b/gdb/ChangeLog-gdbtk
index 2d5876c..fbc69f6 100644
--- a/gdb/ChangeLog-gdbtk
+++ b/gdb/ChangeLog-gdbtk
@@ -1,3 +1,25 @@
+Thu Jun 4 10:15:03 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
+
+ * gdbtk.c: merged:
+
+ - Elena Zannoni <ezannoni@kwikemart.cygnus.com>
+ (call_obj_wrapper): in case of error, copy the
+ error message from the result to the error_string.
+ (gdbtk_fputs): add comments.
+ (gdb_actions_command): call validate_actionline when installing the
+ tracepoint, to do the syntax checking of the actions for us.
+ - Elena Zannoni <ezannoni@kwikemart.cygnus.com>
+ (gdb_get_trace_frame_num): new function to get the
+ trace frame number from gdb.
+ (gdbtk_init): added new command gdb_get_trace_frame_num.
+ - Jim Blandy <jimb@zwingli.cygnus.com>
+ (struct wrapped_call_objs): Change the `func' member to
+ be a Tcl_ObjCmdProc, not an Tcl_CmdProc, since it accepts a vector
+ of objects as arguments. Change the object vector to be const,
+ since that's what all the users of this structure seem to expect.
+ (call_obj_wrapper): Cast clientData properly before storing it in
+ the wrapped_args structure.
+
Thu May 28 17:19:14 1998 Keith Seitz <keiths@cygnus.com>
* gdbtk.c (_initialize_gdbtk): Get rid of the console. Patch from
diff --git a/gdb/gdbtk.c b/gdb/gdbtk.c
index bbecaf8..e99f339 100644
--- a/gdb/gdbtk.c
+++ b/gdb/gdbtk.c
@@ -172,6 +172,7 @@ static int gdb_loadfile PARAMS ((ClientData, Tcl_Interp *, int, Tcl_Obj *CONST o
static int gdb_set_bp PARAMS ((ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]));
static struct symtab *full_lookup_symtab PARAMS ((char *file));
static int gdb_get_mem PARAMS ((ClientData, Tcl_Interp *, int, char *[]));
+static int gdb_get_trace_frame_num PARAMS ((ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]));
/* Handle for TCL interpreter */
static Tcl_Interp *interp = NULL;
@@ -293,6 +294,12 @@ gdbtk_flush (stream)
#endif
}
+/* Print the string PTR, with necessary hair for dealing with the
+ GDB console thingy, etc. To wit:
+
+ Append the string PTR to result_ptr or error_string_ptr, if they
+ are set. Otherwise, call the Tcl function `gdbtk_tcl_fputs', with
+ the string PTR as its only argument. */
static void
gdbtk_fputs (ptr, stream)
const char *ptr;
@@ -1181,9 +1188,9 @@ wrapped_call (args)
struct wrapped_call_objs
{
Tcl_Interp *interp;
- Tcl_CmdProc *func;
+ Tcl_ObjCmdProc *func;
int objc;
- Tcl_Obj **objv;
+ Tcl_Obj * CONST *objv;
int val;
};
@@ -1306,7 +1313,7 @@ call_obj_wrapper (clientData, interp, objc, objv)
old_error_string_ptr = error_string_ptr;
error_string_ptr = &error_string;
- wrapped_args.func = (Tcl_CmdProc *)clientData;
+ wrapped_args.func = (Tcl_ObjCmdProc *)clientData;
wrapped_args.interp = interp;
wrapped_args.objc = objc;
wrapped_args.objv = objv;
@@ -1329,6 +1336,17 @@ call_obj_wrapper (clientData, interp, objc, objv)
running_now = 0;
Tcl_Eval (interp, "gdbtk_tcl_idle");
+
+
+ /* if the error message is in RESULT instead of ERROR_STRING we copy it
+ back to ERROR_STRING and free RESULT */
+
+ if ((Tcl_DStringLength (&error_string) == 0) && (Tcl_DStringLength (&result) > 0))
+ {
+ Tcl_DStringAppend (&error_string, Tcl_DStringValue (&result), Tcl_DStringLength (&result));
+ Tcl_DStringFree (&result);
+ }
+
}
/* do not suppress any errors -- a remote target could have errored */
@@ -2021,13 +2039,21 @@ gdbtk_call_command (cmdblk, arg, from_tty)
/* HACK! HACK! This is to get the gui to update the tstart/tstop
button only incase of tstart/tstop commands issued from the console
- We don't want to update the src window, s we need to have specific
+ We don't want to update the src window, so we need to have specific
procedures to do tstart and tstop
-*/
+ Unfortunately this will not display errors from tstart or tstop in the
+ console window itself, but as dialogs.*/
+
if (!strcmp(cmdblk->name, "tstart") && !No_Update)
+ {
Tcl_Eval (interp, "gdbtk_tcl_tstart");
+ (*cmdblk->function.cfunc)(arg, from_tty);
+ }
else if (!strcmp(cmdblk->name, "tstop") && !No_Update)
+ {
Tcl_Eval (interp, "gdbtk_tcl_tstop");
+ (*cmdblk->function.cfunc)(arg, from_tty);
+ }
/* end of hack */
else
{
@@ -2299,6 +2325,8 @@ gdbtk_init ( argv0 )
Tcl_CreateCommand (interp, "gdb_pc_reg", get_pc_register, NULL, NULL);
Tcl_CreateObjCommand (interp, "gdb_loadfile", call_obj_wrapper, gdb_loadfile, NULL);
Tcl_CreateObjCommand (interp, "gdb_set_bp", call_obj_wrapper, gdb_set_bp, NULL);
+ Tcl_CreateObjCommand (interp, "gdb_get_trace_frame_num",
+ call_obj_wrapper, gdb_get_trace_frame_num, NULL);
command_loop_hook = tk_command_loop;
print_frame_info_listing_hook = gdbtk_print_frame_info;
@@ -2707,6 +2735,28 @@ gdb_get_line_command (clientData, interp, objc, objv)
return TCL_OK;
}
+
+static int
+gdb_get_trace_frame_num (clientData, interp, objc, objv)
+ ClientData clientData;
+ Tcl_Interp *interp;
+ int objc;
+ Tcl_Obj *CONST objv[];
+{
+ if (objc != 1)
+ {
+ Tcl_AppendResult (interp, "wrong # of args: should be \"",
+ Tcl_GetStringFromObj (objv[0], NULL),
+ " linespec\"");
+ return TCL_ERROR;
+ }
+
+ Tcl_SetObjResult (interp, Tcl_NewIntObj (get_traceframe_number ()));
+ return TCL_OK;
+}
+
+
+
static int
gdb_get_file_command (clientData, interp, objc, objv)
ClientData clientData;
@@ -3001,6 +3051,7 @@ gdb_actions_command (clientData, interp, objc, objv)
char *number, *args, *action;
long step_count;
struct action_line *next = NULL, *temp;
+ enum actionline_type linetype;
if (objc != 3)
{
@@ -3025,14 +3076,23 @@ gdb_actions_command (clientData, interp, objc, objv)
step_count = 0;
Tcl_ListObjGetElements (interp, objv[2], &nactions, &actions);
+
+ /* Add the actions to the tracepoint */
for (i = 0; i < nactions; i++)
{
temp = xmalloc (sizeof (struct action_line));
temp->next = NULL;
action = Tcl_GetStringFromObj (actions[i], &len);
temp->action = savestring (action, len);
- if (sscanf (temp->action, "while-stepping %d", &step_count) !=0)
- tp->step_count = step_count;
+
+ linetype = validate_actionline (&(temp->action), tp);
+
+ if (linetype == BADLINE)
+ {
+ free (temp);
+ continue;
+ }
+
if (next == NULL)
{
tp->actions = temp;