From cc73bb8c7a49a308ae56e27a88fcb173ced0f1a5 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 10 May 2010 20:20:21 +0000 Subject: [PATCH] * eval.c (ptrmath_type_p): Add 'lang' argument. (evaluate_subexp_standard): Update. (evaluate_subexp_with_coercion): Update. * language.h (CAST_IS_CONVERSION): Add 'LANG' argument. --- gdb/ChangeLog | 7 +++++++ gdb/eval.c | 34 ++++++++++++++++++---------------- gdb/language.h | 6 +++--- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1d7962a8457..3d6249bb35a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2010-05-10 Tom Tromey + + * eval.c (ptrmath_type_p): Add 'lang' argument. + (evaluate_subexp_standard): Update. + (evaluate_subexp_with_coercion): Update. + * language.h (CAST_IS_CONVERSION): Add 'LANG' argument. + 2010-05-10 Michael Snyder * utils.c (do_fclose_cleanup) Restore local variable. diff --git a/gdb/eval.c b/gdb/eval.c index 985e653ddf6..2c8b01f4d81 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -633,7 +633,7 @@ binop_promote (const struct language_defn *language, struct gdbarch *gdbarch, } static int -ptrmath_type_p (struct type *type) +ptrmath_type_p (const struct language_defn *lang, struct type *type) { type = check_typedef (type); if (TYPE_CODE (type) == TYPE_CODE_REF) @@ -646,7 +646,7 @@ ptrmath_type_p (struct type *type) return 1; case TYPE_CODE_ARRAY: - return current_language->c_style_arrays; + return lang->c_style_arrays; default: return 0; @@ -1906,10 +1906,12 @@ evaluate_subexp_standard (struct type *expect_type, op = exp->elts[pc + 1].opcode; if (binop_user_defined_p (op, arg1, arg2)) return value_x_binop (arg1, arg2, BINOP_ASSIGN_MODIFY, op, noside); - else if (op == BINOP_ADD && ptrmath_type_p (value_type (arg1)) + else if (op == BINOP_ADD && ptrmath_type_p (exp->language_defn, + value_type (arg1)) && is_integral_type (value_type (arg2))) arg2 = value_ptradd (arg1, value_as_long (arg2)); - else if (op == BINOP_SUB && ptrmath_type_p (value_type (arg1)) + else if (op == BINOP_SUB && ptrmath_type_p (exp->language_defn, + value_type (arg1)) && is_integral_type (value_type (arg2))) arg2 = value_ptradd (arg1, - value_as_long (arg2)); else @@ -1935,10 +1937,10 @@ evaluate_subexp_standard (struct type *expect_type, goto nosideret; if (binop_user_defined_p (op, arg1, arg2)) return value_x_binop (arg1, arg2, op, OP_NULL, noside); - else if (ptrmath_type_p (value_type (arg1)) + else if (ptrmath_type_p (exp->language_defn, value_type (arg1)) && is_integral_type (value_type (arg2))) return value_ptradd (arg1, value_as_long (arg2)); - else if (ptrmath_type_p (value_type (arg2)) + else if (ptrmath_type_p (exp->language_defn, value_type (arg2)) && is_integral_type (value_type (arg1))) return value_ptradd (arg2, value_as_long (arg1)); else @@ -1954,14 +1956,14 @@ evaluate_subexp_standard (struct type *expect_type, goto nosideret; if (binop_user_defined_p (op, arg1, arg2)) return value_x_binop (arg1, arg2, op, OP_NULL, noside); - else if (ptrmath_type_p (value_type (arg1)) - && ptrmath_type_p (value_type (arg2))) + else if (ptrmath_type_p (exp->language_defn, value_type (arg1)) + && ptrmath_type_p (exp->language_defn, value_type (arg2))) { /* FIXME -- should be ptrdiff_t */ type = builtin_type (exp->gdbarch)->builtin_long; return value_from_longest (type, value_ptrdiff (arg1, arg2)); } - else if (ptrmath_type_p (value_type (arg1)) + else if (ptrmath_type_p (exp->language_defn, value_type (arg1)) && is_integral_type (value_type (arg2))) return value_ptradd (arg1, - value_as_long (arg2)); else @@ -2031,8 +2033,8 @@ evaluate_subexp_standard (struct type *expect_type, error (_("':' operator used in invalid context")); case BINOP_SUBSCRIPT: - arg1 = evaluate_subexp_with_coercion (exp, pos, noside); - arg2 = evaluate_subexp_with_coercion (exp, pos, noside); + arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; if (binop_user_defined_p (op, arg1, arg2)) @@ -2572,7 +2574,7 @@ evaluate_subexp_standard (struct type *expect_type, } else { - if (ptrmath_type_p (value_type (arg1))) + if (ptrmath_type_p (exp->language_defn, value_type (arg1))) arg2 = value_ptradd (arg1, 1); else { @@ -2595,7 +2597,7 @@ evaluate_subexp_standard (struct type *expect_type, } else { - if (ptrmath_type_p (value_type (arg1))) + if (ptrmath_type_p (exp->language_defn, value_type (arg1))) arg2 = value_ptradd (arg1, -1); else { @@ -2618,7 +2620,7 @@ evaluate_subexp_standard (struct type *expect_type, } else { - if (ptrmath_type_p (value_type (arg1))) + if (ptrmath_type_p (exp->language_defn, value_type (arg1))) arg2 = value_ptradd (arg1, 1); else { @@ -2642,7 +2644,7 @@ evaluate_subexp_standard (struct type *expect_type, } else { - if (ptrmath_type_p (value_type (arg1))) + if (ptrmath_type_p (exp->language_defn, value_type (arg1))) arg2 = value_ptradd (arg1, -1); else { @@ -2832,7 +2834,7 @@ evaluate_subexp_with_coercion (struct expression *exp, var = exp->elts[pc + 2].symbol; type = check_typedef (SYMBOL_TYPE (var)); if (TYPE_CODE (type) == TYPE_CODE_ARRAY - && CAST_IS_CONVERSION) + && CAST_IS_CONVERSION (exp->language_defn)) { (*pos) += 4; val = address_of_variable (var, exp->elts[pc + 1].block); diff --git a/gdb/language.h b/gdb/language.h index 9c6d50135f0..9306a82a204 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -381,9 +381,9 @@ struct type *language_lookup_primitive_type_by_name (const struct language_defn /* "cast" really means conversion */ /* FIXME -- should be a setting in language_defn */ -#define CAST_IS_CONVERSION (current_language->la_language == language_c || \ - current_language->la_language == language_cplus || \ - current_language->la_language == language_objc) +#define CAST_IS_CONVERSION(LANG) ((LANG)->la_language == language_c || \ + (LANG)->la_language == language_cplus || \ + (LANG)->la_language == language_objc) extern void language_info (int); -- 2.30.2