Simplify MULTI_SUBSCRIPT implementation
authorTom Tromey <tom@tromey.com>
Sun, 27 Dec 2020 20:36:55 +0000 (13:36 -0700)
committerTom Tromey <tom@tromey.com>
Sun, 27 Dec 2020 20:36:55 +0000 (13:36 -0700)
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.

gdb/ChangeLog
gdb/eval.c

index 649652ec6025a1e9c15d2527e68e235167a4aa35..449afdc31db53c0ab3f0a6b261a15ba313fed308 100644 (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
index dadadbb83537783fcb4ce21362e4ba702d055174..58fa176c7c5149960771332c10efbdc20fef8a90 100644 (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))
            {