diff options
author | Jim Kingdon <jkingdon@engr.sgi.com> | 1991-04-22 07:08:07 +0000 |
---|---|---|
committer | Jim Kingdon <jkingdon@engr.sgi.com> | 1991-04-22 07:08:07 +0000 |
commit | fcb887ffcd896af0b53c7ac8808bfeed54b321e8 (patch) | |
tree | 5cd8b0003e433499305094cd4143ae12e71391f4 /gdb/breakpoint.c | |
parent | 33614d0fc6d6209e6a3297473b14f04393ce0267 (diff) | |
download | gdb-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.c | 17 |
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 */ } |