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:27 -0700 |
commit | e4407a202d31a6873ea240b13125bf1ae8d20401 (patch) | |
tree | 2e9e5c7209830771fda18563ea9a082084662e20 /gdb/rust-exp.h | |
parent | 9db6b6ddbd3a384d3a80bfee3e3a5c5a40fd43d0 (diff) | |
download | binutils-gdb-e4407a202d31a6873ea240b13125bf1ae8d20401.tar.gz |
Implement Rust field operations
This implements the field operations STRUCTOP_STRUCT and
STRUCTOP_ANONYMOUS, for Rust.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* rust-lang.c (eval_op_rust_struct_anon, eval_op_rust_structop):
No longer static.
* rust-exp.h (class rust_struct_anon): New.
(class rust_structop): New.
Diffstat (limited to 'gdb/rust-exp.h')
-rw-r--r-- | gdb/rust-exp.h | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/gdb/rust-exp.h b/gdb/rust-exp.h index 263d41a79d4..19e945c806b 100644 --- a/gdb/rust-exp.h +++ b/gdb/rust-exp.h @@ -46,6 +46,16 @@ extern struct value *rust_range (struct type *expect_type, struct expression *exp, enum noside noside, enum range_flag kind, struct value *low, struct value *high); +extern struct value *eval_op_rust_struct_anon (struct type *expect_type, + struct expression *exp, + enum noside noside, + int field_number, + struct value *lhs); +extern struct value *eval_op_rust_structop (struct type *expect_type, + struct expression *exp, + enum noside noside, + struct value *lhs, + const char *field_name); namespace expr { @@ -154,6 +164,49 @@ public: { return OP_RANGE; } }; +/* Tuple field reference (using an integer). */ +class rust_struct_anon + : public tuple_holding_operation<int, operation_up> +{ +public: + + using tuple_holding_operation::tuple_holding_operation; + + value *evaluate (struct type *expect_type, + struct expression *exp, + enum noside noside) override + { + value *lhs = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); + return eval_op_rust_struct_anon (expect_type, exp, noside, + std::get<0> (m_storage), lhs); + + } + + enum exp_opcode opcode () const override + { return STRUCTOP_ANONYMOUS; } +}; + +/* Structure (or union or enum) field reference. */ +class rust_structop + : 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 *lhs = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); + return eval_op_rust_structop (expect_type, exp, noside, lhs, + std::get<1> (m_storage).c_str ()); + } + + enum exp_opcode opcode () const override + { return STRUCTOP_STRUCT; } +}; + } /* namespace expr */ #endif /* RUST_EXP_H */ |