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.
This commit is contained in:
parent
e8a7b686ff
commit
cd859a2010
14
gdb/eval.c
14
gdb/eval.c
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user