Turn some xmethod functions into methods
authorTom Tromey <tom@tromey.com>
Wed, 1 Feb 2023 03:59:39 +0000 (20:59 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 13 Feb 2023 22:22:17 +0000 (15:22 -0700)
This turns value_from_xmethod, result_type_of_xmethod, and
call_xmethod to be methods of value.  value_from_xmethod is a static
"constructor" now.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/eval.c
gdb/valarith.c
gdb/valops.c
gdb/value.c
gdb/value.h

index 808cc916bb45577fb82e537ba73a96c423727d47..b263dc998d6fd2f50cf9fe578a2c777b15e81fd1 100644 (file)
@@ -640,7 +640,7 @@ evaluate_subexp_do_call (expression *exp, enum noside noside,
        }
       else if (ftype->code () == TYPE_CODE_XMETHOD)
        {
-         type *return_type = result_type_of_xmethod (callee, argvec);
+         type *return_type = callee->result_type_of_xmethod (argvec);
 
          if (return_type == NULL)
            error (_("Xmethod is missing return type."));
@@ -678,7 +678,7 @@ evaluate_subexp_do_call (expression *exp, enum noside noside,
       return call_internal_function (exp->gdbarch, exp->language_defn,
                                     callee, argvec.size (), argvec.data ());
     case TYPE_CODE_XMETHOD:
-      return call_xmethod (callee, argvec);
+      return callee->call_xmethod (argvec);
     default:
       return call_function_by_hand (callee, default_return_type, argvec);
     }
index e3c51609172833550c6eff965bca99ed98110374..8e4c4182fb58a8a139a3b0567f1a7dda0e1ffca3 100644 (file)
@@ -528,13 +528,13 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op,
          if (noside == EVAL_AVOID_SIDE_EFFECTS)
            {
              struct type *return_type
-               = result_type_of_xmethod (argvec[0], argvec.slice (1));
+               = argvec[0]->result_type_of_xmethod (argvec.slice (1));
 
              if (return_type == NULL)
                error (_("Xmethod is missing return type."));
              return value::zero (return_type, VALUE_LVAL (arg1));
            }
-         return call_xmethod (argvec[0], argvec.slice (1));
+         return argvec[0]->call_xmethod (argvec.slice (1));
        }
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
@@ -641,13 +641,13 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside)
          if (noside == EVAL_AVOID_SIDE_EFFECTS)
            {
              struct type *return_type
-               = result_type_of_xmethod (argvec[0], argvec[1]);
+               = argvec[0]->result_type_of_xmethod (argvec[1]);
 
              if (return_type == NULL)
                error (_("Xmethod is missing return type."));
              return value::zero (return_type, VALUE_LVAL (arg1));
            }
-         return call_xmethod (argvec[0], argvec[1]);
+         return argvec[0]->call_xmethod (argvec[1]);
        }
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
index 137134abe6c962c25492d4dc237b3d14eed74b0a..89bd5c95a2cd88993a0414df2f11dfb02c34fdc1 100644 (file)
@@ -3028,7 +3028,7 @@ find_overload_match (gdb::array_view<value *> args,
                                    method_oload_champ, basetype, boffset);
        }
       else
-       *valp = value_from_xmethod
+       *valp = value::from_xmethod
          (std::move (xmethods[ext_method_oload_champ]));
     }
   else
index 73c3eaf46592a0046d5b1b9f93f725308693e58e..730ca7c73e91e4b3f2512a06b2190e668b5319b9 100644 (file)
@@ -2517,7 +2517,7 @@ show_convenience (const char *ignore, int from_tty)
 /* See value.h.  */
 
 struct value *
-value_from_xmethod (xmethod_worker_up &&worker)
+value::from_xmethod (xmethod_worker_up &&worker)
 {
   struct value *v;
 
@@ -2529,26 +2529,26 @@ value_from_xmethod (xmethod_worker_up &&worker)
   return v;
 }
 
-/* Return the type of the result of TYPE_CODE_XMETHOD value METHOD.  */
+/* See value.h.  */
 
 struct type *
-result_type_of_xmethod (struct value *method, gdb::array_view<value *> argv)
+value::result_type_of_xmethod (gdb::array_view<value *> argv)
 {
-  gdb_assert (method->type ()->code () == TYPE_CODE_XMETHOD
-             && method->m_lval == lval_xcallable && !argv.empty ());
+  gdb_assert (type ()->code () == TYPE_CODE_XMETHOD
+             && m_lval == lval_xcallable && !argv.empty ());
 
-  return method->m_location.xm_worker->get_result_type (argv[0], argv.slice (1));
+  return m_location.xm_worker->get_result_type (argv[0], argv.slice (1));
 }
 
-/* Call the xmethod corresponding to the TYPE_CODE_XMETHOD value METHOD.  */
+/* See value.h.  */
 
 struct value *
-call_xmethod (struct value *method, gdb::array_view<value *> argv)
+value::call_xmethod (gdb::array_view<value *> argv)
 {
-  gdb_assert (method->type ()->code () == TYPE_CODE_XMETHOD
-             && method->m_lval == lval_xcallable && !argv.empty ());
+  gdb_assert (type ()->code () == TYPE_CODE_XMETHOD
+             && m_lval == lval_xcallable && !argv.empty ());
 
-  return method->m_location.xm_worker->invoke (argv[0], argv.slice (1));
+  return m_location.xm_worker->invoke (argv[0], argv.slice (1));
 }
 \f
 /* Extract a value as a C number (either long or double).
index 448f0123f708fd33fcc1fd0f4ed8b0101a7f6ff9..36e7a89359d7105d477b8943d431f4cda5ae6e7f 100644 (file)
@@ -543,6 +543,17 @@ public:
      WHOLE --- regardless of what kind of lvalue WHOLE is.  */
   void set_component_location (const struct value *whole);
 
+  /* Build a value wrapping and representing WORKER.  The value takes
+     ownership of the xmethod_worker object.  */
+  static struct value *from_xmethod (xmethod_worker_up &&worker);
+
+  /* Return the type of the result of TYPE_CODE_XMETHOD value METHOD.  */
+  struct type *result_type_of_xmethod (gdb::array_view<value *> argv);
+
+  /* Call the xmethod corresponding to the TYPE_CODE_XMETHOD value
+     METHOD.  */
+  struct value *call_xmethod (gdb::array_view<value *> argv);
+
 
   /* Type of value; either not an lval, or one of the various
      different possible kinds of lval.  */
@@ -1514,17 +1525,6 @@ struct value *call_internal_function (struct gdbarch *gdbarch,
 
 const char *value_internal_function_name (struct value *);
 
-/* Build a value wrapping and representing WORKER.  The value takes ownership
-   of the xmethod_worker object.  */
-
-extern struct value *value_from_xmethod (xmethod_worker_up &&worker);
-
-extern struct type *result_type_of_xmethod (struct value *method,
-                                           gdb::array_view<value *> argv);
-
-extern struct value *call_xmethod (struct value *method,
-                                  gdb::array_view<value *> argv);
-
 /* Destroy the values currently allocated.  This is called when GDB is
    exiting (e.g., on quit_force).  */
 extern void finalize_values ();