From c8f02daac9e367c7c2dc4c3ce08e85c733a56c7c Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 27 Dec 2020 13:36:55 -0700 Subject: 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 * eval.c (evaluate_subexp_standard) : Simplify. --- gdb/ChangeLog | 5 +++++ gdb/eval.c | 36 +++++++----------------------------- 2 files changed, 12 insertions(+), 29 deletions(-) (limited to 'gdb') diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 649652e..449afdc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-12-27 Tom Tromey + + * eval.c (evaluate_subexp_standard) : + Simplify. + 2020-12-24 Andrew Burgess PR gdb/27059 diff --git a/gdb/eval.c b/gdb/eval.c index dadadbb..58fa176 100644 --- a/gdb/eval.c +++ b/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)) { -- cgit v1.1