Mon Dec 21 12:40:10 1992 Ian Lance Taylor (ian@cygnus.com)
[binutils-gdb.git] / gdb / eval.c
index 9aa3f61fd3385cb71714bb185e81c221fc8c8f39..7f2ac9d0f62052bda4cfeb47ec5a5e6f11f78926 100644 (file)
@@ -174,22 +174,22 @@ evaluate_subexp (expect_type, exp, pos, noside)
   switch (op)
     {
     case OP_SCOPE:
-      tem = strlen (&exp->elts[pc + 2].string);
-      (*pos) += 3 + ((tem + sizeof (union exp_element))
+      tem = longest_to_int (exp->elts[pc + 2].longconst);
+      (*pos) += 4 + ((tem + sizeof (union exp_element))
                     / sizeof (union exp_element));
       arg1 = value_struct_elt_for_reference (exp->elts[pc + 1].type,
                                             0,
                                             exp->elts[pc + 1].type,
-                                            &exp->elts[pc + 2].string,
+                                            &exp->elts[pc + 3].string,
                                             expect_type);
       if (arg1 == NULL)
-       error ("There is no field named %s", &exp->elts[pc + 2].string);
+       error ("There is no field named %s", &exp->elts[pc + 3].string);
       return arg1;
 
     case OP_LONG:
       (*pos) += 3;
       return value_from_longest (exp->elts[pc + 1].type,
-                             exp->elts[pc + 2].longconst);
+                                exp->elts[pc + 2].longconst);
 
     case OP_DOUBLE:
       (*pos) += 3;
@@ -237,22 +237,29 @@ evaluate_subexp (expect_type, exp, pos, noside)
       (*pos) += 2;
       return value_of_register (longest_to_int (exp->elts[pc + 1].longconst));
 
+    /* start-sanitize-chill */
+    case OP_BOOL:
+      (*pos) += 2;
+      return value_from_longest (builtin_type_chill_bool,
+                                exp->elts[pc + 1].longconst);
+    /* end-sanitize-chill */
+
     case OP_INTERNALVAR:
       (*pos) += 2;
       return value_of_internalvar (exp->elts[pc + 1].internalvar);
 
     case OP_STRING:
-      tem = strlen (&exp->elts[pc + 1].string);
-      (*pos) += 2 + ((tem + sizeof (union exp_element))
+      tem = longest_to_int (exp->elts[pc + 1].longconst);
+      (*pos) += 3 + ((tem + sizeof (union exp_element))
                     / sizeof (union exp_element));
       if (noside == EVAL_SKIP)
        goto nosideret;
-      return value_string (&exp->elts[pc + 1].string, tem);
+      return value_string (&exp->elts[pc + 2].string, tem);
 
     case TERNOP_COND:
       /* Skip third and second args to evaluate the first one.  */
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
-      if (value_zerop (arg1))
+      if (value_logical_not (arg1))
        {
          evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
          return evaluate_subexp (NULL_TYPE, exp, pos, noside);
@@ -296,39 +303,34 @@ evaluate_subexp (expect_type, exp, pos, noside)
          arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
 
          fnptr = longest_to_int (value_as_long (arg1));
-         /* FIXME-tiemann: this is way obsolete.  */
-         if (fnptr < 128)
+
+         if (METHOD_PTR_IS_VIRTUAL(fnptr))
            {
+             int fnoffset = METHOD_PTR_TO_VOFFSET(fnptr);
              struct type *basetype;
+             struct type *domain_type =
+                 TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)));
              int i, j;
              basetype = TYPE_TARGET_TYPE (VALUE_TYPE (arg2));
-             basetype = TYPE_VPTR_BASETYPE (basetype);
+             if (domain_type != basetype)
+                 arg2 = value_cast(lookup_pointer_type (domain_type), arg2);
+             basetype = TYPE_VPTR_BASETYPE (domain_type);
              for (i = TYPE_NFN_FIELDS (basetype) - 1; i >= 0; i--)
                {
                  struct fn_field *f = TYPE_FN_FIELDLIST1 (basetype, i);
                  /* If one is virtual, then all are virtual.  */
                  if (TYPE_FN_FIELD_VIRTUAL_P (f, 0))
                    for (j = TYPE_FN_FIELDLIST_LENGTH (basetype, i) - 1; j >= 0; --j)
-                     if (TYPE_FN_FIELD_VOFFSET (f, j) == fnptr)
+                     if (TYPE_FN_FIELD_VOFFSET (f, j) == fnoffset)
                        {
-                         value vtbl;
-                         value base = value_ind (arg2);
-                         struct type *fntype = lookup_pointer_type (TYPE_FN_FIELD_TYPE (f, j));
-
-                         if (TYPE_VPTR_FIELDNO (basetype) < 0)
-                           fill_in_vptr_fieldno (basetype);
-
-                         VALUE_TYPE (base) = basetype;
-                         vtbl = value_field (base, TYPE_VPTR_FIELDNO (basetype));
-                         VALUE_TYPE (vtbl) = lookup_pointer_type (fntype);
-                         VALUE_TYPE (arg1) = builtin_type_int;
-                         arg1 = value_subscript (vtbl, arg1);
-                         VALUE_TYPE (arg1) = fntype;
+                         value temp = value_ind (arg2);
+                         arg1 = value_virtual_fn_field (&temp, f, j, domain_type, 0);
+                         arg2 = value_addr (temp);
                          goto got_it;
                        }
                }
              if (i < 0)
-               error ("virtual function at index %d not found", fnptr);
+               error ("virtual function at index %d not found", fnoffset);
            }
          else
            {
@@ -347,8 +349,8 @@ evaluate_subexp (expect_type, exp, pos, noside)
          nargs = longest_to_int (exp->elts[pc + 1].longconst) + 1;
          /* First, evaluate the structure into arg2 */
          pc2 = (*pos)++;
-         tem2 = strlen (&exp->elts[pc2 + 1].string);
-         *pos += 2 + (tem2 + sizeof (union exp_element)) / sizeof (union exp_element);
+         tem2 = longest_to_int (exp->elts[pc2 + 1].longconst);
+         *pos += 3 + (tem2 + sizeof (union exp_element)) / sizeof (union exp_element);
          if (noside == EVAL_SKIP)
            goto nosideret;
 
@@ -383,7 +385,7 @@ evaluate_subexp (expect_type, exp, pos, noside)
 
          argvec[1] = arg2;
          argvec[0] =
-           value_struct_elt (&temp, argvec+1, &exp->elts[pc2 + 1].string,
+           value_struct_elt (&temp, argvec+1, &exp->elts[pc2 + 2].string,
                              &static_memfuncp,
                              op == STRUCTOP_STRUCT
                              ? "structure" : "structure pointer");
@@ -428,40 +430,40 @@ evaluate_subexp (expect_type, exp, pos, noside)
       return call_function_by_hand (argvec[0], nargs, argvec + 1);
 
     case STRUCTOP_STRUCT:
-      tem = strlen (&exp->elts[pc + 1].string);
-      (*pos) += 2 + ((tem + sizeof (union exp_element))
+      tem = longest_to_int (exp->elts[pc + 1].longconst);
+      (*pos) += 3 + ((tem + sizeof (union exp_element))
                     / sizeof (union exp_element));
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
        goto nosideret;
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        return value_zero (lookup_struct_elt_type (VALUE_TYPE (arg1),
-                                                  &exp->elts[pc + 1].string,
-                                                  1),
+                                                  &exp->elts[pc + 2].string,
+                                                  0),
                           lval_memory);
       else
        {
          value temp = arg1;
-         return value_struct_elt (&temp, (value *)0, &exp->elts[pc + 1].string,
+         return value_struct_elt (&temp, (value *)0, &exp->elts[pc + 2].string,
                                   (int *) 0, "structure");
        }
 
     case STRUCTOP_PTR:
-      tem = strlen (&exp->elts[pc + 1].string);
-      (*pos) += 2 + (tem + sizeof (union exp_element)) / sizeof (union exp_element);
+      tem = longest_to_int (exp->elts[pc + 1].longconst);
+      (*pos) += 3 + (tem + sizeof (union exp_element)) / sizeof (union exp_element);
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
        goto nosideret;
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        return value_zero (lookup_struct_elt_type (TYPE_TARGET_TYPE
                                                   (VALUE_TYPE (arg1)),
-                                                  &exp->elts[pc + 1].string,
-                                                  1),
+                                                  &exp->elts[pc + 2].string,
+                                                  0),
                           lval_memory);
       else
        {
          value temp = arg1;
-         return value_struct_elt (&temp, (value *)0, &exp->elts[pc + 1].string,
+         return value_struct_elt (&temp, (value *)0, &exp->elts[pc + 2].string,
                                   (int *) 0, "structure pointer");
        }
 
@@ -542,9 +544,9 @@ evaluate_subexp (expect_type, exp, pos, noside)
     case BINOP_REM:
     case BINOP_LSH:
     case BINOP_RSH:
-    case BINOP_LOGAND:
-    case BINOP_LOGIOR:
-    case BINOP_LOGXOR:
+    case BINOP_BITWISE_AND:
+    case BINOP_BITWISE_IOR:
+    case BINOP_BITWISE_XOR:
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
@@ -564,15 +566,25 @@ evaluate_subexp (expect_type, exp, pos, noside)
       if (noside == EVAL_SKIP)
        goto nosideret;
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
-       return value_zero (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)),
-                          VALUE_LVAL (arg1));
+       {
+         /* If the user attempts to subscript something that has no target
+            type (like a plain int variable for example), then report this
+            as an error. */
+
+         type = TYPE_TARGET_TYPE (VALUE_TYPE (arg1));
+         if (type)
+           return value_zero (type, VALUE_LVAL (arg1));
+         else
+           error ("cannot subscript something of type `%s'",
+                  TYPE_NAME (VALUE_TYPE (arg1)));
+       }
                           
       if (binop_user_defined_p (op, arg1, arg2))
        return value_x_binop (arg1, arg2, op, OP_NULL);
       else
        return value_subscript (arg1, arg2);
       
-    case BINOP_AND:
+    case BINOP_LOGICAL_AND:
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
        {
@@ -591,14 +603,14 @@ evaluate_subexp (expect_type, exp, pos, noside)
        }
       else
        {
-         tem = value_zerop (arg1);
+         tem = value_logical_not (arg1);
          arg2 = evaluate_subexp (NULL_TYPE, exp, pos,
                                  (tem ? EVAL_SKIP : noside));
          return value_from_longest (builtin_type_int,
-                                 (LONGEST) (!tem && !value_zerop (arg2)));
+                                 (LONGEST) (!tem && !value_logical_not (arg2)));
        }
 
-    case BINOP_OR:
+    case BINOP_LOGICAL_OR:
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
        {
@@ -617,11 +629,11 @@ evaluate_subexp (expect_type, exp, pos, noside)
        }
       else
        {
-         tem = value_zerop (arg1);
+         tem = value_logical_not (arg1);
          arg2 = evaluate_subexp (NULL_TYPE, exp, pos,
                                  (!tem ? EVAL_SKIP : noside));
          return value_from_longest (builtin_type_int,
-                                 (LONGEST) (!tem || !value_zerop (arg2)));
+                                 (LONGEST) (!tem || !value_logical_not (arg2)));
        }
 
     case BINOP_EQUAL:
@@ -740,19 +752,19 @@ evaluate_subexp (expect_type, exp, pos, noside)
       else
        return value_neg (arg1);
 
-    case UNOP_LOGNOT:
+    case UNOP_COMPLEMENT:
       /* C++: check for and handle destructor names.  */
       op = exp->elts[*pos].opcode;
 
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
        goto nosideret;
-      if (unop_user_defined_p (UNOP_LOGNOT, arg1))
-       return value_x_unop (arg1, UNOP_LOGNOT);
+      if (unop_user_defined_p (UNOP_COMPLEMENT, arg1))
+       return value_x_unop (arg1, UNOP_COMPLEMENT);
       else
