diff options
author | Tom Tromey <tom@tromey.com> | 2021-03-08 07:27:57 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2021-03-08 07:28:14 -0700 |
commit | d5ab122c48fec1eb617598c02c6efdf9ba1ee23f (patch) | |
tree | 0dd3301e5acbc2e0fe2b8c27d9d7306aba9234b6 /gdb | |
parent | cae26a0cb05be806ae97d4fabc1cb8e6773a1512 (diff) | |
download | gdb-d5ab122c48fec1eb617598c02c6efdf9ba1ee23f.zip gdb-d5ab122c48fec1eb617598c02c6efdf9ba1ee23f.tar.gz gdb-d5ab122c48fec1eb617598c02c6efdf9ba1ee23f.tar.bz2 |
Introduce scope_operation
This adds class scope_operation, an implementation of OP_SCOPE.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* 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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/ax-gdb.c | 13 | ||||
-rw-r--r-- | gdb/eval.c | 14 | ||||
-rw-r--r-- | gdb/expop.h | 36 |
4 files changed, 69 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 036e562..bfc191f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2021-03-08 Tom Tromey <tom@tromey.com> + * 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 <tom@tromey.com> + * expprint.c (float_const_operation::dump): New method. * expop.h (float_data): New typedef. (class float_const_operation): New. diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index 1c6a743..6d568a7 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 @@ -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 1e58262..cd1a161 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<struct type *, std::string> +{ +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 */ |