[134/203] Implement Rust field operations

Message ID 20210101214723.1784144-135-tom@tromey.com
State Superseded
Headers show
Series
  • Refactor expressions
Related show

Commit Message

Tom Tromey Jan. 1, 2021, 9:46 p.m.
This implements the field operations STRUCTOP_STRUCT and
STRUCTOP_ANONYMOUS, for Rust.

gdb/ChangeLog
2021-01-01  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.
---
 gdb/ChangeLog   |  7 +++++++
 gdb/rust-exp.h  | 53 +++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/rust-lang.c |  4 ++--
 3 files changed, 62 insertions(+), 2 deletions(-)

-- 
2.26.2

Patch

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 @@  class rust_range_operation
   { 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 */
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index 68fbaf1642a..95b19776edf 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -1388,7 +1388,7 @@  eval_op_rust_array (struct type *expect_type, struct expression *exp,
 
 /* A helper function for STRUCTOP_ANONYMOUS.  */
 
-static struct value *
+struct value *
 eval_op_rust_struct_anon (struct type *expect_type, struct expression *exp,
 			  enum noside noside,
 			  int field_number, struct value *lhs)
@@ -1455,7 +1455,7 @@  tuple structs, and tuple-like enum variants"));
 
 /* A helper function for STRUCTOP_STRUCT.  */
 
-static struct value *
+struct value *
 eval_op_rust_structop (struct type *expect_type, struct expression *exp,
 		       enum noside noside,
 		       struct value *lhs, const char *field_name)