Re: Large array printing patch for Fortran

Daniel Jacobowitz
2003-09-15T15:58:37Z

On Wed, Sep 10, 2003 at 03:35:36PM +0100, David Lecomber wrote:
> Resubmitting this (at last) - posted originally in May.
>
> The element printing limit for Fortran arrays is applied only for
> the outer dimension of an array. Consequently, on entering a subroutine
> with an argument of a (say) 1000x1000 array, the frame will take months
> to print, which kind of ruins commands like 'bt', 'info args' etc..

David,

[Assuming that this wasn't reviewed offlist - if so, whoever approved
it, please don't do that.]

Yes, I know that this patch hasn't been reviewed. That's a shame. Nag
the list if you get impatient, but please stop checking things in to
CVS! You're listed as a "Write After Approval" maintainer. If you
can't wait for approval I'll ask to have you removed from that list.

This was on my list to look at this week, when we were sure 6.0 was in
the hole.

>
>
> 2003-09-10 David Lecomber <dsl@sources.redhat.com>
>
> * f-valprint.c: Apply array element printing limits to
> multi-dimensional arrays
>
> Index: f-valprint.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/f-valprint.c,v
> retrieving revision 1.15
> diff -u -p -r1.15 f-valprint.c
> --- f-valprint.c 9 Sep 2003 23:09:37 -0000 1.15
> +++ f-valprint.c 10 Sep 2003 14:26:11 -0000
> @@ -47,7 +47,8 @@ static void f77_print_array (struct type
> enum val_prettyprint);
> static void f77_print_array_1 (int, int, struct type *, char *,
> CORE_ADDR, struct ui_file *, int, int, int,
> - enum val_prettyprint);
> + enum val_prettyprint,
> + int *elts);
> static void f77_create_arrayprint_offset_tbl (struct type *,
> struct ui_file *);
> static void f77_get_dynamic_length_of_aggregate (struct type *);
> @@ -271,31 +272,36 @@ f77_create_arrayprint_offset_tbl (struct
> }
> }
>
> +
> +
> /* Actual function which prints out F77 arrays, Valaddr == address in
> the superior. Address == the address in the inferior. */
> -
> static void
> f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
> CORE_ADDR address, struct ui_file *stream, int format,
> - int deref_ref, int recurse, enum val_prettyprint pretty)
> + int deref_ref, int recurse, enum val_prettyprint pretty,
> + int *elts)
> {
> int i;
>
> if (nss != ndimensions)
> {
> - for (i = 0; i < F77_DIM_SIZE (nss); i++)
> + for (i = 0; (i < F77_DIM_SIZE (nss) && (*elts) < print_max); i++)
> {
> fprintf_filtered (stream, "( ");
> f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
> valaddr + i * F77_DIM_OFFSET (nss),
> address + i * F77_DIM_OFFSET (nss),
> - stream, format, deref_ref, recurse, pretty);
> + stream, format, deref_ref, recurse, pretty, elts);
> fprintf_filtered (stream, ") ");
> }
> + if (*elts >= print_max && i < F77_DIM_SIZE (nss)) {
> + fprintf_filtered (stream, "...");
> + }
> }
> else
> {
> - for (i = 0; (i < F77_DIM_SIZE (nss) && i < print_max); i++)
> + for (i = 0; (i < F77_DIM_SIZE (nss) && (*elts) < print_max); i++, (*elts)++)
> {
> val_print (TYPE_TARGET_TYPE (type),
> valaddr + i * F77_DIM_OFFSET (ndimensions),
> @@ -306,7 +312,7 @@ f77_print_array_1 (int nss, int ndimensi
> if (i != (F77_DIM_SIZE (nss) - 1))
> fprintf_filtered (stream, ", ");
>
> - if (i == print_max - 1)
> + if ((( *elts) == print_max - 1) && (i != (F77_DIM_SIZE (nss) - 1)))
> fprintf_filtered (stream, "...");
> }
> }
> @@ -321,6 +327,7 @@ f77_print_array (struct type *type, char
> enum val_prettyprint pretty)
> {
> int ndimensions;
> + int elts = 0;
>
> ndimensions = calc_f77_array_dims (type);
>
> @@ -335,7 +342,7 @@ f77_print_array (struct type *type, char
> f77_create_arrayprint_offset_tbl (type, stream);
>
> f77_print_array_1 (1, ndimensions, type, valaddr, address, stream, format,
> - deref_ref, recurse, pretty);
> + deref_ref, recurse, pretty, &elts);
> }
> \f
>
>

--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer