]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/
authorThiago Jung Bauermann <bauerman@br.ibm.com>
Fri, 13 May 2011 04:34:25 +0000 (04:34 +0000)
committerThiago Jung Bauermann <bauerman@br.ibm.com>
Fri, 13 May 2011 04:34:25 +0000 (04:34 +0000)
* 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.

gdb/ChangeLog
gdb/defs.h
gdb/mi/mi-main.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-function.exp
gdb/top.c
gdb/top.h
gdb/utils.c

index ab2ecde41715da329241ca1fa0038bc49f490045..06ff560b77527342fc400bbaae5ed6a329a851ce 100644 (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>
 
        * dwarf2expr.c (execute_stack_op) <DW_OP_shr>: Unconditionally
index 4df2a3e77efa1f42d3bfd8086f6ac4f6f750dbaf..771d3ade8fee7601297618edf1fb6cab030c419d 100644 (file)
@@ -281,6 +281,7 @@ struct symtab;
 struct breakpoint;
 struct frame_info;
 struct gdbarch;
+struct value;
 
 /* From main.c.  */
 
@@ -360,6 +361,8 @@ extern struct cleanup *make_cleanup_unpush_target (struct target_ops *ops);
 extern struct cleanup *
   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_my_cleanup (struct cleanup **,
index e37f3b5dd0001508bdd741277e2fcb902fab695d..518127323dedf352877e98e408b4f7eb5931562a 100644 (file)
@@ -2025,9 +2025,7 @@ mi_cmd_execute (struct mi_parse *parse)
 {
   struct cleanup *cleanup;
 
-  prepare_execute_command ();
-
-  cleanup = make_cleanup (null_cleanup, NULL);
+  cleanup = prepare_execute_command ();
 
   if (parse->all && parse->thread_group != -1)
     error (_("Cannot specify --thread-group together with --all"));
index 9231ae25319e14766ecc7b24969f481c8defd072..f6ad35741a758437bc90ea1e8918a2324c3fc3ea 100644 (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>
 
        * gdb.dwarf2/typeddwarf.S: New file.
index dfccdff29718119400bc7c9ae37e3cc3f3d1f867..ffadb5b24233bfbf72ab97b59b272abb1930492e 100644 (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.*" \
     "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."
index 2b14f75c37e95500e2d8e7eeb89fd3a2718179aa..b69f7d694c908e410febef38ce116ad115741058 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -339,10 +339,14 @@ do_chdir_cleanup (void *old_dir)
 }
 #endif
 
-void
+struct cleanup *
 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
      stopped, the dcache can get stale without us being able to detect
@@ -350,6 +354,8 @@ prepare_execute_command (void)
      help things like backtrace.  */
   if (non_stop)
     target_dcache_invalidate ();
+
+  return cleanup;
 }
 
 /* Execute the line P as a command, in the current user context.
@@ -358,12 +364,13 @@ prepare_execute_command (void)
 void
 execute_command (char *p, int from_tty)
 {
+  struct cleanup *cleanup;
   struct cmd_list_element *c;
   enum language flang;
   static int warned = 0;
   char *line;
 
-  prepare_execute_command ();
+  cleanup = prepare_execute_command ();
 
   /* Force cleanup of any alloca areas if using C alloca instead of
      a builtin alloca.  */
@@ -462,6 +469,8 @@ execute_command (char *p, int from_tty)
          warned = 1;
        }
     }
+
+    do_cleanups (cleanup);
 }
 
 /* Run execute_command for P and FROM_TTY.  Capture its output into the
index ff96b750d86b67a2d105a00f6570acb1ce955657..ce509b58f1acea760892acbe3e5a80dab3e12204 100644 (file)
--- a/gdb/top.h
+++ b/gdb/top.h
@@ -48,8 +48,9 @@ extern int quit_cover (void *);
 extern void execute_command (char *, int);
 
 /* Prepare for execution of a command.
-   Call this before every command, CLI or MI.  */
-extern void prepare_execute_command (void);
+   Call this before every command, CLI or MI.
+   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
    by gdb for its command prompt.  */
index a1dac63a181ebfca90d88e3077bf9e556294d76f..3e4a54dfcfe1d979bb494fe82d98270eada22706 100644 (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);
 }
 
+/* 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 *
 make_my_cleanup2 (struct cleanup **pmy_chain, make_cleanup_ftype *function,
                  void *arg,  void (*free_arg) (void *))