-       return value_lognot (arg1);
+       return value_complement (arg1);
 
-    case UNOP_ZEROP:
+    case UNOP_LOGICAL_NOT:
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
        goto nosideret;
@@ -760,7 +772,7 @@ evaluate_subexp (expect_type, exp, pos, noside)
        return value_x_unop (arg1, op);
       else
        return value_from_longest (builtin_type_int,
-                               (LONGEST) value_zerop (arg1));
+                                  (LONGEST) value_logical_not (arg1));
 
     case UNOP_IND:
       if (expect_type && TYPE_CODE (expect_type) == TYPE_CODE_PTR)
@@ -794,9 +806,8 @@ evaluate_subexp (expect_type, exp, pos, noside)
        {
          if (op == OP_SCOPE)
            {
-             char *name = &exp->elts[pc+3].string;
-             int temm = strlen (name);
-             (*pos) += 2 + (temm + sizeof (union exp_element)) / sizeof (union exp_element);
+             int temm = longest_to_int (exp->elts[pc+3].longconst);
+             (*pos) += 3 + (temm + sizeof (union exp_element)) / sizeof (union exp_element);
            }
          else
            evaluate_subexp (expect_type, exp, pos, EVAL_SKIP);
@@ -1068,7 +1079,7 @@ parse_and_eval_type (p, length)
     char *tmp = (char *)alloca (length + 4);
     struct expression *expr;
     tmp[0] = '(';
-    bcopy (p, tmp+1, length);
+    memcpy (tmp+1, p, length);
     tmp[length+1] = ')';
     tmp[length+2] = '0';
     tmp[length+3] = '\0';