Introduce type_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:21 +0000 (07:28 -0700)
This adds class type_operation, which implements OP_TYPE.

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

* expop.h (class type_operation): New.
* eval.c (eval_op_type): No longer static.

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

index da7cd6916f8d60073e67281685ff8726d67607e2..6496f982e5a8bfcc461984dbfec1a74ab641dc9c 100644 (file)
@@ -1,3 +1,8 @@
+2021-03-08  Tom Tromey  <tom@tromey.com>
+
+       * expop.h (class type_operation): New.
+       * eval.c (eval_op_type): No longer static.
+
 2021-03-08  Tom Tromey  <tom@tromey.com>
 
        * expop.h (class unop_ind_base_operation)
index 1995d39e1892fbfe7c710bbef916029460f9b98f..f5a5a2050803d831d5d727fb3d7c91fa5ebe5bd1 100644 (file)
@@ -2042,7 +2042,7 @@ eval_op_postdec (struct type *expect_type, struct expression *exp,
 
 /* A helper function for OP_TYPE.  */
 
-static struct value *
+struct value *
 eval_op_type (struct type *expect_type, struct expression *exp,
              enum noside noside, struct type *type)
 {
index 4b1d65a1be859ee901a57cc570d694dc4f0bd8e3..8b7bfbe3af69eed6885c47045fc4086afc62dd02 100644 (file)
@@ -186,6 +186,9 @@ extern struct value *eval_op_ind (struct type *expect_type,
                                  struct expression *exp,
                                  enum noside noside,
                                  struct value *arg1);
+extern struct value *eval_op_type (struct type *expect_type,
+                                  struct expression *exp,
+                                  enum noside noside, struct type *type);
 
 namespace expr
 {
@@ -1420,6 +1423,28 @@ protected:
   }
 };
 
+/* Implement OP_TYPE.  */
+class type_operation
+  : public tuple_holding_operation<struct type *>
+{
+public:
+
+  using tuple_holding_operation::tuple_holding_operation;
+
+  value *evaluate (struct type *expect_type,
+                  struct expression *exp,
+                  enum noside noside) override
+  {
+    return eval_op_type (expect_type, exp, noside, std::get<0> (m_storage));
+  }
+
+  enum exp_opcode opcode () const override
+  { return OP_TYPE; }
+
+  bool constant_p () const override
+  { return true; }
+};
+
 } /* namespace expr */
 
 #endif /* EXPOP_H */