aboutsummaryrefslogtreecommitdiff
path: root/gdb/values.c
diff options
context:
space:
mode:
authorFred Fish <fnf@specifix.com>2001-12-10 23:05:00 +0000
committerFred Fish <fnf@specifix.com>2001-12-10 23:05:00 +0000
commit0478d61cc28c9072f5261920744b734d17202862 (patch)
tree340c7f5f7aa4679cbbdaea49b8bd3fcded0926ba /gdb/values.c
parent709ec538af69bad6c603acc9b985aa900fea0ff2 (diff)
downloadgdb-0478d61cc28c9072f5261920744b734d17202862.zip
gdb-0478d61cc28c9072f5261920744b734d17202862.tar.gz
gdb-0478d61cc28c9072f5261920744b734d17202862.tar.bz2
Approved by Jim Blandy:
2001-12-10 Fred Fish <fnf@redhat.com> * values.c (value_fn_field): Add physname variable. Use a minimal symbol if we don't find a full symbol. Remove setting of the new value's type since that was already done by allocate_value(). Remove obsolete commented out error call since callees need to handle a NULL return, which is possible result not an error. * eval.c (evaluate_subexp_standard): Move check for inlined functions to precede attempt to dereference a NULL argvec[0].
Diffstat (limited to 'gdb/values.c')
-rw-r--r--gdb/values.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/gdb/values.c b/gdb/values.c
index 5647097..b8407e1 100644
--- a/gdb/values.c
+++ b/gdb/values.c
@@ -954,7 +954,11 @@ value_field (register value_ptr arg1, register int fieldno)
/* Return a non-virtual function as a value.
F is the list of member functions which contains the desired method.
- J is an index into F which provides the desired method. */
+ J is an index into F which provides the desired method.
+
+ We only use the symbol for its address, so be happy with either a
+ full symbol or a minimal symbol.
+ */
value_ptr
value_fn_field (value_ptr *arg1p, struct fn_field *f, int j, struct type *type,
@@ -962,20 +966,28 @@ value_fn_field (value_ptr *arg1p, struct fn_field *f, int j, struct type *type,
{
register value_ptr v;
register struct type *ftype = TYPE_FN_FIELD_TYPE (f, j);
+ char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
struct symbol *sym;
+ struct minimal_symbol *msym;
- sym = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, j),
- 0, VAR_NAMESPACE, 0, NULL);
+ sym = lookup_symbol (physname, 0, VAR_NAMESPACE, 0, NULL);
if (!sym)
+ {
+ msym = lookup_minimal_symbol (physname, NULL, NULL);
+ }
+
+ if (!sym && !msym)
return NULL;
-/*
- error ("Internal error: could not find physical method named %s",
- TYPE_FN_FIELD_PHYSNAME (f, j));
- */
v = allocate_value (ftype);
- VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
- VALUE_TYPE (v) = ftype;
+ if (sym)
+ {
+ VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
+ }
+ else
+ {
+ VALUE_ADDRESS (v) = SYMBOL_VALUE_ADDRESS (msym);
+ }
if (arg1p)
{