X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fvalarith.c;h=d59f692a4a07875e4c63e45067da751d8c238433;hb=041be52673949e5b6cc2b507e55a379a54ab8ee0;hp=875f5477c23733789eb7555b2923de73ab72bdc1;hpb=e71585ffe2e1394858f0fcf809e86f1b324fe4e6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/valarith.c b/gdb/valarith.c index 875f5477c2..d59f692a4a 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -1,6 +1,6 @@ /* Perform arithmetic and other operations on values, for GDB. - Copyright (C) 1986-2018 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -281,14 +281,14 @@ unop_user_defined_p (enum exp_opcode op, struct value *arg1) situations or combinations thereof. */ static struct value * -value_user_defined_cpp_op (struct value **args, int nargs, char *oper, +value_user_defined_cpp_op (gdb::array_view args, char *oper, int *static_memfuncp, enum noside noside) { struct symbol *symp = NULL; struct value *valp = NULL; - find_overload_match (args, nargs, oper, BOTH /* could be method */, + find_overload_match (args, oper, BOTH /* could be method */, &args[0] /* objp */, NULL /* pass NULL symbol since symbol is unknown */, &valp, &symp, static_memfuncp, 0, noside); @@ -312,19 +312,19 @@ value_user_defined_cpp_op (struct value **args, int nargs, char *oper, function, otherwise return NULL. */ static struct value * -value_user_defined_op (struct value **argp, struct value **args, char *name, - int *static_memfuncp, int nargs, enum noside noside) +value_user_defined_op (struct value **argp, gdb::array_view args, + char *name, int *static_memfuncp, enum noside noside) { struct value *result = NULL; if (current_language->la_language == language_cplus) { - result = value_user_defined_cpp_op (args, nargs, name, static_memfuncp, + result = value_user_defined_cpp_op (args, name, static_memfuncp, noside); } else - result = value_struct_elt (argp, args, name, static_memfuncp, - "structure"); + result = value_struct_elt (argp, args.data (), name, static_memfuncp, + "structure"); return result; } @@ -342,7 +342,6 @@ struct value * value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op, enum exp_opcode otherop, enum noside noside) { - struct value **argvec; char *ptr; char tstr[13]; int static_memfuncp; @@ -356,10 +355,11 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op, if (TYPE_CODE (check_typedef (value_type (arg1))) != TYPE_CODE_STRUCT) error (_("Can't do that binary op on that type")); /* FIXME be explicit */ - argvec = (struct value **) alloca (sizeof (struct value *) * 4); + value *argvec_storage[3]; + gdb::array_view argvec = argvec_storage; + argvec[1] = value_addr (arg1); argvec[2] = arg2; - argvec[3] = 0; /* Make the right function name up. */ strcpy (tstr, "operator__"); @@ -469,15 +469,15 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op, error (_("Invalid binary operation specified.")); } - argvec[0] = value_user_defined_op (&arg1, argvec + 1, tstr, - &static_memfuncp, 2, noside); + argvec[0] = value_user_defined_op (&arg1, argvec.slice (1), tstr, + &static_memfuncp, noside); if (argvec[0]) { if (static_memfuncp) { argvec[1] = argvec[0]; - argvec++; + argvec = argvec.slice (1); } if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD) { @@ -486,13 +486,13 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op, if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type - = result_type_of_xmethod (argvec[0], 2, argvec + 1); + = result_type_of_xmethod (argvec[0], argvec.slice (1)); if (return_type == NULL) error (_("Xmethod is missing return type.")); return value_zero (return_type, VALUE_LVAL (arg1)); } - return call_xmethod (argvec[0], 2, argvec + 1); + return call_xmethod (argvec[0], argvec.slice (1)); } if (noside == EVAL_AVOID_SIDE_EFFECTS) { @@ -503,7 +503,7 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op, return value_zero (return_type, VALUE_LVAL (arg1)); } return call_function_by_hand (argvec[0], NULL, - {argvec + 1, 2u - static_memfuncp}); + argvec.slice (1, 2 - static_memfuncp)); } throw_error (NOT_FOUND_ERROR, _("member function %s not found"), tstr); @@ -519,7 +519,6 @@ struct value * value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) { struct gdbarch *gdbarch = get_type_arch (value_type (arg1)); - struct value **argvec; char *ptr; char tstr[13], mangle_tstr[13]; int static_memfuncp, nargs; @@ -532,7 +531,9 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) if (TYPE_CODE (check_typedef (value_type (arg1))) != TYPE_CODE_STRUCT) error (_("Can't do that unary op on that type")); /* FIXME be explicit */ - argvec = (struct value **) alloca (sizeof (struct value *) * 4); + value *argvec_storage[3]; + gdb::array_view argvec = argvec_storage; + argvec[1] = value_addr (arg1); argvec[2] = 0; @@ -553,13 +554,11 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) case UNOP_POSTINCREMENT: strcpy (ptr, "++"); argvec[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0); - argvec[3] = 0; nargs ++; break; case UNOP_POSTDECREMENT: strcpy (ptr, "--"); argvec[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0); - argvec[3] = 0; nargs ++; break; case UNOP_LOGICAL_NOT: @@ -584,16 +583,15 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) error (_("Invalid unary operation specified.")); } - argvec[0] = value_user_defined_op (&arg1, argvec + 1, tstr, - &static_memfuncp, nargs, noside); + argvec[0] = value_user_defined_op (&arg1, argvec.slice (1, nargs), tstr, + &static_memfuncp, noside); if (argvec[0]) { if (static_memfuncp) { argvec[1] = argvec[0]; - nargs --; - argvec++; + argvec = argvec.slice (1); } if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD) { @@ -602,13 +600,13 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type - = result_type_of_xmethod (argvec[0], 1, argvec + 1); + = result_type_of_xmethod (argvec[0], argvec[1]); if (return_type == NULL) error (_("Xmethod is missing return type.")); return value_zero (return_type, VALUE_LVAL (arg1)); } - return call_xmethod (argvec[0], 1, argvec + 1); + return call_xmethod (argvec[0], argvec[1]); } if (noside == EVAL_AVOID_SIDE_EFFECTS) { @@ -619,7 +617,7 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) return value_zero (return_type, VALUE_LVAL (arg1)); } return call_function_by_hand (argvec[0], NULL, - gdb::make_array_view (argvec + 1, nargs)); + argvec.slice (1, nargs)); } throw_error (NOT_FOUND_ERROR, _("member function %s not found"), tstr);