* mi/mi-main.c (mi_cmd_execute): Use cleanup from
	prepare_execute_command.
	* top.c (prepare_execute_command): Return cleanup.
	(execute_command): Use cleanup from prepare_execute_command.
	* top.h (prepare_execute_command): Change prototype to return
	cleanup.
	* defs.h (struct value): Add opaque declaration.
	(make_cleanup_value_free_to_mark): Add prototype.
	* utils.c (do_value_free_to_mark): New function.
	(make_cleanup_value_free_to_mark): Likewise.

gdb/testsuite/
	* gdb.python/py-function.exp: Test setting a value from a function
	which executes a command.
This commit is contained in:
Thiago Jung Bauermann 2011-05-13 04:34:25 +00:00
parent c9eaa05f39
commit 028d0ed5d1
8 changed files with 68 additions and 8 deletions

View File

@ -1,3 +1,16 @@
2011-05-13 Thiago Jung Bauermann <bauerman@br.ibm.com>
* mi/mi-main.c (mi_cmd_execute): Use cleanup from
prepare_execute_command.
* top.c (prepare_execute_command): Return cleanup.
(execute_command): Use cleanup from prepare_execute_command.
* top.h (prepare_execute_command): Change prototype to return
cleanup.
* defs.h (struct value): Add opaque declaration.
(make_cleanup_value_free_to_mark): Add prototype.
* utils.c (do_value_free_to_mark): New function.
(make_cleanup_value_free_to_mark): Likewise.
2011-05-12 Tom Tromey <tromey@redhat.com> 2011-05-12 Tom Tromey <tromey@redhat.com>
* dwarf2expr.c (execute_stack_op) <DW_OP_shr>: Unconditionally * dwarf2expr.c (execute_stack_op) <DW_OP_shr>: Unconditionally

View File

@ -281,6 +281,7 @@ struct symtab;
struct breakpoint; struct breakpoint;
struct frame_info; struct frame_info;
struct gdbarch; struct gdbarch;
struct value;
/* From main.c. */ /* From main.c. */
@ -360,6 +361,8 @@ extern struct cleanup *make_cleanup_unpush_target (struct target_ops *ops);
extern struct cleanup * extern struct cleanup *
make_cleanup_restore_ui_file (struct ui_file **variable); make_cleanup_restore_ui_file (struct ui_file **variable);
extern struct cleanup *make_cleanup_value_free_to_mark (struct value *);
extern struct cleanup *make_final_cleanup (make_cleanup_ftype *, void *); extern struct cleanup *make_final_cleanup (make_cleanup_ftype *, void *);
extern struct cleanup *make_my_cleanup (struct cleanup **, extern struct cleanup *make_my_cleanup (struct cleanup **,

View File

@ -2025,9 +2025,7 @@ mi_cmd_execute (struct mi_parse *parse)
{ {
struct cleanup *cleanup; struct cleanup *cleanup;
prepare_execute_command (); cleanup = prepare_execute_command ();
cleanup = make_cleanup (null_cleanup, NULL);
if (parse->all && parse->thread_group != -1) if (parse->all && parse->thread_group != -1)
error (_("Cannot specify --thread-group together with --all")); error (_("Cannot specify --thread-group together with --all"));

View File

@ -1,3 +1,8 @@
2011-05-13 Thiago Jung Bauermann <bauerman@br.ibm.com>
* gdb.python/py-function.exp: Test setting a value from a function
which executes a command.
2011-05-12 Tom Tromey <tromey@redhat.com> 2011-05-12 Tom Tromey <tromey@redhat.com>
* gdb.dwarf2/typeddwarf.S: New file. * gdb.dwarf2/typeddwarf.S: New file.

View File

@ -95,3 +95,17 @@ gdb_py_test_multiple "Test Normal Error" \
gdb_test "print \$normalerror()" "Traceback.*File.*line 5.*in invoke.*RuntimeError.*This is a Normal Error.*" \ gdb_test "print \$normalerror()" "Traceback.*File.*line 5.*in invoke.*RuntimeError.*This is a Normal Error.*" \
"Test a Runtime error. There should be a stack trace." "Test a Runtime error. There should be a stack trace."
gdb_py_test_multiple "input command-calling function" \
"python" "" \
"class CallCommand(gdb.Function):" "" \
" def __init__(self):" "" \
" gdb.Function.__init__(self, 'call_command')" "" \
" def invoke(self):" "" \
" return gdb.execute('print 1', to_string=True)" "" \
"CallCommand ()" "" \
"end" ""
gdb_test_no_output "set var \$foo = \$call_command()" "Setting a value from a function which executes a command."
# There was a bug where GDB would segfault in the second call, so try calling again.
gdb_test_no_output "set var \$foo = \$call_command()" "Setting a value from a function which executes a command, again."

View File

@ -339,10 +339,14 @@ do_chdir_cleanup (void *old_dir)
} }
#endif #endif
void struct cleanup *
prepare_execute_command (void) prepare_execute_command (void)
{ {
free_all_values (); struct value *mark;
struct cleanup *cleanup;
mark = value_mark ();
cleanup = make_cleanup_value_free_to_mark (mark);
/* With multiple threads running while the one we're examining is /* With multiple threads running while the one we're examining is
stopped, the dcache can get stale without us being able to detect stopped, the dcache can get stale without us being able to detect
@ -350,6 +354,8 @@ prepare_execute_command (void)
help things like backtrace. */ help things like backtrace. */
if (non_stop) if (non_stop)
target_dcache_invalidate (); target_dcache_invalidate ();
return cleanup;
} }
/* Execute the line P as a command, in the current user context. /* Execute the line P as a command, in the current user context.
@ -358,12 +364,13 @@ prepare_execute_command (void)
void void
execute_command (char *p, int from_tty) execute_command (char *p, int from_tty)
{ {
struct cleanup *cleanup;
struct cmd_list_element *c; struct cmd_list_element *c;
enum language flang; enum language flang;
static int warned = 0; static int warned = 0;
char *line; char *line;
prepare_execute_command (); cleanup = prepare_execute_command ();
/* Force cleanup of any alloca areas if using C alloca instead of /* Force cleanup of any alloca areas if using C alloca instead of
a builtin alloca. */ a builtin alloca. */
@ -462,6 +469,8 @@ execute_command (char *p, int from_tty)
warned = 1; warned = 1;
} }
} }
do_cleanups (cleanup);
} }
/* Run execute_command for P and FROM_TTY. Capture its output into the /* Run execute_command for P and FROM_TTY. Capture its output into the

View File

@ -48,8 +48,9 @@ extern int quit_cover (void *);
extern void execute_command (char *, int); extern void execute_command (char *, int);
/* Prepare for execution of a command. /* Prepare for execution of a command.
Call this before every command, CLI or MI. */ Call this before every command, CLI or MI.
extern void prepare_execute_command (void); Returns a cleanup to be run after the command is completed. */
extern struct cleanup *prepare_execute_command (void);
/* This function returns a pointer to the string that is used /* This function returns a pointer to the string that is used
by gdb for its command prompt. */ by gdb for its command prompt. */

View File

@ -431,6 +431,23 @@ make_cleanup_restore_ui_file (struct ui_file **variable)
return make_cleanup_dtor (do_restore_ui_file, (void *) c, xfree); return make_cleanup_dtor (do_restore_ui_file, (void *) c, xfree);
} }
/* Helper for make_cleanup_value_free_to_mark. */
static void
do_value_free_to_mark (void *value)
{
value_free_to_mark ((struct value *) value);
}
/* Free all values allocated since MARK was obtained by value_mark
(except for those released) when the cleanup is run. */
struct cleanup *
make_cleanup_value_free_to_mark (struct value *mark)
{
return make_my_cleanup (&cleanup_chain, do_value_free_to_mark, mark);
}
struct cleanup * struct cleanup *
make_my_cleanup2 (struct cleanup **pmy_chain, make_cleanup_ftype *function, make_my_cleanup2 (struct cleanup **pmy_chain, make_cleanup_ftype *function,
void *arg, void (*free_arg) (void *)) void *arg, void (*free_arg) (void *))