From d5ab122c48fec1eb617598c02c6efdf9ba1ee23f Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 8 Mar 2021 07:27:57 -0700 Subject: [PATCH] Introduce scope_operation This adds class scope_operation, an implementation of OP_SCOPE. gdb/ChangeLog 2021-03-08 Tom Tromey * expop.h (class scope_operation): New. * eval.c (eval_op_scope): No longer static. (scope_operation::evaluate_for_address): New method. * ax-gdb.c (scope_operation::do_generate_ax): New method. --- gdb/ChangeLog | 7 +++++++ gdb/ax-gdb.c | 13 +++++++++++++ gdb/eval.c | 14 +++++++++++++- gdb/expop.h | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 036e5625253..bfc191f1619 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2021-03-08 Tom Tromey + + * expop.h (class scope_operation): New. + * eval.c (eval_op_scope): No longer static. + (scope_operation::evaluate_for_address): New method. + * ax-gdb.c (scope_operation::do_generate_ax): New method. + 2021-03-08 Tom Tromey * expprint.c (float_const_operation::dump): New method. diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index 1c6a7431143..6d568a71e03 100644 --- a/gdb/ax-gdb.c +++ b/gdb/ax-gdb.c @@ -2301,6 +2301,19 @@ operation::generate_ax (struct expression *exp, } } +void +scope_operation::do_generate_ax (struct expression *exp, + struct agent_expr *ax, + struct axs_value *value, + struct type *cast_type) +{ + struct type *type = std::get<0> (m_storage); + const std::string &name = std::get<1> (m_storage); + int found = gen_aggregate_elt_ref (ax, value, type, name.c_str ()); + if (!found) + error (_("There is no field named %s"), name.c_str ()); +} + } /* This handles the middle-to-right-side of code generation for binary diff --git a/gdb/eval.c b/gdb/eval.c index 8adbcefb585..452f088a515 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -1185,7 +1185,7 @@ is_integral_or_integral_reference (struct type *type) /* Helper function that implements the body of OP_SCOPE. */ -static struct value * +struct value * eval_op_scope (struct type *expect_type, struct expression *exp, enum noside noside, struct type *type, const char *string) @@ -3289,6 +3289,18 @@ operation::evaluate_for_address (struct expression *exp, enum noside noside) return evaluate_subexp_for_address_base (exp, noside, val); } +value * +scope_operation::evaluate_for_address (struct expression *exp, + enum noside noside) +{ + value *x = value_aggregate_elt (std::get<0> (m_storage), + std::get<1> (m_storage).c_str (), + NULL, 1, noside); + if (x == NULL) + error (_("There is no field named %s"), std::get<1> (m_storage).c_str ()); + return x; +} + } /* Evaluate like `evaluate_subexp' except coercing arrays to pointers. diff --git a/gdb/expop.h b/gdb/expop.h index 1e58262e876..cd1a16172b8 100644 --- a/gdb/expop.h +++ b/gdb/expop.h @@ -41,6 +41,11 @@ extern void gen_expr_structop (struct expression *exp, const char *name, struct agent_expr *ax, struct axs_value *value); +extern struct value *eval_op_scope (struct type *expect_type, + struct expression *exp, + enum noside noside, + struct type *type, const char *string); + namespace expr { @@ -415,6 +420,37 @@ private: float_data m_data; }; +class scope_operation + : public maybe_constant_operation +{ +public: + + using maybe_constant_operation::maybe_constant_operation; + + value *evaluate (struct type *expect_type, + struct expression *exp, + enum noside noside) override + { + return eval_op_scope (expect_type, exp, noside, + std::get<0> (m_storage), + std::get<1> (m_storage).c_str ()); + } + + value *evaluate_for_address (struct expression *exp, + enum noside noside) override; + + enum exp_opcode opcode () const override + { return OP_SCOPE; } + +protected: + + void do_generate_ax (struct expression *exp, + struct agent_expr *ax, + struct axs_value *value, + struct type *cast_type) + override; +}; + } /* namespace expr */ #endif /* EXPOP_H */ -- 2.30.2