aboutsummaryrefslogtreecommitdiff
path: root/gdb/breakpoint.c
diff options
context:
space:
mode:
authorJim Kingdon <jkingdon@engr.sgi.com>1991-04-22 07:08:07 +0000
committerJim Kingdon <jkingdon@engr.sgi.com>1991-04-22 07:08:07 +0000
commitfcb887ffcd896af0b53c7ac8808bfeed54b321e8 (patch)
tree5cd8b0003e433499305094cd4143ae12e71391f4 /gdb/breakpoint.c
parent33614d0fc6d6209e6a3297473b14f04393ce0267 (diff)
downloadgdb-fcb887ffcd896af0b53c7ac8808bfeed54b321e8.zip
gdb-fcb887ffcd896af0b53c7ac8808bfeed54b321e8.tar.gz
gdb-fcb887ffcd896af0b53c7ac8808bfeed54b321e8.tar.bz2
* breakpoint.c (bpstat_print): Try all elements on the bpstat
chain before giving up with an internal error. Sun Apr 21 21:43:10 1991 Jim Kingdon (kingdon at cygint.cygnus.com) * value.h, values.c (value_{,free_to_}mark): New functions. breakpoint.c (bpstat_stop_status): Use them.
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r--gdb/breakpoint.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 4617e5d..e5d3c69 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -643,6 +643,13 @@ bpstat_print (bs)
return 1;
}
+ /* Maybe another breakpoint in the chain caused us to stop.
+ (Currently all watchpoints go on the bpstat whether hit or
+ not. That probably could (should) be changed, provided care is taken
+ with respect to bpstat_explains_signal). */
+ if (bs->next)
+ return bpstat_print (bs->next);
+
fprintf_filtered (stderr, "gdb internal error: in bpstat_print\n");
return 0;
}
@@ -742,10 +749,16 @@ bpstat_stop_status (pc, frame_address)
if (within_current_scope)
{
+ /* We use value_{,free_to_}mark because it could be a
+ *long* time before we return to the command level and
+ call free_all_values. */
+
+ value mark = value_mark ();
value new_val = evaluate_expression (b->exp);
- release_value (new_val);
if (!value_equal (b->val, new_val))
{
+ release_value (new_val);
+ value_free_to_mark (mark);
bs->old_val = b->val;
b->val = new_val;
/* We will stop here */
@@ -753,7 +766,7 @@ bpstat_stop_status (pc, frame_address)
else
{
/* Nothing changed, don't do anything. */
- value_free (new_val);
+ value_free_to_mark (mark);
continue;
/* We won't stop here */
}