aboutsummaryrefslogtreecommitdiff
path: root/gdb/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/stack.c')
-rw-r--r--gdb/stack.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/gdb/stack.c b/gdb/stack.c
index 7857347..4aeb7c4 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1066,7 +1066,7 @@ up_silently_command (count_exp, from_tty)
count = parse_and_eval_address (count_exp);
count1 = count;
- if (!target_has_stack)
+ if (target_has_stack == 0 || selected_frame == 0)
error ("No stack.");
frame = find_relative_frame (selected_frame, &count1);
@@ -1099,7 +1099,7 @@ down_silently_command (count_exp, from_tty)
count = - parse_and_eval_address (count_exp);
count1 = count;
- if (!target_has_stack)
+ if (target_has_stack == 0 || selected_frame == 0)
error ("No stack.");
frame = find_relative_frame (selected_frame, &count1);
@@ -1129,6 +1129,7 @@ return_command (retval_exp, from_tty)
FRAME frame;
char *funcname;
struct cleanup *back_to;
+ value return_value;
if (selected_frame == NULL)
error ("No selected frame.");
@@ -1136,6 +1137,16 @@ return_command (retval_exp, from_tty)
selected_frame_addr = FRAME_FP (selected_frame);
selected_frame_pc = (get_frame_info (selected_frame))->pc;
+ /* Compute the return value (if any -- possibly getting errors here).
+ Call VALUE_CONTENTS to make sure we have fully evaluated it, since
+ it might live in the stack frame we're about to pop. */
+
+ if (retval_exp)
+ {
+ return_value = parse_and_eval (retval_exp);
+ (void) (VALUE_CONTENTS (return_value));
+ }
+
/* If interactive, require confirmation. */
if (from_tty)
@@ -1173,7 +1184,7 @@ return_command (retval_exp, from_tty)
for return values. */
if (retval_exp)
- set_return_value (parse_and_eval (retval_exp));
+ set_return_value (return_value);
/* If interactive, print the frame that is now current. */