Use scoped_value_mark in two more places
authorTom Tromey <tromey@adacore.com>
Wed, 24 May 2023 19:59:58 +0000 (13:59 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 9 Jun 2023 13:42:44 +0000 (07:42 -0600)
I found a couple of spots that could use scoped_value_mark.  One of
them is a spot that didn't consider the possibility that value_mark
can return NULL.  I tend to doubt this can be seen in this context,
but nevertheless this is safer.

Regression tested on x86-64 Fedora 36.

gdb/f-lang.c
gdb/value.c

index 7ab2a7b0688f902a19ce520f4c64e95c3570643a..bb177007303a66a7bfe86c95043e1c1b56a50c31 100644 (file)
@@ -271,8 +271,8 @@ public:
   {
     if (inner_p)
       {
-       gdb_assert (m_mark == nullptr);
-       m_mark = value_mark ();
+       gdb_assert (!m_mark.has_value ());
+       m_mark.emplace ();
       }
   }
 
@@ -282,9 +282,8 @@ public:
   {
     if (inner_p)
       {
-       gdb_assert (m_mark != nullptr);
-       value_free_to_mark (m_mark);
-       m_mark = nullptr;
+       gdb_assert (m_mark.has_value ());
+       m_mark.reset ();
       }
   }
 
@@ -305,9 +304,9 @@ protected:
      written.  */
   LONGEST m_dest_offset;
 
-  /* Set with a call to VALUE_MARK, and then reset after calling
-     VALUE_FREE_TO_MARK.  */
-  struct value *m_mark = nullptr;
+  /* Set and reset to handle removing intermediate values from the
+     value chain.  */
+  gdb::optional<scoped_value_mark> m_mark;
 };
 
 /* A class used by FORTRAN_VALUE_SUBARRAY when repacking Fortran array
index 95178682284b7477158682f8c39ee6a596d65c24..1b31f91b4dcfee232286129565721154a4fc3f8a 100644 (file)
@@ -3879,7 +3879,9 @@ value::fetch_lazy_register ()
   frame_info_ptr next_frame;
   int regnum;
   struct type *type = check_typedef (this->type ());
-  struct value *new_val = this, *mark = value_mark ();
+  struct value *new_val = this;
+
+  scoped_value_mark mark;
 
   /* Offsets are not supported here; lazy register values must
      refer to the entire register.  */
@@ -3983,10 +3985,6 @@ value::fetch_lazy_register ()
 
       frame_debug_printf ("%s", debug_file.c_str ());
     }
-
-  /* Dispose of the intermediate values.  This prevents
-     watchpoints from trying to watch the saved frame pointer.  */
-  value_free_to_mark (mark);
 }
 
 /* See value.h.  */