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].
This commit is contained in:
parent
709ec538af
commit
0478d61cc2
3 changed files with 33 additions and 11 deletions
|
@ -1,3 +1,13 @@
|
|||
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].
|
||||
|
||||
2001-12-10 Fred Fish <fnf@redhat.com>
|
||||
|
||||
* arm-linux-tdep.c (skip_hurd_resolver): Use NULL rather than
|
||||
|
|
|
@ -917,6 +917,8 @@ evaluate_subexp_standard (struct type *expect_type,
|
|||
|
||||
if (noside == EVAL_SKIP)
|
||||
goto nosideret;
|
||||
if (argvec[0] == NULL)
|
||||
error ("Cannot evaluate function -- may be inlined");
|
||||
if (noside == EVAL_AVOID_SIDE_EFFECTS)
|
||||
{
|
||||
/* If the return type doesn't look like a function type, call an
|
||||
|
@ -934,8 +936,6 @@ evaluate_subexp_standard (struct type *expect_type,
|
|||
else
|
||||
error ("Expression of type other than \"Function returning ...\" used as function");
|
||||
}
|
||||
if (argvec[0] == NULL)
|
||||
error ("Cannot evaluate function -- may be inlined");
|
||||
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 */
|
||||
|
||||
|
|
30
gdb/values.c
30
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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue