Approved by Jim Blandy:
authorFred Fish <fnf@specifix.com>
Mon, 10 Dec 2001 23:05:00 +0000 (23:05 +0000)
committerFred Fish <fnf@specifix.com>
Mon, 10 Dec 2001 23:05:00 +0000 (23:05 +0000)
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].

gdb/ChangeLog
gdb/eval.c
gdb/values.c

index c0363dfc54d565052f5fff4cf3fc7ddc0882b27a..6dc2b7700529ca0fccaf45e17074fb80fc2b266a 100644 (file)
@@ -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
index c15b236568cda2fbd09fa0f09b15ebe85fbeb4fb..8a41d30c9cf60df29d3451408b720526f312a83e 100644 (file)
@@ -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  */
 
index 5647097e1b906e6d511199e2fcc87061bf6f1111..b8407e123fb056b4fdd6ad5a2594ef967637bea7 100644 (file)
@@ -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)
     {