aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2021-07-01 11:15:41 -0600
committerTom Tromey <tromey@adacore.com>2021-08-02 10:11:22 -0600
commit8b12db26d161d526953ab04ad92d598fd148d0bf (patch)
treeee45b36636816b1bc09518ca86d9fa16291fe15d
parentcd4583499fda437680e974b2729a2873a08f656b (diff)
downloadgdb-8b12db26d161d526953ab04ad92d598fd148d0bf.zip
gdb-8b12db26d161d526953ab04ad92d598fd148d0bf.tar.gz
gdb-8b12db26d161d526953ab04ad92d598fd148d0bf.tar.bz2
Refactor Ada resolution
In a subsequent patch, it will be convenient if an Ada expression operation can supply its own replacement object. This patch refactors Ada expression resolution to make this possible.
-rw-r--r--gdb/ada-exp.h18
-rw-r--r--gdb/ada-exp.y17
-rw-r--r--gdb/ada-lang.c17
3 files changed, 42 insertions, 10 deletions
diff --git a/gdb/ada-exp.h b/gdb/ada-exp.h
index 598dc70..e600ec2 100644
--- a/gdb/ada-exp.h
+++ b/gdb/ada-exp.h
@@ -95,6 +95,24 @@ struct ada_resolvable
bool parse_completion,
innermost_block_tracker *tracker,
struct type *context_type) = 0;
+
+ /* Possibly replace this object with some other expression object.
+ This is like 'resolve', but can return a replacement.
+
+ The default implementation calls 'resolve' and wraps this object
+ in a function call if that call returns true. OWNER is a
+ reference to the unique pointer that owns the 'this'; it can be
+ 'move'd from to construct the replacement.
+
+ This should either return a new object, or OWNER -- never
+ nullptr. */
+
+ virtual operation_up replace (operation_up &&owner,
+ struct expression *exp,
+ bool deprocedure_p,
+ bool parse_completion,
+ innermost_block_tracker *tracker,
+ struct type *context_type);
};
/* In Ada, some generic operations must be wrapped with a handler that
diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y
index 5b6aca9..afa085e 100644
--- a/gdb/ada-exp.y
+++ b/gdb/ada-exp.y
@@ -119,16 +119,13 @@ resolve (operation_up &&op, bool deprocedure_p, struct type *context_type)
{
operation_up result = std::move (op);
ada_resolvable *res = dynamic_cast<ada_resolvable *> (result.get ());
- if (res != nullptr
- && res->resolve (pstate->expout.get (),
- deprocedure_p,
- pstate->parse_completion,
- pstate->block_tracker,
- context_type))
- result
- = make_operation<ada_funcall_operation> (std::move (result),
- std::vector<operation_up> ());
-
+ if (res != nullptr)
+ return res->replace (std::move (result),
+ pstate->expout.get (),
+ deprocedure_p,
+ pstate->parse_completion,
+ pstate->block_tracker,
+ context_type);
return result;
}
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index f45384a..a435543 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -10097,6 +10097,23 @@ ada_binop_exp (struct type *expect_type,
namespace expr
{
+/* See ada-exp.h. */
+
+operation_up
+ada_resolvable::replace (operation_up &&owner,
+ struct expression *exp,
+ bool deprocedure_p,
+ bool parse_completion,
+ innermost_block_tracker *tracker,
+ struct type *context_type)
+{
+ if (resolve (exp, deprocedure_p, parse_completion, tracker, context_type))
+ return (make_operation<ada_funcall_operation>
+ (std::move (owner),
+ std::vector<operation_up> ()));
+ return std::move (owner);
+}
+
value *
ada_wrapped_operation::evaluate (struct type *expect_type,
struct expression *exp,