diff options
author | Pedro Alves <palves@redhat.com> | 2018-11-21 11:55:12 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2018-11-21 12:06:20 +0000 |
commit | 6b1747cd135ff9859fceb6043179b1ef94363996 (patch) | |
tree | 9dd00eb42169b61747d43efeec410c66ba7070e3 /gdb/valarith.c | |
parent | e71585ffe2e1394858f0fcf809e86f1b324fe4e6 (diff) | |
download | gdb-6b1747cd135ff9859fceb6043179b1ef94363996.zip gdb-6b1747cd135ff9859fceb6043179b1ef94363996.tar.gz gdb-6b1747cd135ff9859fceb6043179b1ef94363996.tar.bz2 |
invoke_xmethod & array_view
This replaces more pointer+length with gdb::array_view. This time,
around invoke_xmethod, and then propagating the fallout around, which
inevitably leaks to the overload resolution code.
There are several places in the code that want to grab a slice of an
array, by advancing the array pointer, and decreasing the length
pointer. This patch introduces a pair of new
gdb::array_view::slice(...) methods to make that convenient and clear.
Unit test included.
gdb/ChangeLog:
2018-11-21 Pedro Alves <palves@redhat.com>
* common/array-view.h (array_view::splice(size_type, size_t)): New.
(array_view::splice(size_type)): New.
* eval.c (eval_call, evaluate_funcall): Adjust to use array_view.
* extension.c (xmethod_worker::get_arg_types): Adjust to return an
std::vector.
(xmethod_worker::get_result_type): Adjust to use gdb::array_view.
* extension.h: Include "common/array-view.h".
(xmethod_worker::invoke): Adjust to use gdb::array_view.
(xmethod_worker::get_arg_types): Adjust to return an std::vector.
(xmethod_worker::get_result_type): Adjust to use gdb::array_view.
(xmethod_worker::do_get_arg_types): Adjust to use std::vector.
(xmethod_worker::do_get_result_type): Adjust to use
gdb::array_view.
* gdbtypes.c (rank_function): Adjust to use gdb::array_view.
* gdbtypes.h: Include "common/array-view.h".
(rank_function): Adjust to use gdb::array_view.
* python/py-xmethods.c (python_xmethod_worker::invoke)
(python_xmethod_worker::do_get_arg_types)
(python_xmethod_worker::do_get_result_type)
(python_xmethod_worker::invoke): Adjust to new interfaces.
* valarith.c (value_user_defined_cpp_op, value_user_defined_op)
(value_x_binop, value_x_unop): Adjust to use gdb::array_view.
* valops.c (find_overload_match, find_oload_champ_namespace)
(find_oload_champ_namespace_loop, find_oload_champ): Adjust to use
gdb:array_view and the new xmethod_worker interfaces.
* value.c (result_type_of_xmethod, call_xmethod): Adjust to use
gdb::array_view.
* value.h (find_overload_match, result_type_of_xmethod)
(call_xmethod): Adjust to use gdb::array_view.
* unittests/array-view-selftests.c: Add slicing tests.
Diffstat (limited to 'gdb/valarith.c')
-rw-r--r-- | gdb/valarith.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/gdb/valarith.c b/gdb/valarith.c index 875f547..3a59ada 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -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<value *> 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<value *> 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<value *> 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<value *> argvec = argvec_storage; + argvec[1] = value_addr (arg1); argvec[2] = 0; @@ -584,16 +585,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 +602,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 +619,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); |