* serial.h (SERIAL_SET_TTY_STATE): Comment return value.
[deliverable/binutils-gdb.git] / gdb / eval.c
index 98774bfc419f2e6a54fb531f43b94ebb60ba6af9..a5a831569b28b19d70996f452a32a0cc4a13b79b 100644 (file)
@@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "expression.h"
 #include "target.h"
 #include "frame.h"
+#include "demangle.h"
 #include "language.h"  /* For CAST_IS_CONVERSION */
 
 /* Values of NOSIDE argument to eval_subexp.  */
@@ -163,8 +164,8 @@ evaluate_subexp (expect_type, exp, pos, noside)
 {
   enum exp_opcode op;
   int tem, tem2, tem3;
-  register int pc, pc2, oldpos;
-  register value arg1, arg2, arg3;
+  register int pc, pc2 = 0, oldpos;
+  register value arg1 = NULL, arg2 = NULL, arg3;
   struct type *type;
   int nargs;
   value *argvec;
@@ -197,12 +198,12 @@ evaluate_subexp (expect_type, exp, pos, noside)
                                exp->elts[pc + 2].doubleconst);
 
     case OP_VAR_VALUE:
-      (*pos) += 2;
+      (*pos) += 3;
       if (noside == EVAL_SKIP)
        goto nosideret;
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
-         struct symbol * sym = exp->elts[pc + 1].symbol;
+         struct symbol * sym = exp->elts[pc + 2].symbol;
          enum lval_type lv;
 
          switch (SYMBOL_CLASS (sym))
@@ -226,7 +227,8 @@ evaluate_subexp (expect_type, exp, pos, noside)
          return value_zero (SYMBOL_TYPE (sym), lv);
        }
       else
-       return value_of_variable (exp->elts[pc + 1].symbol);
+       return value_of_variable (exp->elts[pc + 2].symbol,
+                                 exp->elts[pc + 1].block);
 
     case OP_LAST:
       (*pos) += 2;
@@ -373,6 +375,20 @@ evaluate_subexp (expect_type, exp, pos, noside)
 
          if (op == STRUCTOP_STRUCT)
            {
+             /* If v is a variable in a register, and the user types
+                v.method (), this will produce an error, because v has
+                no address.
+
+                A possible way around this would be to allocate a
+                copy of the variable on the stack, copy in the
+                contents, call the function, and copy out the
+                contents.  I.e. convert this from call by reference
+                to call by copy-return (or whatever it's called).
+                However, this does not work because it is not the
+                same: the method being called could stash a copy of
+                the address, and then future uses through that address
+                (after the method returns) would be expected to
+                use the variable itself, not some copy of it.  */
              arg2 = evaluate_subexp_for_address (exp, pos, noside);
            }
          else
@@ -401,19 +417,50 @@ evaluate_subexp (expect_type, exp, pos, noside)
        {
          int static_memfuncp;
          value temp = arg2;
+         char tstr[15], mangle_tstr[15], *ptr, *mangle_ptr;
+         char *pp;
 
          argvec[1] = arg2;
-         argvec[0] =
-           value_struct_elt (&temp, argvec+1, &exp->elts[pc2 + 2].string,
+         argvec[0] = 0;
+         strcpy(tstr, &exp->elts[pc2+2].string);
+         if (!strncmp(tstr, "operator", 8))
+           {
+              ptr = &tstr[8];
+              strcpy(mangle_tstr, "__");
+              mangle_ptr = &mangle_tstr[2];
+              pp = cplus_mangle_opname(ptr, DMGL_ANSI);
+              if (pp) 
+                strcpy(mangle_ptr, pp);
+              else
+                strcpy(mangle_ptr, ptr);
+              argvec[0] =
+                value_struct_elt (&temp, argvec+1, mangle_tstr,
                              &static_memfuncp,
                              op == STRUCTOP_STRUCT
                              ? "structure" : "structure pointer");
-         if (VALUE_OFFSET (temp))
+              if (!argvec[0]) 
+                {
+                   pp = cplus_mangle_opname(ptr, DMGL_NO_OPTS);
+                   if (pp) 
+                     strcpy(mangle_ptr, pp);
+                   else
+                     strcpy(mangle_ptr, ptr);
+                   strcpy(tstr, mangle_tstr);
+                }
+           }
+          if (!argvec[0]) 
            {
-             arg2 = value_from_longest (lookup_pointer_type (VALUE_TYPE (temp)),
-                                        VALUE_ADDRESS (temp)+VALUE_OFFSET (temp));
-             argvec[1] = arg2;
+             temp = arg2;
+             argvec[0] =
+             value_struct_elt (&temp, argvec+1, tstr,
+                             &static_memfuncp,
+                             op == STRUCTOP_STRUCT
+                             ? "structure" : "structure pointer");
            }
+         arg2 = value_from_longest (lookup_pointer_type(VALUE_TYPE (temp)),
+                        VALUE_ADDRESS (temp)+VALUE_OFFSET (temp));
+         argvec[1] = arg2;
+
          if (static_memfuncp)
            {
              argvec[1] = argvec[0];
@@ -1041,14 +1088,14 @@ evaluate_subexp_for_address (exp, pos, noside)
                         evaluate_subexp (NULL_TYPE, exp, pos, noside));
 
     case OP_VAR_VALUE:
-      var = exp->elts[pc + 1].symbol;
+      var = exp->elts[pc + 2].symbol;
 
       /* C++: The "address" of a reference should yield the address
        * of the object pointed to. Let value_addr() deal with it. */
       if (TYPE_CODE (SYMBOL_TYPE (var)) == TYPE_CODE_REF)
         goto default_case;
 
-      (*pos) += 3;
+      (*pos) += 4;
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
          struct type *type =
@@ -1065,7 +1112,10 @@ evaluate_subexp_for_address (exp, pos, noside)
          value_zero (type, not_lval);
        }
       else
-       return locate_var_value (var, (FRAME) 0);
+       return
+         locate_var_value
+           (var,
+            block_innermost_frame (exp->elts[pc + 1].block));
 
     default:
     default_case:
@@ -1085,14 +1135,15 @@ evaluate_subexp_for_address (exp, pos, noside)
 /* Evaluate like `evaluate_subexp' except coercing arrays to pointers.
    When used in contexts where arrays will be coerced anyway, this is
    equivalent to `evaluate_subexp' but much faster because it avoids
-   actually fetching array contents.
+   actually fetching array contents (perhaps obsolete now that we have
+   VALUE_LAZY).
 
    Note that we currently only do the coercion for C expressions, where
    arrays are zero based and the coercion is correct.  For other languages,
    with nonzero based arrays, coercion loses.  Use CAST_IS_CONVERSION
    to decide if coercion is appropriate.
 
-  */
+   */
 
 static value
 evaluate_subexp_with_coercion (exp, pos, noside)
@@ -1111,17 +1162,21 @@ evaluate_subexp_with_coercion (exp, pos, noside)
   switch (op)
     {
     case OP_VAR_VALUE:
-      var = exp->elts[pc + 1].symbol;
+      var = exp->elts[pc + 2].symbol;
       if (TYPE_CODE (SYMBOL_TYPE (var)) == TYPE_CODE_ARRAY
          && CAST_IS_CONVERSION)
        {
-         (*pos) += 3;
-         val = locate_var_value (var, (FRAME) 0);
+         (*pos) += 4;
+         val =
+           locate_var_value
+             (var, block_innermost_frame (exp->elts[pc + 1].block));
          return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (SYMBOL_TYPE (var))),
                             val);
        }
-      default:
-       return evaluate_subexp (NULL_TYPE, exp, pos, noside);
+      /* FALLTHROUGH */
+
+    default:
+      return evaluate_subexp (NULL_TYPE, exp, pos, noside);
     }
 }
 
@@ -1159,9 +1214,11 @@ evaluate_subexp_for_sizeof (exp, pos)
                              (LONGEST) TYPE_LENGTH (exp->elts[pc + 1].type));
 
     case OP_VAR_VALUE:
-      (*pos) += 3;
-      return value_from_longest (builtin_type_int,
-        (LONGEST) TYPE_LENGTH (SYMBOL_TYPE (exp->elts[pc + 1].symbol)));
+      (*pos) += 4;
+      return
+       value_from_longest
+         (builtin_type_int,
+          (LONGEST) TYPE_LENGTH (SYMBOL_TYPE (exp->elts[pc + 2].symbol)));
 
     default:
       val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS);
This page took 0.025376 seconds and 4 git commands to generate.