mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
Simplify MULTI_SUBSCRIPT implementation
The MULTI_SUBSCRIPT code in evaluate_subexp_standard has a comment saying that perhaps the EVAL_SKIP handling is incorrect. This patch simplifies this code. In particular, it precomputes all the indices in a separate loop and removes some complicated flow-control. Tested using the gdb.modula2 and gdb.dlang test suites, as these are the only parsers that emit MULTI_SUBSCRIPT. gdb/ChangeLog 2020-12-27 Tom Tromey <tom@tromey.com> * eval.c (evaluate_subexp_standard) <case MULTI_SUBSCRIPT>: Simplify.
This commit is contained in:
parent
9e87bc7f0f
commit
c8f02daac9
@ -1,3 +1,8 @@
|
||||
2020-12-27 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* eval.c (evaluate_subexp_standard) <case MULTI_SUBSCRIPT>:
|
||||
Simplify.
|
||||
|
||||
2020-12-24 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
PR gdb/27059
|
||||
|
36
gdb/eval.c
36
gdb/eval.c
@ -2142,36 +2142,14 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||
(*pos) += 2;
|
||||
nargs = longest_to_int (exp->elts[pc + 1].longconst);
|
||||
arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
|
||||
while (nargs-- > 0)
|
||||
argvec = XALLOCAVEC (struct value *, nargs);
|
||||
for (ix = 0; ix < nargs; ++ix)
|
||||
argvec[ix] = evaluate_subexp_with_coercion (exp, pos, noside);
|
||||
if (noside == EVAL_SKIP)
|
||||
return arg1;
|
||||
for (ix = 0; ix < nargs; ++ix)
|
||||
{
|
||||
arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
|
||||
/* FIXME: EVAL_SKIP handling may not be correct. */
|
||||
if (noside == EVAL_SKIP)
|
||||
{
|
||||
if (nargs > 0)
|
||||
continue;
|
||||
return eval_skip_value (exp);
|
||||
}
|
||||
/* FIXME: EVAL_AVOID_SIDE_EFFECTS handling may not be correct. */
|
||||
if (noside == EVAL_AVOID_SIDE_EFFECTS)
|
||||
{
|
||||
/* If the user attempts to subscript something that has no target
|
||||
type (like a plain int variable for example), then report this
|
||||
as an error. */
|
||||
|
||||
type = TYPE_TARGET_TYPE (check_typedef (value_type (arg1)));
|
||||
if (type != NULL)
|
||||
{
|
||||
arg1 = value_zero (type, VALUE_LVAL (arg1));
|
||||
noside = EVAL_SKIP;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
error (_("cannot subscript something of type `%s'"),
|
||||
value_type (arg1)->name ());
|
||||
}
|
||||
}
|
||||
arg2 = argvec[ix];
|
||||
|
||||
if (binop_user_defined_p (op, arg1, arg2))
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user