summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2020-12-11 09:59:15 -0700
committerTom Tromey <tom@tromey.com>2020-12-11 10:10:53 -0700
commit02c727013cc3ae08b86ad360429f9a0dbdc0ec92 (patch)
treea2ab1ef9c1f3d7c441e615f01fd671c135742827
parent14a772212b8e8e19b45a23e2dacb61ceff0d4979 (diff)
downloadbinutils-gdb-02c727013cc3ae08b86ad360429f9a0dbdc0ec92.tar.gz
Avoid side effects in expression lexers
I noticed that some of the lexers were calling write_dollar_variable from the lexer. This seems like a bad practice, so this patch moves the side effects into the parsers. I tested this by re-running gdb.fortran and gdb.modula2; the Pascal compiler on my machine seems not to work, so I couldn't test gdb.pascal. I note that the type-tracking in the Pascal is also incorrect, in that a convenience variable's type may change between parsing and evaluation (or even during the course of evaluation). gdb/ChangeLog 2020-12-11 Tom Tromey <tom@tromey.com> * p-exp.y (intvar): Remove global. (DOLLAR_VARIABLE): Change type. (start): Update. (exp): Call write_dollar_variable here... (yylex): ... not here. * m2-exp.y (DOLLAR_VARIABLE): Change type. (variable): Call write_dollar_variable here... (yylex): ... not here. * f-exp.y (DOLLAR_VARIABLE): Change type. (exp): Call write_dollar_variable here... (yylex): ... not here.
-rw-r--r--gdb/ChangeLog14
-rw-r--r--gdb/f-exp.y10
-rw-r--r--gdb/m2-exp.y8
-rw-r--r--gdb/p-exp.y48
4 files changed, 44 insertions, 36 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a3d977dc604..992da3db302 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,19 @@
2020-12-11 Tom Tromey <tom@tromey.com>
+ * p-exp.y (intvar): Remove global.
+ (DOLLAR_VARIABLE): Change type.
+ (start): Update.
+ (exp): Call write_dollar_variable here...
+ (yylex): ... not here.
+ * m2-exp.y (DOLLAR_VARIABLE): Change type.
+ (variable): Call write_dollar_variable here...
+ (yylex): ... not here.
+ * f-exp.y (DOLLAR_VARIABLE): Change type.
+ (exp): Call write_dollar_variable here...
+ (yylex): ... not here.
+
+2020-12-11 Tom Tromey <tom@tromey.com>
+
* varobj.c (varobj_create): Update.
(install_variable): Return void.
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index edfbe0cd220..ea32056f6db 100644
--- a/gdb/f-exp.y
+++ b/gdb/f-exp.y
@@ -174,7 +174,7 @@ static int parse_number (struct parser_state *, const char *, int,
%token SINGLE DOUBLE PRECISION
%token <lval> CHARACTER
-%token <voidval> DOLLAR_VARIABLE
+%token <sval> DOLLAR_VARIABLE
%token <opcode> ASSIGN_MODIFY
%token <opcode> UNOP_INTRINSIC BINOP_INTRINSIC
@@ -509,6 +509,7 @@ exp : variable
;
exp : DOLLAR_VARIABLE
+ { write_dollar_variable (pstate, $1); }
;
exp : SIZEOF '(' type ')' %prec UNARY
@@ -1357,11 +1358,8 @@ yylex (void)
yylval.sval.length = namelen;
if (*tokstart == '$')
- {
- write_dollar_variable (pstate, yylval.sval);
- return DOLLAR_VARIABLE;
- }
-
+ return DOLLAR_VARIABLE;
+
/* Use token-type TYPENAME for symbols that happen to be defined
currently as names of types; NAME for other symbols.
The caller is not constrained to care about the distinction. */
diff --git a/gdb/m2-exp.y b/gdb/m2-exp.y
index f6f11126c69..d4f3c2c1e45 100644
--- a/gdb/m2-exp.y
+++ b/gdb/m2-exp.y
@@ -125,7 +125,7 @@ static int number_sign = 1;
/* The GDB scope operator */
%token COLONCOLON
-%token <voidval> DOLLAR_VARIABLE
+%token <sval> DOLLAR_VARIABLE
/* M2 tokens */
%left ','
@@ -535,6 +535,7 @@ variable: fblock
/* GDB internal ($foo) variable */
variable: DOLLAR_VARIABLE
+ { write_dollar_variable (pstate, $1); }
;
/* GDB scope operator */
@@ -952,10 +953,7 @@ yylex (void)
yylval.sval.length = namelen;
if (*tokstart == '$')
- {
- write_dollar_variable (pstate, yylval.sval);
- return DOLLAR_VARIABLE;
- }
+ return DOLLAR_VARIABLE;
/* Use token-type BLOCKNAME for symbols that happen to be defined as
functions. If this is not so, then ...
diff --git a/gdb/p-exp.y b/gdb/p-exp.y
index 9caf15f69f5..618557c472a 100644
--- a/gdb/p-exp.y
+++ b/gdb/p-exp.y
@@ -115,7 +115,6 @@ static int parse_number (struct parser_state *,
const char *, int, int, YYSTYPE *);
static struct type *current_type;
-static struct internalvar *intvar;
static int leftdiv_is_integer;
static void push_current_type (void);
static void pop_current_type (void);
@@ -161,7 +160,7 @@ static int search_field;
/* Special type cases, put in to allow the parser to distinguish different
legal basetypes. */
-%token <voidval> DOLLAR_VARIABLE
+%token <sval> DOLLAR_VARIABLE
/* Object pascal */
@@ -192,7 +191,6 @@ static int search_field;
%%
start : { current_type = NULL;
- intvar = NULL;
search_field = 0;
leftdiv_is_integer = 0;
}
@@ -526,17 +524,28 @@ exp : variable
;
exp : DOLLAR_VARIABLE
- /* Already written by write_dollar_variable.
- Handle current_type. */
- { if (intvar) {
- struct value * val, * mark;
-
- mark = value_mark ();
- val = value_of_internalvar (pstate->gdbarch (),
- intvar);
- current_type = value_type (val);
- value_release_to_mark (mark);
- }
+ {
+ write_dollar_variable (pstate, $1);
+
+ /* $ is the normal prefix for pascal
+ hexadecimal values but this conflicts
+ with the GDB use for debugger variables
+ so in expression to enter hexadecimal
+ values we still need to use C syntax with
+ 0xff */
+ std::string tmp ($1.ptr, $1.length);
+ /* Handle current_type. */
+ struct internalvar *intvar
+ = lookup_only_internalvar (tmp.c_str () + 1);
+ if (intvar != nullptr)
+ {
+ scoped_value_mark mark;
+
+ value *val
+ = value_of_internalvar (pstate->gdbarch (),
+ intvar);
+ current_type = value_type (val);
+ }
}
;
@@ -1494,17 +1503,6 @@ yylex (void)
if (*tokstart == '$')
{
- char *tmp;
-
- /* $ is the normal prefix for pascal hexadecimal values
- but this conflicts with the GDB use for debugger variables
- so in expression to enter hexadecimal values
- we still need to use C syntax with 0xff */
- write_dollar_variable (pstate, yylval.sval);
- tmp = (char *) alloca (namelen + 1);
- memcpy (tmp, tokstart, namelen);
- tmp[namelen] = '\0';
- intvar = lookup_only_internalvar (tmp + 1);
free (uptokstart);
return DOLLAR_VARIABLE;
}