public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Simon Marchi <simon.marchi@efficios.com>
Subject: [PATCH v3 22/50] Turn allocate_value_lazy into a static "constructor"
Date: Sun, 12 Feb 2023 20:15:38 -0700	[thread overview]
Message-ID: <20230209-submit-value-fixups-2023-v3-22-45e91a20c742@tromey.com> (raw)
In-Reply-To: <20230209-submit-value-fixups-2023-v3-0-45e91a20c742@tromey.com>

This changes allocate_value_lazy to be a static "constructor" of
struct value.

I considered trying to change value to use ordinary new/delete, but it
seems to me that due to reference counting, we may someday want to
change these static constructors to return value_ref_ptr instead.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
---
 gdb/ada-lang.c  |  2 +-
 gdb/findvar.c   |  2 +-
 gdb/rust-lang.c |  2 +-
 gdb/valops.c    |  2 +-
 gdb/value.c     | 30 ++++++++++++++----------------
 gdb/value.h     | 12 +++++++++++-
 6 files changed, 29 insertions(+), 21 deletions(-)

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index e13359a68f6..ae2f4df5332 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -561,7 +561,7 @@ coerce_unspec_val_to_type (struct value *val, struct type *type)
 	       /* Be careful not to make a lazy not_lval value.  */
 	       || (VALUE_LVAL (val) != not_lval
 		   && type->length () > val->type ()->length ()))
