Implement Rust field operations
authorTom Tromey <tom@tromey.com>
Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 8 Mar 2021 14:28:27 +0000 (07:28 -0700)
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.

gdb/ChangeLog
gdb/rust-exp.h
gdb/rust-lang.c

index 764c432d89235b2c897bfb3e1a41a620e532e77c..69a514cf8bc19275f13bb13713ae32ca6fed4baf 100644 (file)
@@ -1,3 +1,10 @@
+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.
+
 2021-03-08  Tom Tromey  <tom@tromey.com>
 
        * rust-lang.c (rust_range): No longer static.
index 263d41a79d4057eb4e53ad296aa8a404ea61b317..19e945c806be9dc940325cedb18d13f1ad5c6608 100644 (file)
@@ -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 */
index 46eb03e5273d078132509d4f3f8268f9ddeddb27..1373de94035eeab1c19d10450967c2340bdb852f 100644 (file)
@@ -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)