From: "Rob Quill" <rob.quill@gmail.com>
To: "Eli Zaretskii" <eliz@gnu.org>
Cc: jimb@red-bean.com, gdb-patches@sourceware.org
Subject: Re: New scope checking patch
Date: Mon, 28 Jul 2008 10:31:00 -0000 [thread overview]
Message-ID: <baf6008d0807280331w28341385ja3bbf1bee7888aed@mail.gmail.com> (raw)
In-Reply-To: <u3alu4s00.fsf@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 1111 bytes --]
2008/7/28 Eli Zaretskii <eliz@gnu.org>:
>> Date: Mon, 28 Jul 2008 00:45:03 +0100
>> From: "Rob Quill" <rob.quill@gmail.com>
>> Cc: "Jim Blandy" <jimb@red-bean.com>, gdb-patches@sourceware.org
>>
>> This patch (like the remove deprecated_set_value_type one) has been a
>> long time coming. Please find attached what I believe should be the
>> final version of this patch.
>
> Thanks.
>
>> --- gdb/NEWS 18 Jul 2008 20:55:32 -0000 1.282
>> +++ gdb/NEWS 27 Jul 2008 23:02:48 -0000
>> @@ -3,6 +3,12 @@
>>
>> *** Changes since GDB 6.8
>>
>> +* New expression type
>> +
>> +$in_scope(...)
>> + The value of this expression is 1 if the variable within the
>> + parentheses is within the current scope, 0 otherwise.
>
> This is okay.
>
>> +provided that you check if it is in scope before you test it's value. The operator
> ^^^^
> "its"
I thought about that before I submitted it but couldn't make up my
mind as to which was right, as the scope belongs to the variable so
maybe it needed an apostrophe. Anyway, I've attached the fixed patch.
Rob
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: in_scope.patch --]
[-- Type: text/x-diff; name=in_scope.patch, Size: 4259 bytes --]
2008-07-27 Rob Quill <rob.quill@gmail.com>
Add $in_scope as a type of expression.
* c-exp.y (IN_SCOPE): New token.
(exp): IN_SCOPE (name): evaluates to 1 if name is in scope,
0 otherwise.
(yylex): Match "$in_scope" as IN_SCOPE token
* gdb.texinfo (expressions): Add a small paragraph (with an
example) about the $in_scope operator.
* NEWS: Mentions $in_scope.
Index: gdb/NEWS
===================================================================
RCS file: /cvs/src/src/gdb/NEWS,v
retrieving revision 1.282
diff -u -p -r1.282 NEWS
--- gdb/NEWS 18 Jul 2008 20:55:32 -0000 1.282
+++ gdb/NEWS 27 Jul 2008 23:02:48 -0000
@@ -3,6 +3,12 @@
*** Changes since GDB 6.8
+* New expression type
+
+$in_scope(...)
+ The value of this expression is 1 if the variable within the
+ parentheses is within the current scope, 0 otherwise.
+
* Commands `set debug-file-directory', `set solib-search-path' and `set args'
now complete on file names.
Index: gdb/c-exp.y
===================================================================
RCS file: /cvs/src/src/gdb/c-exp.y,v
retrieving revision 1.46
diff -u -p -r1.46 c-exp.y
--- gdb/c-exp.y 25 Jun 2008 15:49:20 -0000 1.46
+++ gdb/c-exp.y 27 Jul 2008 23:02:49 -0000
@@ -209,6 +209,8 @@ static int parse_number (char *, int, in
%token TRUEKEYWORD
%token FALSEKEYWORD
+/* $in_scope opperator */
+%token IN_SCOPE
%left ','
%left ABOVE_COMMA
@@ -252,6 +254,30 @@ exp1 : exp
;
/* Expressions, not including the comma operator. */
+exp : IN_SCOPE '(' name_not_typename ')'
+ {
+ struct type *int_type;
+ struct minimal_symbol *min_symbol;
+
+ /* If there are no symbols then just stop right away */
+ if (!have_full_symbols () && !have_partial_symbols ())
+ error ("No symbol table is loaded. Use the \"file\" command.");
+
+ /* Otherwise, prepare to write out the value */
+ int_type = builtin_type (current_gdbarch)->builtin_int;
+ write_exp_elt_opcode (OP_LONG);
+ write_exp_elt_type (int_type);
+
+ min_symbol =
+ lookup_minimal_symbol (copy_name($3.stoken), NULL, NULL);
+ if ($3.sym || min_symbol)
+ write_exp_elt_longcst ((LONGEST) 1);
+ else
+ write_exp_elt_longcst ((LONGEST) 0);
+
+ write_exp_elt_opcode (OP_LONG); }
+ ;
+
exp : '*' exp %prec UNARY
{ write_exp_elt_opcode (UNOP_IND); }
;
@@ -1739,6 +1765,9 @@ yylex ()
/* Catch specific keywords. Should be done with a data structure. */
switch (namelen)
{
+ case 9:
+ if (strncmp (tokstart, "$in_scope", 9) == 0)
+ return IN_SCOPE;
case 8:
if (strncmp (tokstart, "unsigned", 8) == 0)
return UNSIGNED;
Index: gdb/doc/gdb.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
retrieving revision 1.509
diff -u -p -r1.509 gdb.texinfo
--- gdb/doc/gdb.texinfo 18 Jul 2008 20:55:33 -0000 1.509
+++ gdb/doc/gdb.texinfo 27 Jul 2008 23:03:11 -0000
@@ -5750,6 +5750,24 @@ memory. @var{addr} may be any expressio
pointer (but parentheses are required around binary operators, just as in
a cast). This construct is allowed regardless of what kind of data is
normally supposed to reside at @var{addr}.
+
+@vindex $in_scope
+@cindex variable in scope, testing
+@item $in_scope
+@samp{$in_scope} allows you to check if a variable is in scope,
+returning 1 if it is and 0 if it is not. This is most useful when scripting @value{GDBN}
+as it means that the script will not stop executing if a variable is not in scope,
+provided that you check if it is in scope before you test its value. The operator
+only works on variables and will not work on structure members or array elements
+for instance.
+
+An example usage from a GDB script may be:
+
+@smallexample
+if ($in_scope(a) == 1 && $in_scope(b) == 1)
+ print a+b
+@end smallexample
+
@end table
@node Ambiguous Expressions
next prev parent reply other threads:[~2008-07-28 10:31 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-12 16:29 Rob Quill
2007-11-12 23:26 ` Michael Snyder
2008-01-10 1:00 ` Jim Blandy
2008-01-11 0:52 ` Rob Quill
2008-01-11 22:51 ` Jim Blandy
2008-01-14 23:07 ` Michael Snyder
2008-01-15 17:06 ` Jim Blandy
2008-01-17 19:32 ` Rob Quill
2008-01-17 20:15 ` Jim Blandy
2008-01-17 21:11 ` Rob Quill
2008-01-17 21:58 ` Jim Blandy
2008-01-17 23:40 ` Doug Evans
2008-01-18 1:31 ` Daniel Jacobowitz
2008-01-18 3:35 ` Rob Quill
2008-01-18 18:48 ` Jim Blandy
2008-01-18 22:43 ` Rob Quill
2008-01-19 0:38 ` Jim Blandy
2008-01-30 13:11 ` Rob Quill
2008-01-30 18:14 ` Jim Blandy
2008-01-30 18:31 ` Eli Zaretskii
2008-01-31 4:11 ` Jim Blandy
2008-01-31 7:26 ` Eli Zaretskii
2008-07-27 23:45 ` Rob Quill
2008-07-28 3:18 ` Eli Zaretskii
2008-07-28 10:31 ` Rob Quill [this message]
2008-07-28 18:27 ` Eli Zaretskii
2008-07-29 20:31 ` Tom Tromey
2008-07-29 21:04 ` Rob Quill
2008-07-29 21:45 ` Tom Tromey
2008-07-29 22:53 ` Rob Quill
2008-07-30 3:34 ` Tom Tromey
2008-10-23 13:42 ` Convenience functions (was: Re: New scope checking patch) Daniel Jacobowitz
2008-10-23 15:17 ` Convenience functions Tom Tromey
2008-10-23 15:22 ` Daniel Jacobowitz
2008-10-23 15:26 ` Tom Tromey
2008-10-23 19:14 ` Tom Tromey
2008-10-24 12:53 ` Eli Zaretskii
2008-11-04 21:37 ` Convenience functions (was: Re: New scope checking patch) Thiago Jung Bauermann
2008-11-04 22:23 ` Daniel Jacobowitz
2008-11-04 22:43 ` Convenience functions Tom Tromey
2008-01-31 7:52 ` New scope checking patch Michael Snyder
2008-01-19 1:35 ` Michael Snyder
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=baf6008d0807280331w28341385ja3bbf1bee7888aed@mail.gmail.com \
--to=rob.quill@gmail.com \
--cc=eliz@gnu.org \
--cc=gdb-patches@sourceware.org \
--cc=jimb@red-bean.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