summaryrefslogtreecommitdiff
path: root/gdb/eval.c
diff options
context:
space:
mode:
authorPeter Schauer <pes@regent.e-technik.tu-muenchen.de>2002-03-16 20:51:44 +0000
committerPeter Schauer <pes@regent.e-technik.tu-muenchen.de>2002-03-16 20:51:44 +0000
commitd79c37e269ca88410f8bbad1d98c699368b73402 (patch)
tree6e81a445e2005ee595dcbf3e656a0eb8f44f8438 /gdb/eval.c
parent0db2e879c642b7addb85009ec6d36b10725a874c (diff)
downloadgdb-d79c37e269ca88410f8bbad1d98c699368b73402.tar.gz
* eval.c (evaluate_subexp_standard): Fix setup of ``this'' pointer
for method resolution. Restore adjustment of ``this'' pointer after calling value_struct_elt, which was accidentally removed during the HP merge.
Diffstat (limited to 'gdb/eval.c')
-rw-r--r--gdb/eval.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/gdb/eval.c b/gdb/eval.c
index 0b42a584cf8..4b2d9b85872 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1,6 +1,6 @@
/* Evaluate expressions for GDB.
Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
- 1996, 1997, 1998, 1999, 2000, 2001
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
This file is part of GDB.
@@ -820,15 +820,10 @@ evaluate_subexp_standard (struct type *expect_type,
if (op == STRUCTOP_STRUCT || op == STRUCTOP_PTR)
{
int static_memfuncp;
- struct value *temp = arg2;
char tstr[256];
/* Method invocation : stuff "this" as first parameter */
- /* pai: this used to have lookup_pointer_type for some reason,
- * but temp is already a pointer to the object */
- argvec[1]
- = value_from_pointer (VALUE_TYPE (temp),
- VALUE_ADDRESS (temp) + VALUE_OFFSET (temp));
+ argvec[1] = arg2;
/* Name of method from expression */
strcpy (tstr, &exp->elts[pc2 + 2].string);
@@ -854,11 +849,17 @@ evaluate_subexp_standard (struct type *expect_type,
else
/* Non-C++ case -- or no overload resolution */
{
- temp = arg2;
+ struct value *temp = arg2;
argvec[0] = value_struct_elt (&temp, argvec + 1, tstr,
&static_memfuncp,
op == STRUCTOP_STRUCT
? "structure" : "structure pointer");
+ /* value_struct_elt updates temp with the correct value
+ of the ``this'' pointer if necessary, so modify argvec[1] to
+ reflect any ``this'' changes. */
+ arg2 = value_from_longest (lookup_pointer_type(VALUE_TYPE (temp)),
+ VALUE_ADDRESS (temp) + VALUE_OFFSET (temp)
+ + VALUE_EMBEDDED_OFFSET (temp));
argvec[1] = arg2; /* the ``this'' pointer */
}