From b467efaa91d270f8d057bbae9ab915d068a90ec4 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 8 Mar 2021 07:27:57 -0700 Subject: [PATCH] Split out ada_binop_in_bounds This splits BINOP_IN_BOUNDS into a new function for future use. gdb/ChangeLog 2021-03-08 Tom Tromey * ada-lang.c (ada_binop_in_bounds): New function. (ada_evaluate_subexp): Use it. --- gdb/ChangeLog | 5 +++++ gdb/ada-lang.c | 53 +++++++++++++++++++++++++++++--------------------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f0c62cf2014..4905a8592f4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2021-03-08 Tom Tromey + + * ada-lang.c (ada_binop_in_bounds): New function. + (ada_evaluate_subexp): Use it. + 2021-03-08 Tom Tromey * ada-lang.c (ada_ternop_slice): New function. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index c039183373f..09ea46ed4f3 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -10188,6 +10188,36 @@ ada_ternop_slice (struct expression *exp, longest_to_int (high_bound)); } +/* A helper function for BINOP_IN_BOUNDS. */ + +static value * +ada_binop_in_bounds (struct expression *exp, enum noside noside, + struct value *arg1, struct value *arg2, int n) +{ + if (noside == EVAL_AVOID_SIDE_EFFECTS) + { + struct type *type = language_bool_type (exp->language_defn, + exp->gdbarch); + return value_zero (type, not_lval); + } + + struct type *type = ada_index_type (value_type (arg2), n, "range"); + if (!type) + type = value_type (arg1); + + value *arg3 = value_from_longest (type, ada_array_bound (arg2, n, 1)); + arg2 = value_from_longest (type, ada_array_bound (arg2, n, 0)); + + binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2); + binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg3); + type = language_bool_type (exp->language_defn, exp->gdbarch); + return value_from_longest (type, + (value_less (arg1, arg3) + || value_equal (arg1, arg3)) + && (value_less (arg2, arg1) + || value_equal (arg2, arg1))); +} + /* Implement the evaluate_exp routine in the exp_descriptor structure for the Ada language. */ @@ -10651,30 +10681,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, if (noside == EVAL_SKIP) goto nosideret; - if (noside == EVAL_AVOID_SIDE_EFFECTS) - { - type = language_bool_type (exp->language_defn, exp->gdbarch); - return value_zero (type, not_lval); - } - tem = longest_to_int (exp->elts[pc + 1].longconst); - type = ada_index_type (value_type (arg2), tem, "range"); - if (!type) - type = value_type (arg1); - - arg3 = value_from_longest (type, ada_array_bound (arg2, tem, 1)); - arg2 = value_from_longest (type, ada_array_bound (arg2, tem, 0)); - - binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2); - binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg3); - type = language_bool_type (exp->language_defn, exp->gdbarch); - return - value_from_longest (type, - (value_less (arg1, arg3) - || value_equal (arg1, arg3)) - && (value_less (arg2, arg1) - || value_equal (arg2, arg1))); + return ada_binop_in_bounds (exp, noside, arg1, arg2, tem); case TERNOP_IN_RANGE: arg1 = evaluate_subexp (nullptr, exp, pos, noside); -- 2.30.2