aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2020-12-15 17:53:34 -0700
committerTom Tromey <tom@tromey.com>2020-12-15 17:53:34 -0700
commit1ab8280d7dbe01f51929d221621d38450f31895d (patch)
tree6ae791784db83a48b4cf9877e4f2a1ee481d3c92
parentcf608cc40c523537046efde52e9d68303e8bde00 (diff)
downloadgdb-1ab8280d7dbe01f51929d221621d38450f31895d.zip
gdb-1ab8280d7dbe01f51929d221621d38450f31895d.tar.gz
gdb-1ab8280d7dbe01f51929d221621d38450f31895d.tar.bz2
Clean up arguments to evaluate_subexp_do_call
I noticed hat evaluate_subexp_do_call takes an array of arguments and a count -- but, unlike the usual convention, the count does not include the first element. This patch changes this function to match call_function_by_hand -- passing the callee separately, and using an array_view for the arguments. This makes it simpler to understand. Regression tested on x86-64 Fedora 28. gdb/ChangeLog 2020-12-15 Tom Tromey <tom@tromey.com> * f-lang.c (evaluate_subexp_f): Update. * expression.h (evaluate_subexp_do_call): Update. * eval.c (evaluate_subexp_do_call): Add callee parameter. Replace nargs, argvec with array_view. (evaluate_funcall): Update.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/eval.c26
-rw-r--r--gdb/expression.h7
-rw-r--r--gdb/f-lang.c6
4 files changed, 28 insertions, 19 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5f2c5b8..464054c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2020-12-15 Tom Tromey <tom@tromey.com>
+ * f-lang.c (evaluate_subexp_f): Update.
+ * expression.h (evaluate_subexp_do_call): Update.
+ * eval.c (evaluate_subexp_do_call): Add callee parameter. Replace
+ nargs, argvec with array_view.
+ (evaluate_funcall): Update.
+
+2020-12-15 Tom Tromey <tom@tromey.com>
+
* ada-lang.c (num_component_specs): Remove.
(assign_aggregate): Update.
(aggregate_assign_positional, aggregate_assign_from_choices)
diff --git a/gdb/eval.c b/gdb/eval.c
index 3f58769..6066a32 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -692,11 +692,12 @@ eval_skip_value (expression *exp)
value *
evaluate_subexp_do_call (expression *exp, enum noside noside,
- int nargs, value **argvec,
+ value *callee,
+ gdb::array_view<value *> argvec,
const char *function_name,
type *default_return_type)
{
- if (argvec[0] == NULL)
+ if (callee == NULL)
error (_("Cannot evaluate function -- may be inlined"));
if (noside == EVAL_AVOID_SIDE_EFFECTS)
{
@@ -704,7 +705,7 @@ evaluate_subexp_do_call (expression *exp, enum noside noside,
call an error. This can happen if somebody tries to turn
a variable into a function call. */
- type *ftype = value_type (argvec[0]);
+ type *ftype = value_type (callee);
if (ftype->code () == TYPE_CODE_INTERNAL_FUNCTION)
{
@@ -716,10 +717,7 @@ evaluate_subexp_do_call (expression *exp, enum noside noside,
}
else if (ftype->code () == TYPE_CODE_XMETHOD)
{
- type *return_type
- = result_type_of_xmethod (argvec[0],
- gdb::make_array_view (argvec + 1,
- nargs));
+ type *return_type = result_type_of_xmethod (callee, argvec);
if (return_type == NULL)
error (_("Xmethod is missing return type."));
@@ -730,7 +728,7 @@ evaluate_subexp_do_call (expression *exp, enum noside noside,
{
if (ftype->is_gnu_ifunc ())
{
- CORE_ADDR address = value_address (argvec[0]);
+ CORE_ADDR address = value_address (callee);
type *resolved_type = find_gnu_ifunc_target_type (address);
if (resolved_type != NULL)
@@ -751,16 +749,15 @@ evaluate_subexp_do_call (expression *exp, enum noside noside,
error (_("Expression of type other than "
"\"Function returning ...\" used as function"));
}
- switch (value_type (argvec[0])->code ())
+ switch (value_type (callee)->code ())
{
case TYPE_CODE_INTERNAL_FUNCTION:
return call_internal_function (exp->gdbarch, exp->language_defn,
- argvec[0], nargs, argvec + 1);
+ callee, argvec.size (), argvec.data ());
case TYPE_CODE_XMETHOD:
- return call_xmethod (argvec[0], gdb::make_array_view (argvec + 1, nargs));
+ return call_xmethod (callee, argvec);
default:
- return call_function_by_hand (argvec[0], default_return_type,
- gdb::make_array_view (argvec + 1, nargs));
+ return call_function_by_hand (callee, default_return_type, argvec);
}
}
@@ -1165,7 +1162,8 @@ evaluate_funcall (type *expect_type, expression *exp, int *pos,
/* Nothing to be done; argvec already correctly set up. */
}
- return evaluate_subexp_do_call (exp, noside, nargs, argvec,
+ return evaluate_subexp_do_call (exp, noside, argvec[0],
+ gdb::make_array_view (argvec + 1, nargs),
var_func_name, expect_type);
}
diff --git a/gdb/expression.h b/gdb/expression.h
index 9ac940f..0c4dc7b 100644
--- a/gdb/expression.h
+++ b/gdb/expression.h
@@ -153,15 +153,16 @@ enum noside
extern struct value *evaluate_subexp_standard
(struct type *, struct expression *, int *, enum noside);
-/* Evaluate a function call. The function to be called is in ARGVEC[0] and
- the arguments passed to the function are in ARGVEC[1..NARGS].
+/* Evaluate a function call. The function to be called is in CALLEE and
+ the arguments passed to the function are in ARGVEC.
FUNCTION_NAME is the name of the function, if known.
DEFAULT_RETURN_TYPE is used as the function's return type if the return
type is unknown. */
extern struct value *evaluate_subexp_do_call (expression *exp,
enum noside noside,
- int nargs, value **argvec,
+ value *callee,
+ gdb::array_view<value *> argvec,
const char *function_name,
type *default_return_type);
diff --git a/gdb/f-lang.c b/gdb/f-lang.c
index bbece50..28a66fd 100644
--- a/gdb/f-lang.c
+++ b/gdb/f-lang.c
@@ -947,8 +947,10 @@ evaluate_subexp_f (struct type *expect_type, struct expression *exp,
argvec[tem] = 0; /* signal end of arglist */
if (noside == EVAL_SKIP)
return eval_skip_value (exp);
- return evaluate_subexp_do_call (exp, noside, nargs, argvec, NULL,
- expect_type);
+ return evaluate_subexp_do_call (exp, noside, argvec[0],
+ gdb::make_array_view (argvec + 1,
+ nargs),
+ NULL, expect_type);
}
default: