aboutsummaryrefslogtreecommitdiff
path: root/gdb/eval.c
diff options
context:
space:
mode:
authorSiva Chandra <sivachandra@chromium.org>2014-05-20 06:41:39 -0700
committerSiva Chandra <sivachandra@chromium.org>2014-06-03 09:54:21 -0700
commit233e8b28cf7b548ca197a7a6d9bf5f9ce80053ac (patch)
treecfd187d00cfc805f22d8e1d4736413e742e7a3cf /gdb/eval.c
parente81e7f5e38bf0da52d9e88a94e4df9aeecd80357 (diff)
downloadgdb-233e8b28cf7b548ca197a7a6d9bf5f9ce80053ac.zip
gdb-233e8b28cf7b548ca197a7a6d9bf5f9ce80053ac.tar.gz
gdb-233e8b28cf7b548ca197a7a6d9bf5f9ce80053ac.tar.bz2
Lookup and invoke debug methods of C++ classes if they are the best match.
* eval.c (evaluate_subexp_standard): Call the xmethod if the best match method returned by find_overload_match is an xmethod. * valarith.c (value_x_binop, value_x_unop): Call the xmethod if the best matching operator returned by find_overload_match is an xmethod. * valops.c: #include "extension.h". (find_method_list): Add "fn_list" and "xm_worker_vec" arguments. Return void. The list of matching source methods is returned in "fn_list" and a vector of matching debug method workers is returned in "xm_worker_vec". Update all callers. (value_find_oload_method_list): Likewise. (find_oload_champ): Add "xm_worker_vec" parameter. If it is non-NULL, then the index of the best matching method in this vector is returned. Update all callers. (find_overload_match): Include xmethods while performing overload resolution.
Diffstat (limited to 'gdb/eval.c')
-rw-r--r--gdb/eval.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/gdb/eval.c b/gdb/eval.c
index 14bf6f7..d374b6a 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1765,11 +1765,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. */