Change array element access to something similar to way C works.
authorDavid Lecomber <david@lecomber.net>
Tue, 9 Sep 2003 16:51:54 +0000 (16:51 +0000)
committerDavid Lecomber <david@lecomber.net>
Tue, 9 Sep 2003 16:51:54 +0000 (16:51 +0000)
The old method would drag in the entire array, then look for the
single element.  This method just gets the right element out instead.
Saves memory, and saves a crash for array with (*) as one of the
dimensions when it would previously have allocated (unsigned int) -1 bytes.

gdb/eval.c

index 914a552070405c6c48ce7c829dc59e172694fedf..7b18723774b2fb745cf09b99049c354cab7073de 100644 (file)
@@ -1666,10 +1666,6 @@ evaluate_subexp_standard (struct type *expect_type,
          offset_item =
            array_size_array[i] * offset_item + subscript_array[i];
 
-       /* Construct a value node with the value of the offset */
-
-       arg2 = value_from_longest (builtin_type_f_integer, offset_item);
-
        /* Let us now play a dirty trick: we will take arg1 
           which is a value node pointing to the topmost level
           of the multidimensional array-set and pretend
@@ -1678,7 +1674,15 @@ evaluate_subexp_standard (struct type *expect_type,
           returns the correct type value */
 
        VALUE_TYPE (arg1) = tmp_type;
-       return value_ind (value_add (value_coerce_array (arg1), arg2));
+
+       f77_get_dynamic_lowerbound (tmp_type, &lower);
+
+       /* Construct a value node with the value of the offset */
+       /* lower will get subtracted off in value_subscript, hence add it here */
+
+       arg2 = value_from_longest (builtin_type_f_integer, offset_item + lower);
+
+       return value_subscript(arg1, arg2);
       }
 
     case BINOP_LOGICAL_AND: