Introduce structop_operation
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:18 +0000 (07:28 -0700)
This adds class structop_base_operation and structop_operation, which
implement STRUCTOP_STRUCT.  The base class exists to unify the
completion code between STRUCTOP_STRUCT and STRUCTOP_PTR.

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

* expop.h (class structop_base_operation)
(class structop_operation): New.
* eval.c (eval_op_structop_struct): No longer static.

gdb/ChangeLog
gdb/eval.c
gdb/expop.h

index cd7ec19365f1dbf66c521041c3de4350353c8da2..72c3df2b28020be3282d6e896ab94773b5df778d 100644 (file)
@@ -1,3 +1,9 @@
+2021-03-08  Tom Tromey  <tom@tromey.com>
+
+       * expop.h (class structop_base_operation)
+       (class structop_operation): New.
+       * eval.c (eval_op_structop_struct): No longer static.
+
 2021-03-08  Tom Tromey  <tom@tromey.com>
 
        * expop.h (class complex_operation): New.
index 3307c74aa6343c06b516a5486c7a0c29cc1f2d86..74aa9703c4904072e130d0b94864cf4092d5a285 100644 (file)
@@ -1342,7 +1342,7 @@ eval_op_ternop (struct type *expect_type, struct expression *exp,
 
 /* A helper function for STRUCTOP_STRUCT.  */
 
-static struct value *
+struct value *
 eval_op_structop_struct (struct type *expect_type, struct expression *exp,
                         enum noside noside,
                         struct value *arg1, const char *string)
index 9c63f129594874c587d0e434978ce41d6e7b2c6f..9f1625ca7f70f97cd9e9d1224f8ba9d508b651a2 100644 (file)
@@ -70,6 +70,11 @@ extern struct value *eval_op_ternop (struct type *expect_type,
                                     enum noside noside,
                                     struct value *array, struct value *low,
                                     struct value *upper);
+extern struct value *eval_op_structop_struct (struct type *expect_type,
+                                             struct expression *exp,
+                                             enum noside noside,
+                                             struct value *arg1,
+                                             const char *string);
 
 namespace expr
 {
@@ -786,6 +791,63 @@ public:
   { return OP_COMPLEX; }
 };
 
+class structop_base_operation
+  : public tuple_holding_operation<operation_up, std::string>
+{
+public:
+
+  /* Used for completion.  Return the field name.  */
+  const std::string &get_string () const
+  {
+    return std::get<1> (m_storage);
+  }
+
+  /* Used for completion.  Evaluate the LHS for type.  */
+  value *evaluate_lhs (struct expression *exp)
+  {
+    return std::get<0> (m_storage)->evaluate (nullptr, exp,
+                                             EVAL_AVOID_SIDE_EFFECTS);
+  }
+
+protected:
+
+  using tuple_holding_operation::tuple_holding_operation;
+};
+
+class 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
+  {
+    value *val =std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
+    return eval_op_structop_struct (expect_type, exp, noside, val,
+                                   std::get<1> (m_storage).c_str ());
+  }
+
+  enum exp_opcode opcode () const override
+  { return STRUCTOP_STRUCT; }
+
+protected:
+
+  void do_generate_ax (struct expression *exp,
+                      struct agent_expr *ax,
+                      struct axs_value *value,
+                      struct type *cast_type)
+    override
+  {
+    gen_expr_structop (exp, STRUCTOP_STRUCT,
+                      std::get<0> (this->m_storage).get (),
+                      std::get<1> (this->m_storage).c_str (),
+                      ax, value);
+  }
+};
+
 } /* namespace expr */
 
 #endif /* EXPOP_H */