X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Feval.c;h=9804a977f7bc0c48818bd662510d1361f2d8c750;hb=85558555ec343f6e8ec32da409c838954e68132f;hp=14bf6f7bae020f023f9c899b1052e25e6baeea1f;hpb=cd8ae15e25c46d8a96ff8b0f6878db0429f460b5;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/eval.c b/gdb/eval.c index 14bf6f7bae..9804a977f7 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -1,6 +1,6 @@ /* Evaluate expressions for GDB. - Copyright (C) 1986-2014 Free Software Foundation, Inc. + Copyright (C) 1986-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -18,13 +18,13 @@ along with this program. If not, see . */ #include "defs.h" -#include #include "symtab.h" #include "gdbtypes.h" #include "value.h" #include "expression.h" #include "target.h" #include "frame.h" +#include "gdbthread.h" #include "language.h" /* For CAST_IS_CONVERSION. */ #include "f-lang.h" /* For array bound stuff. */ #include "cp-abi.h" @@ -34,15 +34,11 @@ #include "parser-defs.h" #include "cp-support.h" #include "ui-out.h" -#include "exceptions.h" #include "regcache.h" #include "user-regs.h" #include "valprint.h" #include "gdb_obstack.h" #include "objfiles.h" - -#include "gdb_assert.h" - #include /* This is defined in valops.c */ @@ -68,8 +64,29 @@ struct value * evaluate_subexp (struct type *expect_type, struct expression *exp, int *pos, enum noside noside) { - return (*exp->language_defn->la_exp_desc->evaluate_exp) + struct cleanup *cleanups; + struct value *retval; + int cleanup_temps = 0; + + if (*pos == 0 && target_has_execution + && exp->language_defn->la_language == language_cplus + && !thread_stack_temporaries_enabled_p (inferior_ptid)) + { + cleanups = enable_thread_stack_temporaries (inferior_ptid); + cleanup_temps = 1; + } + + retval = (*exp->language_defn->la_exp_desc->evaluate_exp) (expect_type, exp, pos, noside); + + if (cleanup_temps) + { + if (value_in_thread_stack_temporaries (retval, inferior_ptid)) + retval = value_non_lval (retval); + do_cleanups (cleanups); + } + + return retval; } /* Parse the string EXP as a C expression, evaluate it, @@ -195,7 +212,6 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp, int preserve_errors) { struct value *mark, *new_mark, *result; - volatile struct gdb_exception ex; *valp = NULL; if (resultp) @@ -207,11 +223,11 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp, mark = value_mark (); result = NULL; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { result = evaluate_subexp (NULL_TYPE, exp, pc, EVAL_NORMAL); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { /* Ignore memory errors if we want watchpoints pointing at inaccessible memory to still be created; otherwise, throw the @@ -226,6 +242,7 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp, break; } } + END_CATCH new_mark = value_mark (); if (mark == new_mark) @@ -241,13 +258,16 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp, *valp = result; else { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value_fetch_lazy (result); *valp = result; } + CATCH (except, RETURN_MASK_ERROR) + { + } + END_CATCH } } @@ -346,12 +366,11 @@ evaluate_struct_tuple (struct value *struct_val, return struct_val; } -/* Recursive helper function for setting elements of array tuples for - (the deleted) Chill. The target is ARRAY (which has bounds - LOW_BOUND to HIGH_BOUND); the element value is ELEMENT; EXP, POS - and NOSIDE are as usual. Evaluates index expresions and sets the - specified element(s) of ARRAY to ELEMENT. Returns last index - value. */ +/* Recursive helper function for setting elements of array tuples. + The target is ARRAY (which has bounds LOW_BOUND to HIGH_BOUND); the + element value is ELEMENT; EXP, POS and NOSIDE are as usual. + Evaluates index expresions and sets the specified element(s) of + ARRAY to ELEMENT. Returns last index value. */ static LONGEST init_array_element (struct value *array, struct value *element, @@ -369,22 +388,6 @@ init_array_element (struct value *array, struct value *element, return init_array_element (array, element, exp, pos, noside, low_bound, high_bound); } - else if (exp->elts[*pos].opcode == BINOP_RANGE) - { - LONGEST low, high; - - (*pos)++; - low = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside)); - high = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside)); - if (low < low_bound || high > high_bound) - error (_("tuple range index out of range")); - for (index = low; index <= high; index++) - { - memcpy (value_contents_raw (array) - + (index - low_bound) * element_size, - value_contents (element), element_size); - } - } else { index = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside)); @@ -664,7 +667,6 @@ make_params (int num_types, struct type **param_types) TYPE_MAIN_TYPE (type) = XCNEW (struct main_type); TYPE_LENGTH (type) = 1; TYPE_CODE (type) = TYPE_CODE_METHOD; - TYPE_VPTR_FIELDNO (type) = -1; TYPE_CHAIN (type) = type; if (num_types > 0) { @@ -763,16 +765,15 @@ evaluate_subexp_standard (struct type *expect_type, or reference to a base class and print object is on. */ { - volatile struct gdb_exception except; struct value *ret = NULL; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { ret = value_of_variable (exp->elts[pc + 2].symbol, exp->elts[pc + 1].block); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (noside == EVAL_AVOID_SIDE_EFFECTS) ret = value_zero (SYMBOL_TYPE (exp->elts[pc + 2].symbol), @@ -780,6 +781,7 @@ evaluate_subexp_standard (struct type *expect_type, else throw_exception (except); } + END_CATCH return ret; } @@ -903,11 +905,6 @@ evaluate_subexp_standard (struct type *expect_type, struct value *element; int index_pc = 0; - if (exp->elts[*pos].opcode == BINOP_RANGE) - { - index_pc = ++(*pos); - evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP); - } element = evaluate_subexp (element_type, exp, pos, noside); if (value_type (element) != element_type) element = value_cast (element_type, element); @@ -958,22 +955,10 @@ evaluate_subexp_standard (struct type *expect_type, struct type *range_low_type, *range_high_type; struct value *elem_val; - if (exp->elts[*pos].opcode == BINOP_RANGE) - { - (*pos)++; - elem_val = evaluate_subexp (element_type, exp, pos, noside); - range_low_type = value_type (elem_val); - range_low = value_as_long (elem_val); - elem_val = evaluate_subexp (element_type, exp, pos, noside); - range_high_type = value_type (elem_val); - range_high = value_as_long (elem_val); - } - else - { - elem_val = evaluate_subexp (element_type, exp, pos, noside); - range_low_type = range_high_type = value_type (elem_val); - range_low = range_high = value_as_long (elem_val); - } + elem_val = evaluate_subexp (element_type, exp, pos, noside); + range_low_type = range_high_type = value_type (elem_val); + range_low = range_high = value_as_long (elem_val); + /* Check types of elements to avoid mixture of elements from different types. Also check if type of element is "compatible" with element type of powerset. */ @@ -1371,9 +1356,6 @@ evaluate_subexp_standard (struct type *expect_type, /* First, evaluate the structure into arg2. */ pc2 = (*pos)++; - if (noside == EVAL_SKIP) - goto nosideret; - if (op == STRUCTOP_MEMBER) { arg2 = evaluate_subexp_for_address (exp, pos, noside); @@ -1392,7 +1374,10 @@ evaluate_subexp_standard (struct type *expect_type, arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); type = check_typedef (value_type (arg1)); - if (TYPE_CODE (type) == TYPE_CODE_METHODPTR) + if (noside == EVAL_SKIP) + tem = 1; /* Set it to the right arg index so that all arguments + can also be skipped. */ + else if (TYPE_CODE (type) == TYPE_CODE_METHODPTR) { if (noside == EVAL_AVOID_SIDE_EFFECTS) arg1 = value_zero (TYPE_TARGET_TYPE (type), not_lval); @@ -1407,7 +1392,7 @@ evaluate_subexp_standard (struct type *expect_type, else if (TYPE_CODE (type) == TYPE_CODE_MEMBERPTR) { struct type *type_ptr - = lookup_pointer_type (TYPE_DOMAIN_TYPE (type)); + = lookup_pointer_type (TYPE_SELF_TYPE (type)); struct type *target_type_ptr = lookup_pointer_type (TYPE_TARGET_TYPE (type)); @@ -1435,8 +1420,6 @@ evaluate_subexp_standard (struct type *expect_type, pc2 = (*pos)++; tem2 = longest_to_int (exp->elts[pc2 + 1].longconst); *pos += 3 + BYTES_TO_EXP_ELEM (tem2 + 1); - if (noside == EVAL_SKIP) - goto nosideret; if (op == STRUCTOP_STRUCT) { @@ -1466,20 +1449,21 @@ evaluate_subexp_standard (struct type *expect_type, operator and continue evaluation. */ while (unop_user_defined_p (op, arg2)) { - volatile struct gdb_exception except; struct value *value = NULL; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value = value_x_unop (arg2, op, noside); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (except.error == NOT_FOUND_ERROR) break; else throw_exception (except); } + END_CATCH + arg2 = value; } } @@ -1585,6 +1569,9 @@ evaluate_subexp_standard (struct type *expect_type, /* Signal end of arglist. */ argvec[tem] = 0; + if (noside == EVAL_SKIP) + goto nosideret; + if (op == OP_ADL_FUNC) { struct symbol *symp; @@ -1601,7 +1588,7 @@ evaluate_subexp_standard (struct type *expect_type, NON_METHOD, /* not method */ NULL, NULL, /* pass NULL symbol since symbol is unknown */ - NULL, &symp, NULL, 0); + NULL, &symp, NULL, 0, noside); /* Now fix the expression being evaluated. */ exp->elts[save_pos1 + 2].symbol = symp; @@ -1637,7 +1624,7 @@ evaluate_subexp_standard (struct type *expect_type, METHOD, /* method */ &arg2, /* the object */ NULL, &valp, NULL, - &static_memfuncp, 0); + &static_memfuncp, 0, noside); if (op == OP_SCOPE && !static_memfuncp) { @@ -1708,7 +1695,7 @@ evaluate_subexp_standard (struct type *expect_type, NULL, /* no need for name */ NON_METHOD, /* not method */ NULL, function, /* the function */ - NULL, &symp, NULL, no_adl); + NULL, &symp, NULL, no_adl, noside); if (op == OP_VAR_VALUE) { @@ -1734,8 +1721,6 @@ evaluate_subexp_standard (struct type *expect_type, do_call_it: - if (noside == EVAL_SKIP) - goto nosideret; if (argvec[0] == NULL) error (_("Cannot evaluate function -- may be inlined")); if (noside == EVAL_AVOID_SIDE_EFFECTS) @@ -1765,11 +1750,16 @@ evaluate_subexp_standard (struct type *expect_type, error (_("Expression of type other than " "\"Function returning ...\" used as function")); } - if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_INTERNAL_FUNCTION) - return call_internal_function (exp->gdbarch, exp->language_defn, - argvec[0], nargs, argvec + 1); - - return call_function_by_hand (argvec[0], nargs, argvec + 1); + switch (TYPE_CODE (value_type (argvec[0]))) + { + case TYPE_CODE_INTERNAL_FUNCTION: + return call_internal_function (exp->gdbarch, exp->language_defn, + argvec[0], nargs, argvec + 1); + case TYPE_CODE_XMETHOD: + return call_xmethod (argvec[0], nargs, argvec + 1); + default: + return call_function_by_hand (argvec[0], nargs, argvec + 1); + } /* pai: FIXME save value from call_function_by_hand, then adjust pc by adjust_fn_pc if +ve. */ @@ -1837,6 +1827,8 @@ evaluate_subexp_standard (struct type *expect_type, for (; tem <= nargs; tem++) argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside); argvec[tem] = 0; /* signal end of arglist */ + if (noside == EVAL_SKIP) + goto nosideret; goto do_call_it; default: @@ -1875,20 +1867,21 @@ evaluate_subexp_standard (struct type *expect_type, arg1 with the value returned by evaluating operator->(). */ while (unop_user_defined_p (op, arg1)) { - volatile struct gdb_exception except; struct value *value = NULL; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value = value_x_unop (arg1, op, noside); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (except.error == NOT_FOUND_ERROR) break; else throw_exception (except); } + END_CATCH + arg1 = value; } @@ -1903,7 +1896,7 @@ evaluate_subexp_standard (struct type *expect_type, get_user_print_options (&opts); if (opts.objectprint && TYPE_TARGET_TYPE(type) - && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS)) + && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT)) { real_type = value_rtti_indirect_type (arg1, &full, &top, &using_enc); @@ -1945,7 +1938,7 @@ evaluate_subexp_standard (struct type *expect_type, case TYPE_CODE_MEMBERPTR: /* Now, convert these values to an address. */ - arg1 = value_cast_pointers (lookup_pointer_type (TYPE_DOMAIN_TYPE (type)), + arg1 = value_cast_pointers (lookup_pointer_type (TYPE_SELF_TYPE (type)), arg1, 1); mem_offset = value_as_long (arg2); @@ -2122,13 +2115,6 @@ evaluate_subexp_standard (struct type *expect_type, } } - case BINOP_RANGE: - evaluate_subexp (NULL_TYPE, exp, pos, noside); - evaluate_subexp (NULL_TYPE, exp, pos, noside); - if (noside == EVAL_SKIP) - goto nosideret; - error (_("':' operator used in invalid context")); - case BINOP_SUBSCRIPT: arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside); @@ -2159,15 +2145,6 @@ evaluate_subexp_standard (struct type *expect_type, else return value_subscript (arg1, value_as_long (arg2)); } - - case BINOP_IN: - arg1 = evaluate_subexp_with_coercion (exp, pos, noside); - arg2 = evaluate_subexp_with_coercion (exp, pos, noside); - if (noside == EVAL_SKIP) - goto nosideret; - type = language_bool_type (exp->language_defn, exp->gdbarch); - return value_from_longest (type, (LONGEST) value_in (arg1, arg2)); - case MULTI_SUBSCRIPT: (*pos) += 2; nargs = longest_to_int (exp->elts[pc + 1].longconst);