Implement unary increment and decrement 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:21 +0000 (07:28 -0700)
This implements the unary increment and decrement operations, "++" and
"--".

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

* expop.h (unop_incr_operation): New template.
(preinc_operation, predec_operation, postinc_operation)
(postdec_operation): New typedefs.
* eval.c (eval_op_preinc, eval_op_predec, eval_op_postinc)
(eval_op_postdec): No longer static.

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

index 17281bf5ba49496a80c0ff36bff5ac3c64c8613b..582489891b48bc9480fd3e28fe9fe76d3f2ce558 100644 (file)
@@ -1,3 +1,11 @@
+2021-03-08  Tom Tromey  <tom@tromey.com>
+
+       * expop.h (unop_incr_operation): New template.
+       (preinc_operation, predec_operation, postinc_operation)
+       (postdec_operation): New typedefs.
+       * eval.c (eval_op_preinc, eval_op_predec, eval_op_postinc)
+       (eval_op_postdec): No longer static.
+
 2021-03-08  Tom Tromey  <tom@tromey.com>
 
        * expop.h (unary_ftype): New typedef.
index 8d75c08541bbdf296fdfb6c01d0a61325e69317f..4f12c7b666a725793f7267207348c557c827ebb9 100644 (file)
@@ -1912,7 +1912,7 @@ eval_op_memval (struct type *expect_type, struct expression *exp,
 
 /* A helper function for UNOP_PREINCREMENT.  */
 
-static struct value *
+struct value *
 eval_op_preinc (struct type *expect_type, struct expression *exp,
                enum noside noside, enum exp_opcode op,
                struct value *arg1)
@@ -1943,7 +1943,7 @@ eval_op_preinc (struct type *expect_type, struct expression *exp,
 
 /* A helper function for UNOP_PREDECREMENT.  */
 
-static struct value *
+struct value *
 eval_op_predec (struct type *expect_type, struct expression *exp,
                enum noside noside, enum exp_opcode op,
                struct value *arg1)
@@ -1974,7 +1974,7 @@ eval_op_predec (struct type *expect_type, struct expression *exp,
 
 /* A helper function for UNOP_POSTINCREMENT.  */
 
-static struct value *
+struct value *
 eval_op_postinc (struct type *expect_type, struct expression *exp,
                 enum noside noside, enum exp_opcode op,
                 struct value *arg1)
@@ -2008,7 +2008,7 @@ eval_op_postinc (struct type *expect_type, struct expression *exp,
 
 /* A helper function for UNOP_POSTDECREMENT.  */
 
-static struct value *
+struct value *
 eval_op_postdec (struct type *expect_type, struct expression *exp,
                 enum noside noside, enum exp_opcode op,
                 struct value *arg1)
index abd914ad574cf4643641433739a36a8c7f08bd50..ec73109f8a341f205afbc3a5cc02603fb2370e00 100644 (file)
@@ -162,6 +162,26 @@ extern struct value *eval_op_lognot (struct type *expect_type,
                                     enum noside noside,
                                     enum exp_opcode op,
                                     struct value *arg1);
+extern struct value *eval_op_preinc (struct type *expect_type,
+                                    struct expression *exp,
+                                    enum noside noside,
+                                    enum exp_opcode op,
+                                    struct value *arg1);
+extern struct value *eval_op_predec (struct type *expect_type,
+                                    struct expression *exp,
+                                    enum noside noside,
+                                    enum exp_opcode op,
+                                    struct value *arg1);
+extern struct value *eval_op_postinc (struct type *expect_type,
+                                     struct expression *exp,
+                                     enum noside noside,
+                                     enum exp_opcode op,
+                                     struct value *arg1);
+extern struct value *eval_op_postdec (struct type *expect_type,
+                                     struct expression *exp,
+                                     enum noside noside,
+                                     enum exp_opcode op,
+                                     struct value *arg1);
 
 namespace expr
 {
@@ -1316,6 +1336,36 @@ using unary_complement_operation
 using unary_logical_not_operation
      = usual_ax_unop_operation<UNOP_LOGICAL_NOT, eval_op_lognot>;
 
+/* Handle pre- and post- increment and -decrement.  */
+template<enum exp_opcode OP, unary_ftype FUNC>
+class unop_incr_operation
+  : public tuple_holding_operation<operation_up>
+{
+public:
+
+  using tuple_holding_operation::tuple_holding_operation;
+
+  value *evaluate (struct type *expect_type,
+                  struct expression *exp,
+                  enum noside noside) override
+  {
+    value *val = std::get<0> (m_storage)->evaluate (expect_type, exp, noside);
+    return FUNC (expect_type, exp, noside, OP, val);
+  }
+
+  enum exp_opcode opcode () const override
+  { return OP; }
+};
+
+using preinc_operation
+     = unop_incr_operation<UNOP_PREINCREMENT, eval_op_preinc>;
+using predec_operation
+     = unop_incr_operation<UNOP_PREDECREMENT, eval_op_predec>;
+using postinc_operation
+     = unop_incr_operation<UNOP_POSTINCREMENT, eval_op_postinc>;
+using postdec_operation
+     = unop_incr_operation<UNOP_POSTDECREMENT, eval_op_postdec>;
+
 } /* namespace expr */
 
 #endif /* EXPOP_H */