aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2020-12-16 15:49:40 -0700
committerTom Tromey <tom@tromey.com>2020-12-16 17:35:37 -0700
commitc5c412054ebeb9e9c9dcbb36692b1d6235eb6106 (patch)
tree312afccbb667f8e41d5ceabd6c60ef3d6f29eb2b
parentf81baa08635491ebf42c3c3609050399d8af21af (diff)
downloadgdb-c5c412054ebeb9e9c9dcbb36692b1d6235eb6106.zip
gdb-c5c412054ebeb9e9c9dcbb36692b1d6235eb6106.tar.gz
gdb-c5c412054ebeb9e9c9dcbb36692b1d6235eb6106.tar.bz2
Change parameters to language_defn::post_parser
In the expression rewrite, Ada type resolution will be done at parse time rather than in a post-parse pass. At this point, language_defn::post_parser will be removed. However, for this to work, the information available to post_parser must be made available during the actual parse. This patch refactors this code slightly to make this possible. In particular, "void_context_p" is passed to the parser_state constructor, and the parser state is then passed to the post_parser method. gdb/ChangeLog 2020-12-16 Tom Tromey <tom@tromey.com> * rust-exp.y (rust_lex_tests): Update. * parser-defs.h (parser_state): Add void_p parameter. <void_context_p>: New member. * parse.c (parse_exp_in_context): Update. * language.h (language_defn::post_parser): Remove void_context_p, completing, tracker parameters. Add parser state. * ada-lang.c (ada_language::post_parser): Update.
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/ada-lang.c9
-rw-r--r--gdb/language.h12
-rw-r--r--gdb/parse.c4
-rw-r--r--gdb/parser-defs.h9
-rw-r--r--gdb/rust-exp.y2
6 files changed, 29 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7b8e727..8066c76 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
2020-12-16 Tom Tromey <tom@tromey.com>
+ * rust-exp.y (rust_lex_tests): Update.
+ * parser-defs.h (parser_state): Add void_p parameter.
+ <void_context_p>: New member.
+ * parse.c (parse_exp_in_context): Update.
+ * language.h (language_defn::post_parser): Remove void_context_p,
+ completing, tracker parameters. Add parser state.
+ * ada-lang.c (ada_language::post_parser): Update.
+
+2020-12-16 Tom Tromey <tom@tromey.com>
+
* parse.c (parse_exp_1, parse_expression_for_completion): Update.
(parse_exp_in_context): Change void_context_p to bool.
* language.h (struct language_defn) <post_parser>: Change
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 23d7a16..75ad333 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -14124,16 +14124,17 @@ public:
A null CONTEXT_TYPE indicates that a non-void return type is
preferred. May change (expand) *EXP. */
- void post_parser (expression_up *expp, bool void_context_p, int completing,
- innermost_block_tracker *tracker) const override
+ void post_parser (expression_up *expp, struct parser_state *ps)
+ const override
{
struct type *context_type = NULL;
int pc = 0;
- if (void_context_p)
+ if (ps->void_context_p)
context_type = builtin_type ((*expp)->gdbarch)->builtin_void;
- resolve_subexp (expp, &pc, 1, context_type, completing, tracker);
+ resolve_subexp (expp, &pc, 1, context_type, ps->parse_completion,
+ ps->block_tracker);
}
/* See language.h. */
diff --git a/gdb/language.h b/gdb/language.h
index 5bc99d5..73ddd24 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -522,14 +522,10 @@ struct language_defn
/* Given an expression *EXPP created by prefixifying the result of
la_parser, perform any remaining processing necessary to complete its
translation. *EXPP may change; la_post_parser is responsible for
- releasing its previous contents, if necessary. If VOID_CONTEXT_P,
- then no value is expected from the expression. If COMPLETING is
- non-zero, then the expression has been parsed for completion, not
- evaluation. */
-
- virtual void post_parser (expression_up *expp, bool void_context_p,
- int completing,
- innermost_block_tracker *tracker) const
+ releasing its previous contents, if necessary. */
+
+ virtual void post_parser (expression_up *expp, struct parser_state *ps)
+ const
{
/* By default the post-parser does nothing. */
}
diff --git a/gdb/parse.c b/gdb/parse.c
index a27ae86..80a67c6 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -1113,7 +1113,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
parser_state ps (lang, get_current_arch (), expression_context_block,
expression_context_pc, comma, *stringptr,
- cstate != nullptr, tracker);
+ cstate != nullptr, tracker, void_context_p);
scoped_restore_current_language lang_saver;
set_language (lang->la_language);
@@ -1147,7 +1147,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
if (out_subexp)
*out_subexp = subexp;
- lang->post_parser (&result, void_context_p, ps.parse_completion, tracker);
+ lang->post_parser (&result, &ps);
if (expressiondebug)
dump_prefix_expression (result.get (), gdb_stdlog);
diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h
index 1721605..56ac5ed 100644
--- a/gdb/parser-defs.h
+++ b/gdb/parser-defs.h
@@ -109,14 +109,16 @@ struct parser_state : public expr_builder
int comma,
const char *input,
int completion,
- innermost_block_tracker *tracker)
+ innermost_block_tracker *tracker,
+ bool void_p)
: expr_builder (lang, gdbarch),
expression_context_block (context_block),
expression_context_pc (context_pc),
comma_terminates (comma),
lexptr (input),
parse_completion (completion),
- block_tracker (tracker)
+ block_tracker (tracker),
+ void_context_p (void_p)
{
}
@@ -192,6 +194,9 @@ struct parser_state : public expr_builder
/* The innermost block tracker. */
innermost_block_tracker *block_tracker;
+ /* True if no value is expected from the expression. */
+ bool void_context_p;
+
private:
/* Data structure for saving values of arglist_len for function calls whose
diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y
index 1207d1d..c354b7f 100644
--- a/gdb/rust-exp.y
+++ b/gdb/rust-exp.y
@@ -2732,7 +2732,7 @@ rust_lex_tests (void)
/* Set up dummy "parser", so that rust_type works. */
struct parser_state ps (language_def (language_rust), target_gdbarch (),
- nullptr, 0, 0, nullptr, 0, nullptr);
+ nullptr, 0, 0, nullptr, 0, nullptr, false);
rust_parser parser (&ps);
rust_lex_test_one (&parser, "", 0);