Introduce op_this_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:23 +0000 (07:28 -0700)
This adds class op_this_operation, which implements OP_THIS.

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

* expop.h (class op_this_operation): New.
* ax-gdb.c (op_this_operation::do_generate_ax): New method.

gdb/ChangeLog
gdb/ax-gdb.c
gdb/expop.h

index f93f0f2666d31690625ee1f0fe029504d106ec79..e9ba10d0899ed0c1c42d26ba820423fae2ac2d56 100644 (file)
@@ -1,3 +1,8 @@
+2021-03-08  Tom Tromey  <tom@tromey.com>
+
+       * expop.h (class op_this_operation): New.
+       * ax-gdb.c (op_this_operation::do_generate_ax): New method.
+
 2021-03-08  Tom Tromey  <tom@tromey.com>
 
        * expop.h (class unop_memval_operation)
index 6514e40cdbfa6c241a20bcf406a78781c5bce46b..98edc6c0727a34e08c504696c640e8313a42a368 100644 (file)
@@ -2554,6 +2554,31 @@ unop_memval_type_operation::do_generate_ax (struct expression *exp,
   value->kind = axs_lvalue_memory;
 }
 
+void
+op_this_operation::do_generate_ax (struct expression *exp,
+                                  struct agent_expr *ax,
+                                  struct axs_value *value,
+                                  struct type *cast_type)
+{
+  struct symbol *sym, *func;
+  const struct block *b;
+  const struct language_defn *lang;
+
+  b = block_for_pc (ax->scope);
+  func = block_linkage_function (b);
+  lang = language_def (func->language ());
+
+  sym = lookup_language_this (lang, b).symbol;
+  if (!sym)
+    error (_("no `%s' found"), lang->name_of_this ());
+
+  gen_var_ref (ax, value, sym);
+
+  if (value->optimized_out)
+    error (_("`%s' has been optimized out, cannot use"),
+          sym->print_name ());
+}
+
 }
 
 /* This handles the middle-to-right-side of code generation for binary
index b808c0f63bc770ed049908fc46fa2db3c38bb1e2..7c0768ca6c1784eb1a50c1598be766073eb36ba0 100644 (file)
@@ -1713,6 +1713,33 @@ protected:
     override;
 };
 
+/* Implement the 'this' expression.  */
+class op_this_operation
+  : public tuple_holding_operation<>
+{
+public:
+
+  using tuple_holding_operation::tuple_holding_operation;
+
+  value *evaluate (struct type *expect_type,
+                  struct expression *exp,
+                  enum noside noside) override
+  {
+    return value_of_this (exp->language_defn);
+  }
+
+  enum exp_opcode opcode () const override
+  { return OP_THIS; }
+
+protected:
+
+  void do_generate_ax (struct expression *exp,
+                      struct agent_expr *ax,
+                      struct axs_value *value,
+                      struct type *cast_type)
+    override;
+};
+
 } /* namespace expr */
 
 #endif /* EXPOP_H */