-	result = allocate_value_lazy (type);
+	result = value::allocate_lazy (type);
       else
 	{
 	  result = allocate_value (type);
diff --git a/gdb/findvar.c b/gdb/findvar.c
index 9420286e91c..cb4eb758bf2 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -294,7 +294,7 @@ value_of_register_lazy (frame_info_ptr frame, int regnum)
   /* We should have a valid next frame.  */
   gdb_assert (frame_id_p (get_frame_id (next_frame)));
 
-  reg_val = allocate_value_lazy (register_type (gdbarch, regnum));
+  reg_val = value::allocate_lazy (register_type (gdbarch, regnum));
   VALUE_LVAL (reg_val) = lval_register;
   VALUE_REGNUM (reg_val) = regnum;
   VALUE_NEXT_FRAME_ID (reg_val) = get_frame_id (next_frame);
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index aa1590078dc..8f0953649ae 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -349,7 +349,7 @@ rust_val_print_slice (struct value *val, struct ui_file *stream, int recurse,
 	  struct type *elt_type = base->type ()->target_type ();
 	  struct type *array_type = lookup_array_range_type (elt_type, 0,
 							     llen - 1);
-	  struct value *array = allocate_value_lazy (array_type);
+	  struct value *array = value::allocate_lazy (array_type);
 	  VALUE_LVAL (array) = lval_memory;
 	  array->set_address (value_as_address (base));
 	  value_fetch_lazy (array);
diff --git a/gdb/valops.c b/gdb/valops.c
index cea9d3ce593..5e6095db81f 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -4079,7 +4079,7 @@ value_slice (struct value *array, int lowbound, int length)
     slice_type->set_code (array_type->code ());
 
     if (VALUE_LVAL (array) == lval_memory && array->lazy ())
-      slice = allocate_value_lazy (slice_type);
+      slice = value::allocate_lazy (slice_type);
     else
       {
 	slice = allocate_value (slice_type);
diff --git a/gdb/value.c b/gdb/value.c
index 471a98f277b..0dccb7307d6 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -744,12 +744,10 @@ static std::vector<value_ref_ptr> value_history;
 
 static std::vector<value_ref_ptr> all_values;
 
-/* Allocate a lazy value for type TYPE.  Its actual content is
-   "lazily" allocated too: the content field of the return value is
-   NULL; it will be allocated when it is fetched from the target.  */
+/* See value.h.  */
 
 struct value *
-allocate_value_lazy (struct type *type)
+value::allocate_lazy (struct type *type)
 {
   struct value *val;
 
@@ -963,7 +961,7 @@ allocate_value_contents (struct value *val, bool check_size)
 static struct value *
 allocate_value (struct type *type, bool check_size)
 {
-  struct value *val = allocate_value_lazy (type);
+  struct value *val = value::allocate_lazy (type);
 
   allocate_value_contents (val, check_size);
   val->m_lazy = 0;
@@ -1001,7 +999,7 @@ allocate_computed_value (struct type *type,
 			 const struct lval_funcs *funcs,
 			 void *closure)
 {
-  struct value *v = allocate_value_lazy (type);
+  struct value *v = value::allocate_lazy (type);
 
   VALUE_LVAL (v) = lval_computed;
   v->m_location.computed.funcs = funcs;
@@ -1015,7 +1013,7 @@ allocate_computed_value (struct type *type,
 struct value *
 allocate_optimized_out_value (struct type *type)
 {
-  struct value *retval = allocate_value_lazy (type);
+  struct value *retval = value::allocate_lazy (type);
 
   mark_value_bytes_optimized_out (retval, 0, type->length ());
   retval->set_lazy (0);
@@ -1545,7 +1543,7 @@ value_copy (const value *arg)
   struct type *encl_type = arg->enclosing_type ();
   struct value *val;
 
-  val = allocate_value_lazy (encl_type);
+  val = value::allocate_lazy (encl_type);
   val->m_type = arg->m_type;
   VALUE_LVAL (val) = arg->m_lval;
   val->m_location = arg->m_location;
@@ -2950,7 +2948,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
       LONGEST bitpos = arg_type->field (fieldno).loc_bitpos ();
       LONGEST container_bitsize = type->length () * 8;
 
-      v = allocate_value_lazy (type);
+      v = value::allocate_lazy (type);
       v->m_bitsize = TYPE_FIELD_BITSIZE (arg_type, fieldno);
       if ((bitpos % container_bitsize) + v->m_bitsize <= container_bitsize
 	  && type->length () <= (int) sizeof (LONGEST))
@@ -2988,7 +2986,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
 	boffset = arg_type->field (fieldno).loc_bitpos () / 8;
 
       if (arg1->lazy ())
-	v = allocate_value_lazy (arg1->enclosing_type ());
+	v = value::allocate_lazy (arg1->enclosing_type ());
       else
 	{
 	  v = allocate_value (arg1->enclosing_type ());
@@ -3008,7 +3006,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
       gdb_assert (PROP_CONST == TYPE_DATA_LOCATION_KIND (type));
       /* For dynamic data types defer memory allocation
 	 until we actual access the value.  */
-      v = allocate_value_lazy (type);
+      v = value::allocate_lazy (type);
     }
   else
     {
@@ -3021,7 +3019,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
 	value_fetch_lazy (arg1);
 
       if (arg1->lazy ())
-	v = allocate_value_lazy (type);
+	v = value::allocate_lazy (type);
       else
 	{
 	  v = allocate_value (type);
@@ -3426,7 +3424,7 @@ pack_unsigned_long (gdb_byte *buf, struct type *type, ULONGEST num)
 struct value *
 value_zero (struct type *type, enum lval_type lv)
 {
-  struct value *val = allocate_value_lazy (type);
+  struct value *val = value::allocate_lazy (type);
 
   VALUE_LVAL (val) = (lv == lval_computed ? not_lval : lv);
   val->m_is_zero = true;
@@ -3500,7 +3498,7 @@ value_from_contents_and_address_unresolved (struct type *type,
   struct value *v;
 
   if (valaddr == NULL)
-    v = allocate_value_lazy (type);
+    v = value::allocate_lazy (type);
   else
     v = value_from_contents (type, valaddr);
   VALUE_LVAL (v) = lval_memory;
@@ -3526,7 +3524,7 @@ value_from_contents_and_address (struct type *type,
   struct value *v;
 
   if (valaddr == NULL)
-    v = allocate_value_lazy (resolved_type);
+    v = value::allocate_lazy (resolved_type);
   else
     v = value_from_contents (resolved_type, valaddr);
   if (TYPE_DATA_LOCATION (resolved_type_no_typedef) != NULL
@@ -3622,7 +3620,7 @@ value_from_component (struct value *whole, struct type *type, LONGEST offset)
   struct value *v;
 
   if (VALUE_LVAL (whole) == lval_memory && whole->lazy ())
-    v = allocate_value_lazy (type);
+    v = value::allocate_lazy (type);
   else
     {
       v = allocate_value (type);
diff --git a/gdb/value.h b/gdb/value.h
index 788a3d8514e..29ed2a8a3ce 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -144,6 +144,9 @@ typedef gdb::ref_ptr<struct value, value_ref_policy> value_ref_ptr;
 
 struct value
 {
+private:
+
+  /* Values can only be created via "static constructors".  */
   explicit value (struct type *type_)
     : m_modifiable (1),
       m_lazy (1),
@@ -156,6 +159,13 @@ struct value
   {
   }
 
+public:
+
+  /* Allocate a lazy value for type TYPE.  Its actual content is
+     "lazily" allocated too: the content field of the return value is
+     NULL; it will be allocated when it is fetched from the target.  */
+  static struct value *allocate_lazy (struct type *type);
+
   ~value ();
 
   DISABLE_COPY_AND_ASSIGN (value);
@@ -1002,7 +1012,7 @@ extern struct value *read_var_value (struct symbol *var,
 				     frame_info_ptr frame);
 
 extern struct value *allocate_value (struct type *type);
-extern struct value *allocate_value_lazy (struct type *type);
+
 extern void value_contents_copy (struct value *dst, LONGEST dst_offset,
 				 struct value *src, LONGEST src_offset,
 				 LONGEST length);

-- 
2.39.1


  parent reply	other threads:[~2023-02-13  3:15 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-13  3:15 [PATCH v3 00/50] Use methods for struct value Tom Tromey
2023-02-13  3:15 ` [PATCH v3 01/50] Automatic date update in version.in Tom Tromey
2023-02-13  3:24   ` Tom Tromey
2023-02-13  3:15 ` [PATCH v3 02/50] Rename all fields of struct value Tom Tromey
2023-02-13  3:15 ` [PATCH v3 03/50] Move ~value body out-of-line Tom Tromey
2023-02-13  3:15 ` [PATCH v3 04/50] Move struct value to value.h Tom Tromey
2023-02-13  3:15 ` [PATCH v3 05/50] Turn value_type into method Tom Tromey
2023-02-13  3:15 ` [PATCH v3 06/50] Turn deprecated_set_value_type into a method Tom Tromey
2023-02-13  3:15 ` [PATCH v3 07/50] Turn value_arch into method Tom Tromey
2023-02-13  3:15 ` [PATCH v3 08/50] Turn value_bitsize " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 09/50] Turn value_bitpos " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 10/50] Turn value_parent " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 11/50] Turn value_offset " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 12/50] Turn deprecated_value_modifiable " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 13/50] Turn value_enclosing_type " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 14/50] Turn some value offset functions " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 15/50] Turn value_lazy and set_value_lazy functions into methods Tom Tromey
2023-02-13  3:15 ` [PATCH v3 16/50] Turn value_stack and set_value_stack " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 17/50] Turn value_computed_closure and value_computed_funcs " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 18/50] Convert value_lval_const and deprecated_lval_hack to methods Tom Tromey
2023-02-13  3:15 ` [PATCH v3 19/50] Turn value_initialized and set_value_initialized functions into methods Tom Tromey
2023-02-13  3:15 ` [PATCH v3 20/50] Turn value_address and set_value_address " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 21/50] Turn more deprecated_* " Tom Tromey
2023-02-13  3:15 ` Tom Tromey [this message]
2023-02-13  3:15 ` [PATCH v3 23/50] Turn allocate_value into a static "constructor" Tom Tromey
2023-02-13  3:15 ` [PATCH v3 24/50] Turn allocate_computed_value into " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 25/50] Turn allocate_optimized_out_value " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 26/50] Turn value_zero " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 27/50] Turn some value_contents functions into methods Tom Tromey
2023-02-13  3:15 ` [PATCH v3 28/50] Turn value_fetch_lazy into a method Tom Tromey
2023-02-13 17:35   ` Simon Marchi
2023-02-13  3:15 ` [PATCH v3 29/50] Turn allocate_value_contents " Tom Tromey
2023-02-13 17:37   ` Simon Marchi
2023-02-13  3:15 ` [PATCH v3 30/50] Turn value_contents_eq " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 31/50] Turn value_bits_synthetic_pointer " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 32/50] Move value_ref_policy methods out-of-line Tom Tromey
2023-02-13  3:15 ` [PATCH v3 33/50] Turn value_incref and value_decref into methods Tom Tromey
2023-02-13  3:15 ` [PATCH v3 34/50] Turn remaining value_contents functions " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 35/50] Fully qualify calls to copy in value.c Tom Tromey
2023-02-13  3:15 ` [PATCH v3 36/50] Turn value_copy into a method Tom Tromey
2023-02-13  3:15 ` [PATCH v3 37/50] Turn many optimized-out value functions into methods Tom Tromey
2023-02-13  3:15 ` [PATCH v3 38/50] Turn value_non_lval and value_force_lval " Tom Tromey
2023-02-13  3:15 ` [PATCH v3 39/50] Turn set_value_component_location into method Tom Tromey
2023-02-13  3:15 ` [PATCH v3 40/50] Change some code to use value methods Tom Tromey
2023-02-13  3:15 ` [PATCH v3 41/50] Turn some xmethod functions into methods Tom Tromey
2023-02-13  3:15 ` [PATCH v3 42/50] Turn preserve_one_value into method Tom Tromey
2023-02-13  3:15 ` [PATCH v3 43/50] Turn various value copying-related functions into methods Tom Tromey
2023-02-13  3:16 ` [PATCH v3 44/50] Add value::set_modifiable Tom Tromey
2023-02-13  3:16 ` [PATCH v3 45/50] Turn record_latest_value into a method Tom Tromey
2023-02-13 17:38   ` Simon Marchi
2023-02-13  3:16 ` [PATCH v3 46/50] Make struct value data members private Tom Tromey
2023-02-13  3:16 ` [PATCH v3 47/50] Make ~value private Tom Tromey
2023-02-13  3:16 ` [PATCH v3 48/50] Introduce set_lval method on value Tom Tromey
2023-02-13  3:16 ` [PATCH v3 49/50] Remove deprecated_lval_hack Tom Tromey
2023-02-13 22:26 ` [PATCH v3 00/50] Use methods for struct value Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230209-submit-value-fixups-2023-v3-22-45e91a20c742@tromey.com \
    --to=tom@tromey.com \
    --cc=gdb-patches@sourceware.org \
    --cc=simon.marchi@efficios.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).