2005-12-02 Andrew Stubbs <andrew.stubbs@st.com>
authorAndrew Stubbs <andrew.stubbs@st.com>
Fri, 2 Dec 2005 11:44:19 +0000 (11:44 +0000)
committerAndrew Stubbs <andrew.stubbs@st.com>
Fri, 2 Dec 2005 11:44:19 +0000 (11:44 +0000)
* value.c (init_if_undefined_command): New function.
(_initialize_values): Add command init-if-undefined.
* NEWS (Changes since GDB 6.3): Rename to 'Changes in GDB 6.4'.
(Changes since GDB 6.4): New section.
Mention new command init-if-undefined.

doc/
* gdb.texinfo (Convenience variables): Add init-if-undefined command.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/value.c

index b4ad773325d01ee1f9fbf35cd6e6855ad1582bd3..6177fa22f06d243b7043aaceba9f3b5959bcb091 100644 (file)
@@ -1,3 +1,11 @@
+2005-12-02  Andrew Stubbs  <andrew.stubbs@st.com>
+
+       * value.c (init_if_undefined_command): New function.
+       (_initialize_values): Add command init-if-undefined.
+       * NEWS (Changes since GDB 6.3): Rename to 'Changes in GDB 6.4'.
+       (Changes since GDB 6.4): New section.
+       Mention new command init-if-undefined.
+
 2005-12-02  Andrew Stubbs  <andrew.stubbs@st.com>
 
        * symfile.c (symbol_file_clear): Test symfile_objfile is not NULL
index 84dc82792295fece7df16945d736da86ac465a80..719fbe3f682acebef9daf24db14172cba602c989 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -1,7 +1,14 @@
                What has changed in GDB?
             (Organized release by release)
 
-*** Changes since GDB 6.3
+*** Changes since GDB 6.4
+
+* New commands
+
+init-if-undefined              Initialize a convenience variable, but
+                               only if it doesn't already have a value.
+
+*** Changes in GDB 6.4
 
 * New native configurations
 
index 3f070f3f5a1ee5c93beb408834538ee674887634..d62231d675245a2c071a42ede3c355a69e0c62d5 100644 (file)
@@ -1,3 +1,7 @@
+2005-12-02  Andrew Stubbs  <andrew.stubbs@st.com>
+
+       * gdb.texinfo (Convenience variables): Add init-if-undefined command.
+
 2005-11-25  Joel Brobecker  <brobecker@adacore.com>
 
        * gdbint.texinfo (Start of New Year Procedure): New chapter.
index fef259530314b26f61afbe997d373786a16cf05a..2eb1dd85e2ae0d60bd340522dc948c9319f6e664 100644 (file)
@@ -6131,6 +6131,18 @@ variable, when used as an expression, has the type of its current value.
 @item show convenience
 Print a list of convenience variables used so far, and their values.
 Abbreviated @code{show conv}.
+
+@kindex init-if-undefined
+@cindex convenience variables, initializing
+@item init-if-undefined $@var{variable} = @var{expression}
+Set a convenience variable if it has not already been set.  This is useful
+for user-defined commands that keep some state.  It is similar, in concept,
+to using local static variables with initializers in C (except that
+convenience variables are global).  It can also be used to allow users to
+override default values used in a command script.
+
+If the variable is already defined then the expression is not evaluated so
+any side-effects do not occur.
 @end table
 
 One of the ways to use a convenience variable is as a counter to be
index 097d94140185142f7630cd6e8e31443240174179..82746ae60429388d7be9a96a909d9a90a6dcf716 100644 (file)
@@ -727,6 +727,39 @@ show_values (char *num_exp, int from_tty)
 
 static struct internalvar *internalvars;
 
+/* If the variable does not already exist create it and give it the value given.
+   If no value is given then the default is zero.  */
+static void
+init_if_undefined_command (char* args, int from_tty)
+{
+  struct internalvar* intvar;
+
+  /* Parse the expression - this is taken from set_command().  */
+  struct expression *expr = parse_expression (args);
+  register struct cleanup *old_chain =
+    make_cleanup (free_current_contents, &expr);
+
+  /* Validate the expression.
+     Was the expression an assignment?
+     Or even an expression at all?  */
+  if (expr->nelts == 0 || expr->elts[0].opcode != BINOP_ASSIGN)
+    error (_("Init-if-undefined requires an assignment expression."));
+
+  /* Extract the variable from the parsed expression.
+     In the case of an assign the lvalue will be in elts[1] and elts[2].  */
+  if (expr->elts[1].opcode != OP_INTERNALVAR)
+    error (_("The first parameter to init-if-undefined should be a GDB variable."));
+  intvar = expr->elts[2].internalvar;
+
+  /* Only evaluate the expression if the lvalue is void.
+     This may still fail if the expresssion is invalid.  */
+  if (TYPE_CODE (value_type (intvar->value)) == TYPE_CODE_VOID)
+    evaluate_expression (expr);
+
+  do_cleanups (old_chain);
+}
+
+
 /* Look up an internal variable with name NAME.  NAME should not
    normally include a dollar sign.
 
@@ -1639,4 +1672,11 @@ A few convenience variables are given values automatically:\n\
   add_cmd ("values", no_class, show_values,
           _("Elements of value history around item number IDX (or last ten)."),
           &showlist);
+
+  add_com ("init-if-undefined", class_vars, init_if_undefined_command, _("\
+Initialize a convenience variable if necessary.\n\
+init-if-undefined VARIABLE = EXPRESSION\n\
+Set an internal VARIABLE to the result of the EXPRESSION if it does not\n\
+exist or does not contain a value.  The EXPRESSION is not evaluated if the\n\
+VARIABLE is already initialized."));
 }