This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] init-if-undefined command


Hi,

I have decided that, instead of queuing all my patches here while waiting for the current ones to go through, I shall post them all now. Hopefully the low hanging fruit will then get done and only the most controversial ones will remain when I go away for Christmas.

The attached patch adds a new CLI command named 'init-if-undefined'.

This is essentially the same a 'set variable' (for convenience variables only), but does not set the variable if it already has a value.

It is useful in scripts whose values can be overridden, or as an approximation of a statically initialised variable.

Andrew Stubbs
2005-11-16  Andrew Stubbs  <andrew.stubbs@st.com>

	* value.c (init_if_undefined_command): New function.
	(_initialize_values): Add command init-if-undefined.

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

Index: src/gdb/value.c
===================================================================
--- src.orig/gdb/value.c	2005-11-03 17:44:15.000000000 +0000
+++ src/gdb/value.c	2005-11-03 17:48:33.000000000 +0000
@@ -727,6 +727,47 @@ 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)
+    {
+      printf_unfiltered ("usage: init-if-undefined $<var> = <expr>\n");
+      do_cleanups (old_chain);
+      return;
+    }
+
+  /* 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)
+    {
+      printf_unfiltered ("First parameter to init-if-undefined should be a GDB variable\n");
+      do_cleanups (old_chain);
+      return;
+    }
+  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 +1680,9 @@ A few convenience variables are given va
   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, _("\
+init-if-undefined <var> = <expr>\n\
+Ensure that an internal variable exists and set it to\n\
+a given value if it does not."));
 }
Index: src/gdb/doc/gdb.texinfo
===================================================================
--- src.orig/gdb/doc/gdb.texinfo	2005-11-03 17:44:15.000000000 +0000
+++ src/gdb/doc/gdb.texinfo	2005-11-03 17:45:10.000000000 +0000
@@ -6131,6 +6131,18 @@ variable, when used as an expression, ha
 @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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]