Use new+delete for struct expression
authorTom Tromey <tom@tromey.com>
Wed, 2 Dec 2020 00:22:05 +0000 (17:22 -0700)
committerTom Tromey <tom@tromey.com>
Wed, 2 Dec 2020 00:22:05 +0000 (17:22 -0700)
In another series I'm working on, it is necessary to manage
"struct expression" with new and delete.  Because the patch is
straightforward and could be extracted, I've done so here.

gdb/ChangeLog
2020-12-01  Tom Tromey  <tom@tromey.com>

* parse.c (expr_builder::expr_builder): Initialize expout.
(expr_builder::release): Use expression::resize.
(expression::expression, expression::~expression)
(expression::resize): New methods.
(write_exp_elt): Use expression::resize.
(prefixify_expression): Update.
(increase_expout_size): Use expression::resize.
* expression.h (struct expression): Add constructor, destructor.
<resize>: New method.
(expression_up): Change type.

gdb/ChangeLog
gdb/expression.h
gdb/parse.c

index 39637aa92a59103269361e5a7032ad4e0da4f379..635435cbdeae41bcc0483797f01cf179eb193048 100644 (file)
@@ -1,3 +1,16 @@
+2020-12-01  Tom Tromey  <tom@tromey.com>
+
+       * parse.c (expr_builder::expr_builder): Initialize expout.
+       (expr_builder::release): Use expression::resize.
+       (expression::expression, expression::~expression)
+       (expression::resize): New methods.
+       (write_exp_elt): Use expression::resize.
+       (prefixify_expression): Update.
+       (increase_expout_size): Use expression::resize.
+       * expression.h (struct expression): Add constructor, destructor.
+       <resize>: New method.
+       (expression_up): Change type.
+
 2020-12-01  Rogerio A. Cardoso  <rcardoso@linux.ibm.com>
        * ppc-linux-nat.c: (PPC_DEBUG_FEATURE_DATA_BP_ARCH_31): New define.
        (region_ok_for_hw_watchpoint): Check if 2nd DAWR is avaliable before
index a8bfac17d8b32d75210e0b1e206a12cfc4dafc41..684274b90b8ae42b0f94072ba6f424778d651f19 100644 (file)
@@ -93,15 +93,22 @@ union exp_element
   };
 
 struct expression
-  {
-    const struct language_defn *language_defn; /* language it was
-                                                  entered in.  */
-    struct gdbarch *gdbarch;  /* architecture it was parsed in.  */
-    int nelts;
-    union exp_element elts[1];
-  };
+{
+  expression (const struct language_defn *, struct gdbarch *, size_t);
+  ~expression ();
+  DISABLE_COPY_AND_ASSIGN (expression);
+
+  void resize (size_t);
+
+  /* Language it was entered in.  */
+  const struct language_defn *language_defn;
+  /* Architecture it was parsed in.  */
+  struct gdbarch *gdbarch;
+  int nelts = 0;
+  union exp_element *elts;
+};
 
-typedef gdb::unique_xmalloc_ptr<expression> expression_up;
+typedef std::unique_ptr<expression> expression_up;
 
 /* Macros for converting between number of expression elements and bytes
    to store that many expression elements.  */
index c34b6085cd09eb9553a5b3855b8237686262a9d5..73d82e64a87a6a12d07a3df73ef3b1824cc452e0 100644 (file)
@@ -114,13 +114,9 @@ innermost_block_tracker::update (const struct block *b,
 expr_builder::expr_builder (const struct language_defn *lang,
                            struct gdbarch *gdbarch)
   : expout_size (10),
-    expout (XNEWVAR (expression,
-                    (sizeof (expression)
-                     + EXP_ELEM_TO_BYTES (expout_size)))),
+    expout (new expression (lang, gdbarch, expout_size)),
     expout_ptr (0)
 {
-  expout->language_defn = lang;
-  expout->gdbarch = gdbarch;
 }
 
 expression_up
@@ -131,13 +127,31 @@ expr_builder::release ()
      excess elements.  */
 
   expout->nelts = expout_ptr;
-  expout.reset (XRESIZEVAR (expression, expout.release (),
-                           (sizeof (expression)
-                            + EXP_ELEM_TO_BYTES (expout_ptr))));
+  expout->resize (expout_ptr);
 
   return std::move (expout);
 }
 
+expression::expression (const struct language_defn *lang, struct gdbarch *arch,
+                       size_t n)
+  : language_defn (lang),
+    gdbarch (arch),
+    elts (nullptr)
+{
+  resize (n);
+}
+
+expression::~expression ()
+{
+  xfree (elts);
+}
+
+void
+expression::resize (size_t n)
+{
+  elts = XRESIZEVAR (union exp_element, elts, EXP_ELEM_TO_BYTES (n));
+}
+
 /* This page contains the functions for adding data to the struct expression
    being constructed.  */
 
@@ -152,9 +166,7 @@ write_exp_elt (struct expr_builder *ps, const union exp_element *expelt)
   if (ps->expout_ptr >= ps->expout_size)
     {
       ps->expout_size *= 2;
-      ps->expout.reset (XRESIZEVAR (expression, ps->expout.release (),
-                                   (sizeof (expression)
-                                    + EXP_ELEM_TO_BYTES (ps->expout_size))));
+      ps->expout->resize (ps->expout_size);
     }
   ps->expout->elts[ps->expout_ptr++] = *expelt;
 }
@@ -721,16 +733,14 @@ int
 prefixify_expression (struct expression *expr, int last_struct)
 {
   gdb_assert (expr->nelts > 0);
-  int len = sizeof (struct expression) + EXP_ELEM_TO_BYTES (expr->nelts);
-  struct expression *temp;
+  int len = EXP_ELEM_TO_BYTES (expr->nelts);
+  struct expression temp (expr->language_defn, expr->gdbarch, expr->nelts);
   int inpos = expr->nelts, outpos = 0;
 
-  temp = (struct expression *) alloca (len);
-
   /* Copy the original expression into temp.  */
-  memcpy (temp, expr, len);
+  memcpy (temp.elts, expr->elts, len);
 
-  return prefixify_subexp (temp, expr, inpos, outpos, last_struct);
+  return prefixify_subexp (&temp, expr, inpos, outpos, last_struct);
 }
 
 /* Return the number of exp_elements in the postfix subexpression 
@@ -1412,10 +1422,7 @@ increase_expout_size (struct expr_builder *ps, size_t lenelt)
     {
       ps->expout_size = std::max (ps->expout_size * 2,
                                  ps->expout_ptr + lenelt + 10);
-      ps->expout.reset (XRESIZEVAR (expression,
-                                   ps->expout.release (),
-                                   (sizeof (struct expression)
-                                    + EXP_ELEM_TO_BYTES (ps->expout_size))));
+      ps->expout->resize (ps->expout_size);
     }
 }