Use new+delete for struct expression
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.
This commit is contained in:
parent
e89b3d5293
commit
77bf7e9911
3 changed files with 56 additions and 29 deletions
|
@ -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>
|
2020-12-01 Rogerio A. Cardoso <rcardoso@linux.ibm.com>
|
||||||
* ppc-linux-nat.c: (PPC_DEBUG_FEATURE_DATA_BP_ARCH_31): New define.
|
* 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
|
(region_ok_for_hw_watchpoint): Check if 2nd DAWR is avaliable before
|
||||||
|
|
|
@ -93,15 +93,22 @@ union exp_element
|
||||||
};
|
};
|
||||||
|
|
||||||
struct expression
|
struct expression
|
||||||
{
|
{
|
||||||
const struct language_defn *language_defn; /* language it was
|
expression (const struct language_defn *, struct gdbarch *, size_t);
|
||||||
entered in. */
|
~expression ();
|
||||||
struct gdbarch *gdbarch; /* architecture it was parsed in. */
|
DISABLE_COPY_AND_ASSIGN (expression);
|
||||||
int nelts;
|
|
||||||
union exp_element elts[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef gdb::unique_xmalloc_ptr<expression> expression_up;
|
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 std::unique_ptr<expression> expression_up;
|
||||||
|
|
||||||
/* Macros for converting between number of expression elements and bytes
|
/* Macros for converting between number of expression elements and bytes
|
||||||
to store that many expression elements. */
|
to store that many expression elements. */
|
||||||
|
|
49
gdb/parse.c
49
gdb/parse.c
|
@ -114,13 +114,9 @@ innermost_block_tracker::update (const struct block *b,
|
||||||
expr_builder::expr_builder (const struct language_defn *lang,
|
expr_builder::expr_builder (const struct language_defn *lang,
|
||||||
struct gdbarch *gdbarch)
|
struct gdbarch *gdbarch)
|
||||||
: expout_size (10),
|
: expout_size (10),
|
||||||
expout (XNEWVAR (expression,
|
expout (new expression (lang, gdbarch, expout_size)),
|
||||||
(sizeof (expression)
|
|
||||||
+ EXP_ELEM_TO_BYTES (expout_size)))),
|
|
||||||
expout_ptr (0)
|
expout_ptr (0)
|
||||||
{
|
{
|
||||||
expout->language_defn = lang;
|
|
||||||
expout->gdbarch = gdbarch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
expression_up
|
expression_up
|
||||||
|
@ -131,13 +127,31 @@ expr_builder::release ()
|
||||||
excess elements. */
|
excess elements. */
|
||||||
|
|
||||||
expout->nelts = expout_ptr;
|
expout->nelts = expout_ptr;
|
||||||
expout.reset (XRESIZEVAR (expression, expout.release (),
|
expout->resize (expout_ptr);
|
||||||
(sizeof (expression)
|
|
||||||
+ EXP_ELEM_TO_BYTES (expout_ptr))));
|
|
||||||
|
|
||||||
return std::move (expout);
|
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
|
/* This page contains the functions for adding data to the struct expression
|
||||||
being constructed. */
|
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)
|
if (ps->expout_ptr >= ps->expout_size)
|
||||||
{
|
{
|
||||||
ps->expout_size *= 2;
|
ps->expout_size *= 2;
|
||||||
ps->expout.reset (XRESIZEVAR (expression, ps->expout.release (),
|
ps->expout->resize (ps->expout_size);
|
||||||
(sizeof (expression)
|
|
||||||
+ EXP_ELEM_TO_BYTES (ps->expout_size))));
|
|
||||||
}
|
}
|
||||||
ps->expout->elts[ps->expout_ptr++] = *expelt;
|
ps->expout->elts[ps->expout_ptr++] = *expelt;
|
||||||
}
|
}
|
||||||
|
@ -721,16 +733,14 @@ int
|
||||||
prefixify_expression (struct expression *expr, int last_struct)
|
prefixify_expression (struct expression *expr, int last_struct)
|
||||||
{
|
{
|
||||||
gdb_assert (expr->nelts > 0);
|
gdb_assert (expr->nelts > 0);
|
||||||
int len = sizeof (struct expression) + EXP_ELEM_TO_BYTES (expr->nelts);
|
int len = EXP_ELEM_TO_BYTES (expr->nelts);
|
||||||
struct expression *temp;
|
struct expression temp (expr->language_defn, expr->gdbarch, expr->nelts);
|
||||||
int inpos = expr->nelts, outpos = 0;
|
int inpos = expr->nelts, outpos = 0;
|
||||||
|
|
||||||
temp = (struct expression *) alloca (len);
|
|
||||||
|
|
||||||
/* Copy the original expression into temp. */
|
/* 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
|
/* 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_size = std::max (ps->expout_size * 2,
|
||||||
ps->expout_ptr + lenelt + 10);
|
ps->expout_ptr + lenelt + 10);
|
||||||
ps->expout.reset (XRESIZEVAR (expression,
|
ps->expout->resize (ps->expout_size);
|
||||||
ps->expout.release (),
|
|
||||||
(sizeof (struct expression)
|
|
||||||
+ EXP_ELEM_TO_BYTES (ps->expout_size))));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue