diff options
author | Andrew Cagney <cagney@redhat.com> | 2002-04-10 22:14:02 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2002-04-10 22:14:02 +0000 |
commit | 7cc19214aa83761f61b42a8eed01732d39495972 (patch) | |
tree | 6855c224bd10e273e3742910687fe47f7624c0d8 /gdb/stack.c | |
parent | 67a2b77effae04a5f6c050fd191149c26deb8a82 (diff) | |
download | gdb-7cc19214aa83761f61b42a8eed01732d39495972.zip gdb-7cc19214aa83761f61b42a8eed01732d39495972.tar.gz gdb-7cc19214aa83761f61b42a8eed01732d39495972.tar.bz2 |
* stack.c (select_frame): Check that selected_frame and the
specified level are as expected.
* blockframe.c (get_prev_frame): Set the `level' from next_frame.
Update copyright.
* frame.h (struct frame_info): Add field `level'. Update
copyright.
Work-in-progress PR gdb/464.
Diffstat (limited to 'gdb/stack.c')
-rw-r--r-- | gdb/stack.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gdb/stack.c b/gdb/stack.c index bedb6ee..a348934 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -1458,6 +1458,38 @@ select_frame (struct frame_info *fi, int level) selected_frame = fi; selected_frame_level = level; + /* FIXME: cagney/2002-04-05: It can't be this easy (and looking at + the increasingly complex list of checkes, it wasn't)! GDB is + dragging around, and constantly updating, the global variable + selected_frame_level. Surely all that was needed was for the + level to be computed direct from the frame (by counting back to + the inner-most frame) or, as has been done here using a cached + value. For moment, check that the expected and the actual level + are consistent. If, after a few weeks, no one reports that this + assertion has failed, the global selected_frame_level and many + many parameters can all be deleted. */ + if (fi == NULL && level == -1) + /* Ok. The target is clearing the selected frame as part of a + cache flush. */ + ; + else if (fi != NULL && fi->level == level) + /* Ok. What you would expect. Level is redundant. */ + ; + else if (fi != NULL && level == -1) + /* Ok. See breakpoint.c. The watchpoint code changes the + selected frame to the frame that contains the watchpoint and + then, later changes it back to the old value. The -1 is used + as a marker so that the watchpoint code can easily detect that + things are not what they should be. Why the watchpoint code + can't mindlessly save/restore the selected frame I don't know, + hopefully it can be simplified that way. Hopefully the global + selected_frame can be replaced by a frame parameter, making + still more simplification possible. */ + ; + else + internal_error (__FILE__, __LINE__, + "oops! fi=0x%p, fi->level=%d, level=%d", + fi, fi ? fi->level : -1, level); if (selected_frame_level_changed_hook) selected_frame_level_changed_hook (level); |