Introduce structop_operation

This adds class structop_base_operation and structop_operation, which
implement STRUCTOP_STRUCT.  The base class exists to unify the
completion code between STRUCTOP_STRUCT and STRUCTOP_PTR.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

	* expop.h (class structop_base_operation)
	(class structop_operation): New.
	* eval.c (eval_op_structop_struct): No longer static.
This commit is contained in:
Tom Tromey 2021-03-08 07:27:57 -07:00
parent 8cfd3e95b7
commit 808b22cfd7
3 changed files with 69 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (class structop_base_operation)
(class structop_operation): New.
* eval.c (eval_op_structop_struct): No longer static.
2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (class complex_operation): New.

View File

@ -1342,7 +1342,7 @@ eval_op_ternop (struct type *expect_type, struct expression *exp,
/* A helper function for STRUCTOP_STRUCT. */
static struct value *
struct value *
eval_op_structop_struct (struct type *expect_type, struct expression *exp,
enum noside noside,
struct value *arg1, const char *string)

View File

@ -70,6 +70,11 @@ extern struct value *eval_op_ternop (struct type *expect_type,
enum noside noside,
struct value *array, struct value *low,
struct value *upper);
extern struct value *eval_op_structop_struct (struct type *expect_type,
struct expression *exp,
enum noside noside,
struct value *arg1,
const char *string);
namespace expr
{
@ -786,6 +791,63 @@ class complex_operation
{ return OP_COMPLEX; }
};
class structop_base_operation
: public tuple_holding_operation<operation_up, std::string>
{
public:
/* Used for completion. Return the field name. */
const std::string &get_string () const
{
return std::get<1> (m_storage);
}
/* Used for completion. Evaluate the LHS for type. */
value *evaluate_lhs (struct expression *exp)
{
return std::get<0> (m_storage)->evaluate (nullptr, exp,
EVAL_AVOID_SIDE_EFFECTS);
}
protected:
using tuple_holding_operation::tuple_holding_operation;
};
class structop_operation
: public structop_base_operation
{
public:
using structop_base_operation::structop_base_operation;
value *evaluate (struct type *expect_type,
struct expression *exp,
enum noside noside) override
{
value *val =std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
return eval_op_structop_struct (expect_type, exp, noside, val,
std::get<1> (m_storage).c_str ());
}
enum exp_opcode opcode () const override
{ return STRUCTOP_STRUCT; }
protected:
void do_generate_ax (struct expression *exp,
struct agent_expr *ax,
struct axs_value *value,
struct type *cast_type)
override
{
gen_expr_structop (exp, STRUCTOP_STRUCT,
std::get<0> (this->m_storage).get (),
std::get<1> (this->m_storage).c_str (),
ax, value);
}
};
} /* namespace expr */
#endif /* EXPOP_H */