* 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.
This commit is contained in:
parent
c02866a09f
commit
cc73bb8c7a
3 changed files with 28 additions and 19 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2010-05-10 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
* 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 <msnyder@vmware.com>
|
2010-05-10 Michael Snyder <msnyder@vmware.com>
|
||||||
|
|
||||||
* utils.c (do_fclose_cleanup) Restore local variable.
|
* utils.c (do_fclose_cleanup) Restore local variable.
|
||||||
|
|
34
gdb/eval.c
34
gdb/eval.c
|
@ -633,7 +633,7 @@ binop_promote (const struct language_defn *language, struct gdbarch *gdbarch,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ptrmath_type_p (struct type *type)
|
ptrmath_type_p (const struct language_defn *lang, struct type *type)
|
||||||
{
|
{
|
||||||
type = check_typedef (type);
|
type = check_typedef (type);
|
||||||
if (TYPE_CODE (type) == TYPE_CODE_REF)
|
if (TYPE_CODE (type) == TYPE_CODE_REF)
|
||||||
|
@ -646,7 +646,7 @@ ptrmath_type_p (struct type *type)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case TYPE_CODE_ARRAY:
|
case TYPE_CODE_ARRAY:
|
||||||
return current_language->c_style_arrays;
|
return lang->c_style_arrays;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1906,10 +1906,12 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||||
op = exp->elts[pc + 1].opcode;
|
op = exp->elts[pc + 1].opcode;
|
||||||
if (binop_user_defined_p (op, arg1, arg2))
|
if (binop_user_defined_p (op, arg1, arg2))
|
||||||
return value_x_binop (arg1, arg2, BINOP_ASSIGN_MODIFY, op, noside);
|
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)))
|
&& is_integral_type (value_type (arg2)))
|
||||||
arg2 = value_ptradd (arg1, value_as_long (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)))
|
&& is_integral_type (value_type (arg2)))
|
||||||
arg2 = value_ptradd (arg1, - value_as_long (arg2));
|
arg2 = value_ptradd (arg1, - value_as_long (arg2));
|
||||||
else
|
else
|
||||||
|
@ -1935,10 +1937,10 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||||
goto nosideret;
|
goto nosideret;
|
||||||
if (binop_user_defined_p (op, arg1, arg2))
|
if (binop_user_defined_p (op, arg1, arg2))
|
||||||
return value_x_binop (arg1, arg2, op, OP_NULL, noside);
|
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)))
|
&& is_integral_type (value_type (arg2)))
|
||||||
return value_ptradd (arg1, value_as_long (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)))
|
&& is_integral_type (value_type (arg1)))
|
||||||
return value_ptradd (arg2, value_as_long (arg1));
|
return value_ptradd (arg2, value_as_long (arg1));
|
||||||
else
|
else
|
||||||
|
@ -1954,14 +1956,14 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||||
goto nosideret;
|
goto nosideret;
|
||||||
if (binop_user_defined_p (op, arg1, arg2))
|
if (binop_user_defined_p (op, arg1, arg2))
|
||||||
return value_x_binop (arg1, arg2, op, OP_NULL, noside);
|
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))
|
||||||
&& ptrmath_type_p (value_type (arg2)))
|
&& ptrmath_type_p (exp->language_defn, value_type (arg2)))
|
||||||
{
|
{
|
||||||
/* FIXME -- should be ptrdiff_t */
|
/* FIXME -- should be ptrdiff_t */
|
||||||
type = builtin_type (exp->gdbarch)->builtin_long;
|
type = builtin_type (exp->gdbarch)->builtin_long;
|
||||||
return value_from_longest (type, value_ptrdiff (arg1, arg2));
|
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)))
|
&& is_integral_type (value_type (arg2)))
|
||||||
return value_ptradd (arg1, - value_as_long (arg2));
|
return value_ptradd (arg1, - value_as_long (arg2));
|
||||||
else
|
else
|
||||||
|
@ -2031,8 +2033,8 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||||
error (_("':' operator used in invalid context"));
|
error (_("':' operator used in invalid context"));
|
||||||
|
|
||||||
case BINOP_SUBSCRIPT:
|
case BINOP_SUBSCRIPT:
|
||||||
arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
|
arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
|
||||||
arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
|
arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
|
||||||
if (noside == EVAL_SKIP)
|
if (noside == EVAL_SKIP)
|
||||||
goto nosideret;
|
goto nosideret;
|
||||||
if (binop_user_defined_p (op, arg1, arg2))
|
if (binop_user_defined_p (op, arg1, arg2))
|
||||||
|
@ -2572,7 +2574,7 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ptrmath_type_p (value_type (arg1)))
|
if (ptrmath_type_p (exp->language_defn, value_type (arg1)))
|
||||||
arg2 = value_ptradd (arg1, 1);
|
arg2 = value_ptradd (arg1, 1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2595,7 +2597,7 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ptrmath_type_p (value_type (arg1)))
|
if (ptrmath_type_p (exp->language_defn, value_type (arg1)))
|
||||||
arg2 = value_ptradd (arg1, -1);
|
arg2 = value_ptradd (arg1, -1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2618,7 +2620,7 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ptrmath_type_p (value_type (arg1)))
|
if (ptrmath_type_p (exp->language_defn, value_type (arg1)))
|
||||||
arg2 = value_ptradd (arg1, 1);
|
arg2 = value_ptradd (arg1, 1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2642,7 +2644,7 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ptrmath_type_p (value_type (arg1)))
|
if (ptrmath_type_p (exp->language_defn, value_type (arg1)))
|
||||||
arg2 = value_ptradd (arg1, -1);
|
arg2 = value_ptradd (arg1, -1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2832,7 +2834,7 @@ evaluate_subexp_with_coercion (struct expression *exp,
|
||||||
var = exp->elts[pc + 2].symbol;
|
var = exp->elts[pc + 2].symbol;
|
||||||
type = check_typedef (SYMBOL_TYPE (var));
|
type = check_typedef (SYMBOL_TYPE (var));
|
||||||
if (TYPE_CODE (type) == TYPE_CODE_ARRAY
|
if (TYPE_CODE (type) == TYPE_CODE_ARRAY
|
||||||
&& CAST_IS_CONVERSION)
|
&& CAST_IS_CONVERSION (exp->language_defn))
|
||||||
{
|
{
|
||||||
(*pos) += 4;
|
(*pos) += 4;
|
||||||
val = address_of_variable (var, exp->elts[pc + 1].block);
|
val = address_of_variable (var, exp->elts[pc + 1].block);
|
||||||
|
|
|
@ -381,9 +381,9 @@ struct type *language_lookup_primitive_type_by_name (const struct language_defn
|
||||||
|
|
||||||
/* "cast" really means conversion */
|
/* "cast" really means conversion */
|
||||||
/* FIXME -- should be a setting in language_defn */
|
/* FIXME -- should be a setting in language_defn */
|
||||||
#define CAST_IS_CONVERSION (current_language->la_language == language_c || \
|
#define CAST_IS_CONVERSION(LANG) ((LANG)->la_language == language_c || \
|
||||||
current_language->la_language == language_cplus || \
|
(LANG)->la_language == language_cplus || \
|
||||||
current_language->la_language == language_objc)
|
(LANG)->la_language == language_objc)
|
||||||
|
|
||||||
extern void language_info (int);
|
extern void language_info (int);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue