Split out eval_op_m2_subscript

This splits BINOP_SUBSCRIPT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

	* m2-lang.c (eval_op_m2_subscript): New function.
	(evaluate_subexp_modula2): Use it.
This commit is contained in:
Tom Tromey 2021-03-08 07:27:57 -07:00
parent 41bdced5ae
commit a49881f73e
2 changed files with 56 additions and 48 deletions

View file

@ -1,3 +1,8 @@
2021-03-08 Tom Tromey <tom@tromey.com>
* m2-lang.c (eval_op_m2_subscript): New function.
(evaluate_subexp_modula2): Use it.
2021-03-08 Tom Tromey <tom@tromey.com> 2021-03-08 Tom Tromey <tom@tromey.com>
* m2-lang.c (eval_op_m2_high): New function. * m2-lang.c (eval_op_m2_high): New function.

View file

@ -60,45 +60,29 @@ eval_op_m2_high (struct type *expect_type, struct expression *exp,
return arg1; return arg1;
} }
/* A helper function for BINOP_SUBSCRIPT. */
static struct value * static struct value *
evaluate_subexp_modula2 (struct type *expect_type, struct expression *exp, eval_op_m2_subscript (struct type *expect_type, struct expression *exp,
int *pos, enum noside noside) enum noside noside,
struct value *arg1, struct value *arg2)
{ {
enum exp_opcode op = exp->elts[*pos].opcode;
struct value *arg1;
struct value *arg2;
struct type *type;
switch (op)
{
case UNOP_HIGH:
(*pos)++;
arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
return eval_op_m2_high (expect_type, exp, noside, arg1);
case BINOP_SUBSCRIPT:
(*pos)++;
arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
if (noside == EVAL_SKIP) if (noside == EVAL_SKIP)
goto nosideret; return eval_skip_value (exp);
/* If the user attempts to subscript something that is not an /* If the user attempts to subscript something that is not an
array or pointer type (like a plain int variable for example), array or pointer type (like a plain int variable for example),
then report this as an error. */ then report this as an error. */
arg1 = coerce_ref (arg1); arg1 = coerce_ref (arg1);
type = check_typedef (value_type (arg1)); struct type *type = check_typedef (value_type (arg1));
if (m2_is_unbounded_array (type)) if (m2_is_unbounded_array (type))
{ {
struct value *temp = arg1; struct value *temp = arg1;
type = type->field (0).type (); type = type->field (0).type ();
if (type == NULL || (type->code () != TYPE_CODE_PTR)) if (type == NULL || (type->code () != TYPE_CODE_PTR))
{ error (_("internal error: unbounded "
warning (_("internal error: unbounded "
"array structure is unknown")); "array structure is unknown"));
return evaluate_subexp_standard (expect_type, exp, pos, noside);
}
/* i18n: Do not translate the "_m2_contents" part! */ /* i18n: Do not translate the "_m2_contents" part! */
arg1 = value_struct_elt (&temp, NULL, "_m2_contents", NULL, arg1 = value_struct_elt (&temp, NULL, "_m2_contents", NULL,
_("unbounded structure " _("unbounded structure "
@ -124,13 +108,32 @@ evaluate_subexp_modula2 (struct type *expect_type, struct expression *exp,
return value_zero (TYPE_TARGET_TYPE (type), VALUE_LVAL (arg1)); return value_zero (TYPE_TARGET_TYPE (type), VALUE_LVAL (arg1));
else else
return value_subscript (arg1, value_as_long (arg2)); return value_subscript (arg1, value_as_long (arg2));
}
static struct value *
evaluate_subexp_modula2 (struct type *expect_type, struct expression *exp,
int *pos, enum noside noside)
{
enum exp_opcode op = exp->elts[*pos].opcode;
struct value *arg1;
struct value *arg2;
switch (op)
{
case UNOP_HIGH:
(*pos)++;
arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
return eval_op_m2_high (expect_type, exp, noside, arg1);
case BINOP_SUBSCRIPT:
(*pos)++;
arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
return eval_op_m2_subscript (expect_type, exp, noside, arg1, arg2);
default: default:
return evaluate_subexp_standard (expect_type, exp, pos, noside); return evaluate_subexp_standard (expect_type, exp, pos, noside);
} }
nosideret:
return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1);
} }