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:
Tom Tromey 2020-12-27 13:36:55 -07:00
parent 9e87bc7f0f
commit c8f02daac9
2 changed files with 12 additions and 29 deletions

View File

@ -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

View File

@ -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))
{