* config/tc-fr30.c (md_parse_option <c,arg>): Add ATTRIBUTE_UNUSED.
[deliverable/binutils-gdb.git] / gdb / eval.c
index 3b1a06c94cbf03185abf83ba5306c5eaa8280ff3..65631752d6714b9c4f19f3b15f78f9994cf013aa 100644 (file)
@@ -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.
@@ -78,7 +78,7 @@ parse_and_eval_address (char *exp)
   struct expression *expr = parse_expression (exp);
   register CORE_ADDR addr;
   register struct cleanup *old_chain =
-  make_cleanup (free_current_contents, &expr);
+    make_cleanup (free_current_contents, &expr);
 
   addr = value_as_address (evaluate_expression (expr));
   do_cleanups (old_chain);
@@ -94,7 +94,7 @@ parse_and_eval_address_1 (char **expptr)
   struct expression *expr = parse_exp_1 (expptr, (struct block *) 0, 0);
   register CORE_ADDR addr;
   register struct cleanup *old_chain =
-  make_cleanup (free_current_contents, &expr);
+    make_cleanup (free_current_contents, &expr);
 
   addr = value_as_address (evaluate_expression (expr));
   do_cleanups (old_chain);
@@ -121,8 +121,8 @@ parse_and_eval (char *exp)
 {
   struct expression *expr = parse_expression (exp);
   struct value *val;
-  register struct cleanup *old_chain
-  = make_cleanup (free_current_contents, &expr);
+  register struct cleanup *old_chain =
+    make_cleanup (free_current_contents, &expr);
 
   val = evaluate_expression (expr);
   do_cleanups (old_chain);
@@ -138,8 +138,8 @@ parse_to_comma_and_eval (char **expp)
 {
   struct expression *expr = parse_exp_1 (expp, (struct block *) 0, 1);
   struct value *val;
-  register struct cleanup *old_chain
-  = make_cleanup (free_current_contents, &expr);
+  register struct cleanup *old_chain =
+    make_cleanup (free_current_contents, &expr);
 
   val = evaluate_expression (expr);
   do_cleanups (old_chain);
@@ -186,8 +186,8 @@ get_label (register struct expression *exp, int *pos)
     return NULL;
 }
 
-/* This function evaluates tuples (in Chill) or brace-initializers
-   (in C/C++) for structure types.  */
+/* This function evaluates tuples (in (OBSOLETE) Chill) or
+   brace-initializers (in C/C++) for structure types.  */
 
 static struct value *
 evaluate_struct_tuple (struct value *struct_val,
@@ -325,13 +325,11 @@ evaluate_struct_tuple (struct value *struct_val,
   return struct_val;
 }
 
-/* Recursive helper function for setting elements of array tuples for Chill.
-   The target is ARRAY (which has bounds LOW_BOUND to HIGH_BOUND);
-   the element value is ELEMENT;
-   EXP, POS and NOSIDE are as usual.
-   Evaluates index expresions and sets the specified element(s) of
-   ARRAY to ELEMENT.
-   Returns last index value.  */
+/* Recursive helper function for setting elements of array tuples for
+   (OBSOLETE) Chill.  The target is ARRAY (which has bounds LOW_BOUND
+   to HIGH_BOUND); the element value is ELEMENT; EXP, POS and NOSIDE
+   are as usual.  Evaluates index expresions and sets the specified
+   element(s) of ARRAY to ELEMENT.  Returns last index value.  */
 
 static LONGEST
 init_array_element (struct value *array, struct value *element,
@@ -447,11 +445,11 @@ evaluate_subexp_standard (struct type *expect_type,
     case OP_REGISTER:
       {
        int regno = longest_to_int (exp->elts[pc + 1].longconst);
-       struct value *val = value_of_register (regno);
-
+       struct value *val = value_of_register (regno, deprecated_selected_frame);
        (*pos) += 2;
        if (val == NULL)
-         error ("Value of register %s not available.", REGISTER_NAME (regno));
+         error ("Value of register %s not available.",
+                frame_map_regnum_to_name (regno));
        else
          return val;
       }
@@ -620,7 +618,7 @@ evaluate_subexp_standard (struct type *expect_type,
          return set;
        }
 
-      argvec = (value_ptr *) alloca (sizeof (value_ptr) * nargs);
+      argvec = (struct value **) alloca (sizeof (struct value *) * nargs);
       for (tem = 0; tem < nargs; tem++)
        {
          /* Ensure that array expressions are coerced into pointer objects. */
@@ -673,7 +671,7 @@ evaluate_subexp_standard (struct type *expect_type,
       nargs = longest_to_int (exp->elts[pc + 1].longconst);
       /* Allocate arg vector, including space for the function to be
          called in argvec[0] and a terminating NULL */
-      argvec = (value_ptr *) alloca (sizeof (value_ptr) * (nargs + 3));
+      argvec = (struct value **) alloca (sizeof (struct value *) * (nargs + 3));
       if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR)
        {
          LONGEST fnptr;
@@ -821,15 +819,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);
 
@@ -839,13 +832,13 @@ evaluate_subexp_standard (struct type *expect_type,
              struct value *valp = NULL;
 
              /* Prepare list of argument types for overload resolution */
-             arg_types = (struct type **) xmalloc (nargs * (sizeof (struct type *)));
+             arg_types = (struct type **) alloca (nargs * (sizeof (struct type *)));
              for (ix = 1; ix <= nargs; ix++)
                arg_types[ix - 1] = VALUE_TYPE (argvec[ix]);
 
              (void) find_overload_match (arg_types, nargs, tstr,
                                     1 /* method */ , 0 /* strict match */ ,
-                                         arg2 /* the object */ , NULL,
+                                         &arg2 /* the object */ , NULL,
                                          &valp, NULL, &static_memfuncp);
 
 
@@ -855,11 +848,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 */
            }
 
@@ -888,7 +887,7 @@ evaluate_subexp_standard (struct type *expect_type,
              struct symbol *symp;
 
              /* Prepare list of argument types for overload resolution */
-             arg_types = (struct type **) xmalloc (nargs * (sizeof (struct type *)));
+             arg_types = (struct type **) alloca (nargs * (sizeof (struct type *)));
              for (ix = 1; ix <= nargs; ix++)
                arg_types[ix - 1] = VALUE_TYPE (argvec[ix]);
 
@@ -917,6 +916,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 +935,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  */
 
@@ -969,7 +968,7 @@ evaluate_subexp_standard (struct type *expect_type,
          /* It's a function call. */
          /* Allocate arg vector, including space for the function to be
             called in argvec[0] and a terminating NULL */
-         argvec = (value_ptr *) alloca (sizeof (value_ptr) * (nargs + 2));
+         argvec = (struct value **) alloca (sizeof (struct value *) * (nargs + 2));
          argvec[0] = arg1;
          tem = 1;
          for (; tem <= nargs; tem++)
This page took 0.026534 seconds and 4 git commands to generate.