Introduce ada_structop_operation

This adds class ada_structop_operation, which implements
STRUCTOP_STRUCT for Ada.

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

	* ada-lang.c (ada_structop_operation::evaluate): New method.
	* ada-exp.h (class ada_structop_operation): New.
This commit is contained in:
Tom Tromey 2021-03-08 07:27:57 -07:00
parent e8c33fa16a
commit ebc06ad8f4
3 changed files with 63 additions and 0 deletions

View file

@ -1,3 +1,8 @@
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_structop_operation::evaluate): New method.
* ada-exp.h (class ada_structop_operation): New.
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_unop_ind_operation::evaluate): New method.

View file

@ -371,6 +371,22 @@ public:
enum noside noside) override;
};
/* Implement STRUCTOP_STRUCT for Ada. */
class ada_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;
enum exp_opcode opcode () const override
{ return STRUCTOP_STRUCT; }
};
} /* namespace expr */
#endif /* ADA_EXP_H */

View file

@ -10788,6 +10788,48 @@ ada_unop_ind_operation::evaluate (struct type *expect_type,
return ada_value_ind (arg1);
}
value *
ada_structop_operation::evaluate (struct type *expect_type,
struct expression *exp,
enum noside noside)
{
value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
const char *str = std::get<1> (m_storage).c_str ();
if (noside == EVAL_AVOID_SIDE_EFFECTS)
{
struct type *type;
struct type *type1 = value_type (arg1);
if (ada_is_tagged_type (type1, 1))
{
type = ada_lookup_struct_elt_type (type1, str, 1, 1);
/* If the field is not found, check if it exists in the
extension of this object's type. This means that we
need to evaluate completely the expression. */
if (type == NULL)
{
arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp,
EVAL_NORMAL);
arg1 = ada_value_struct_elt (arg1, str, 0);
arg1 = unwrap_value (arg1);
type = value_type (ada_to_fixed_value (arg1));
}
}
else
type = ada_lookup_struct_elt_type (type1, str, 1, 0);
return value_zero (ada_aligned_type (type), lval_memory);
}
else
{
arg1 = ada_value_struct_elt (arg1, str, 0);
arg1 = unwrap_value (arg1);
return ada_to_fixed_value (arg1);
}
}
}
/* Implement the evaluate_exp routine in the exp_descriptor structure