From: Andrew STUBBS <andrew.stubbs@st.com>
To: gdb-patches@sources.redhat.com
Subject: [PATCH] init-if-undefined command
Date: Wed, 16 Nov 2005 14:58:00 -0000 [thread overview]
Message-ID: <437B3E56.3080306@st.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 618 bytes --]
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
[-- Attachment #2: init-if-undefined.patch --]
[-- Type: text/plain, Size: 3560 bytes --]
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
next reply other threads:[~2005-11-16 14:16 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-11-16 14:58 Andrew STUBBS [this message]
2005-11-16 20:00 ` Eli Zaretskii
2005-11-16 20:09 ` Joel Brobecker
2005-11-17 1:19 ` Jim Blandy
[not found] ` <8f2776cb0511161507j33208ae1k1e0753b72b992c73@mail.gmail.com>
[not found] ` <20051116233326.GZ1635@adacore.com>
[not found] ` <8f2776cb0511161602wb469964xdd904aab0d70d2a6@mail.gmail.com>
2005-11-17 3:45 ` Joel Brobecker
2005-11-17 4:47 ` Daniel Jacobowitz
2005-11-30 1:58 ` Andrew STUBBS
2005-11-30 13:59 ` Jim Blandy
2005-11-30 20:28 ` Andrew STUBBS
2005-11-30 21:20 ` Jim Blandy
2005-11-30 23:01 ` Daniel Jacobowitz
[not found] ` <8f2776cb0511301501t4eb7bb50w484427fd892f5a58@mail.gmail.com>
2005-12-01 11:55 ` Andrew STUBBS
2005-12-01 17:32 ` Andrew STUBBS
2005-12-01 23:38 ` Jim Blandy
2005-12-02 10:44 ` Andrew STUBBS
2005-12-02 10:33 ` Eli Zaretskii
2005-12-02 11:18 ` Andrew STUBBS
2005-12-01 22:50 ` Jim Blandy
2005-12-02 13:05 ` Andrew STUBBS
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=437B3E56.3080306@st.com \
--to=andrew.stubbs@st.com \
--cc=gdb-patches@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox