Re: [RFA] print arrays with indexes

Joel Brobecker
2005-10-04T07:41:39Z

[-- Attachment #1: Type: text/plain, Size: 1410 bytes --]

BTW, I forgot to mention a couple of things regarding:

> 2. More annoying, I just tried something else, which is to print an
> empty Ada array. Ada allows you to create this by using declarations
> such as this:
>
> Table : array (1 .. 0) of Integer;
>
> Basically, if the lower/left bound is greater than the right/higher
> bound, then the array is empty.
>
> I just discovered that ada_val_print_1 calls val_print_array_elements
> even if the array is empty. This triggers one of the guards in
> get_array_low_bound(), since the function expects a non-empty array.
>
> I'm happy to just put a check in the Ada part to avoid calling
> val_print_array_elements for empty arrays. This should be fine, but
> I'm wondering if other languages might be doing the same, in which
> case it's probably going to be safer to modify a bit
> val_print_array_elements to handle empty arrays...

a. I tried with a C example, something like this:

int table [] = {};

And verified that GDB worked correctly (printed the address
of the array, but no value). So there is no issue with C,
at least. Don't have a pascal compiler handy, though.

b. I prefer the second approach. It just feels safer and more elegant.
In fact I just finished testing the attached patch. I will submit
a proper patch together with a testcase tomorrow.

--
Joel

[-- Attachment #2: valprint.c.diff --]
[-- Type: text/plain, Size: 1225 bytes --]

Index: valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/valprint.c,v
retrieving revision 1.55
diff -u -p -r1.55 valprint.c
--- valprint.c 3 Oct 2005 21:21:20 -0000 1.55
+++ valprint.c 4 Oct 2005 07:40:59 -0000
@@ -959,19 +959,21 @@ val_print_array_elements (struct type *t
unsigned int rep1;
/* Number of repetitions we have detected so far. */
unsigned int reps;
- long low_bound_index;
-
- if (!get_array_low_bound (type, &low_bound_index))
- {
- warning ("unable to get low bound of array, using zero as default");
- low_bound_index = 0;
- }
+ long low_bound_index = 0;

elttype = TYPE_TARGET_TYPE (type);
eltlen = TYPE_LENGTH (check_typedef (elttype));
len = TYPE_LENGTH (type) / eltlen;
index_type = TYPE_INDEX_TYPE (type);

+ /* Get the array low bound. This only makes sense if the array
+ has one or more element in it. */
+ if (len > 0 && !get_array_low_bound (type, &low_bound_index))
+ {
+ warning ("unable to get low bound of array, using zero as default");
+ low_bound_index = 0;
+ }
+
annotate_array_section_begin (i, elttype);

for (; i < len && things_printed < print_max; i++)