forked from Imagelibrary/binutils-gdb
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:
@@ -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>
|
2020-12-24 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
PR gdb/27059
|
PR gdb/27059
|
||||||
|
|||||||
34
gdb/eval.c
34
gdb/eval.c
@@ -2142,36 +2142,14 @@ evaluate_subexp_standard (struct type *expect_type,
|
|||||||
(*pos) += 2;
|
(*pos) += 2;
|
||||||
nargs = longest_to_int (exp->elts[pc + 1].longconst);
|
nargs = longest_to_int (exp->elts[pc + 1].longconst);
|
||||||
arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
|
arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
|
||||||
while (nargs-- > 0)
|
argvec = XALLOCAVEC (struct value *, nargs);
|
||||||
{
|
for (ix = 0; ix < nargs; ++ix)
|
||||||
arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
|
argvec[ix] = evaluate_subexp_with_coercion (exp, pos, noside);
|
||||||
/* FIXME: EVAL_SKIP handling may not be correct. */
|
|
||||||
if (noside == EVAL_SKIP)
|
if (noside == EVAL_SKIP)
|
||||||
|
return arg1;
|
||||||
|
for (ix = 0; ix < nargs; ++ix)
|
||||||
{
|
{
|
||||||
if (nargs > 0)
|
arg2 = argvec[ix];
|
||||||
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 ());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (binop_user_defined_p (op, arg1, arg2))
|
if (binop_user_defined_p (op, arg1, arg2))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user