diff options
author | David Lecomber <david@lecomber.net> | 2003-09-09 16:51:54 +0000 |
---|---|---|
committer | David Lecomber <david@lecomber.net> | 2003-09-09 16:51:54 +0000 |
commit | cd859a2010670cdeaf184903224ae2fac65afd6a (patch) | |
tree | 6fa7c150b0bf40548ae92e1179b9cc591caf79f3 | |
parent | e8a7b686ffab6f15e4d30df4abbb1ed7096122b9 (diff) | |
download | gdb-cd859a2010670cdeaf184903224ae2fac65afd6a.zip gdb-cd859a2010670cdeaf184903224ae2fac65afd6a.tar.gz gdb-cd859a2010670cdeaf184903224ae2fac65afd6a.tar.bz2 |
Change array element access to something similar to way C works.
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.
-rw-r--r-- | gdb/eval.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -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: |