* ch-valprint.c (chill_val_print): Remove call to calculate_array_length.
authorWilfried Moser <moser@cygnus>
Wed, 10 Apr 1996 10:01:30 +0000 (10:01 +0000)
committerWilfried Moser <moser@cygnus>
Wed, 10 Apr 1996 10:01:30 +0000 (10:01 +0000)
        (calculate_array_length): Move function from here ...

        * ch-exp.c (calculate_array_length): ... to here.
        (parse_primval): If we have a symbol with an array type
        and the length is 0, call calculate_array_length.

gdb/ChangeLog
gdb/ch-exp.c
gdb/ch-valprint.c

index 92eb7be1c91759291088eed62dc15ce44681c043..037a696a4da5cc7ee6ddc729c991c779914b59a0 100644 (file)
@@ -1,3 +1,12 @@
+Wed Apr 10 02:56:06 1996  Wilfried Moser (Alcatel)  <moser@rtl.cygnus.com>
+
+       * ch-valprint.c (chill_val_print): Remove call to calculate_array_length.
+       (calculate_array_length): Move function from here ...
+
+       * ch-exp.c (calculate_array_length): ... to here.
+       (parse_primval): If we have a symbol with an array type
+       and the length is 0, call calculate_array_length.
+
 Tue Apr  9 01:23:05 1996  Wilfried Moser (Alcatel)  <moser@rtl.cygnus.com>
 
        * eval.c (evaluate_subexp_standard): In case of TYPE_CODE_SET:
index f6f522ab4a672dc6248ed3e29fc36610c5eb2cb8..977108861c2236212d719b406e1d99813d0f0a6a 100644 (file)
@@ -138,6 +138,7 @@ static int parse_opt_untyped_expr ();
 static void parse_if_expression_body PARAMS((void));
 static void write_lower_upper_value PARAMS ((enum exp_opcode, struct type *));
 static enum ch_terminal ch_lex ();
+static void calculate_array_length (struct type *);
 
 #define MAX_LOOK_AHEAD 2
 static enum ch_terminal terminal_buffer[MAX_LOOK_AHEAD+1] = {
@@ -673,11 +674,20 @@ parse_primval ()
       break;
     case GENERAL_PROCEDURE_NAME:
     case LOCATION_NAME:
-      write_exp_elt_opcode (OP_VAR_VALUE);
-      write_exp_elt_block (NULL);
-      write_exp_elt_sym (PEEK_LVAL ().ssym.sym);
-      write_exp_elt_opcode (OP_VAR_VALUE);
-      FORWARD_TOKEN ();
+      {
+       struct type *type;
+
+       /* FIXME: look at calculate_array_length */
+       type = PEEK_LVAL().ssym.sym->type;
+       if (type && TYPE_CODE (type) == TYPE_CODE_ARRAY &&
+           TYPE_LENGTH (type) == 0)
+         calculate_array_length (type);
+       write_exp_elt_opcode (OP_VAR_VALUE);
+       write_exp_elt_block (NULL);
+       write_exp_elt_sym (PEEK_LVAL ().ssym.sym);
+       write_exp_elt_opcode (OP_VAR_VALUE);
+       FORWARD_TOKEN ();
+      }
       break;
     case GDB_VARIABLE: /* gdb specific */
       FORWARD_TOKEN ();
@@ -2082,6 +2092,49 @@ write_lower_upper_value (opcode, type)
     }
 }
 
+/* In certain cases it could happen, that an array type doesn't
+   have a length (this have to do with seizing). The reason is
+   shown in the following stabs:
+
+   .stabs "m_x:Tt81=s36i:1,0,32;ar:82=ar80;0;1;83=xsm_struct:,32,256;;",128,0,25,0
+  
+   .stabs "m_struct:Tt83=s16f1:9,0,16;f2:85=*84,32,32;f3:84,64,64;;",128,0,10,0
+
+   When processing t81, the array ar80 doesn't have a length, cause
+   struct m_struct is specified extern at thse moment. Afterwards m_struct
+   gets specified and updated, but not the surrounding type.
+
+   So we walk through array's till we find a type with a length and
+   calculate the array length.
+
+   FIXME: Where may this happen too ?
+   */
+
+static void
+calculate_array_length (type)
+     struct type *type;
+{
+  struct type *target_type;
+  struct type *range_type;
+  LONGEST lower_bound, upper_bound;
+
+  if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
+    /* not an array, stop processing */
+    return;
+
+  target_type = TYPE_TARGET_TYPE (type);
+  range_type = TYPE_FIELD_TYPE (type, 0);
+  lower_bound = TYPE_FIELD_BITPOS (range_type, 0);
+  upper_bound = TYPE_FIELD_BITPOS (range_type, 1);
+
+  if (TYPE_LENGTH (target_type) == 0 &&
+      TYPE_CODE (target_type) == TYPE_CODE_ARRAY)
+    /* we've got another array */
+    calculate_array_length (target_type);
+
+  TYPE_LENGTH (type) = (upper_bound - lower_bound + 1) * TYPE_LENGTH (target_type);
+}
+
 void
 chill_error (msg)
      char *msg;
index de66d46cfebe802a47459cdda69e8c22eaec3e45..9b201370c6910e70b51cb9b0868186d0cc328665 100644 (file)
@@ -176,49 +176,6 @@ chill_val_print_array_elements (type, valaddr, address, stream,
     }
 }
 
-/* In certain cases it could happen, that an array type doesn't
-   have a length (this have to do with seizing). The reason is
-   shown in the following stabs:
-
-   .stabs "m_x:Tt81=s36i:1,0,32;ar:82=ar80;0;1;83=xsm_struct:,32,256;;",128,0,25,0
-  
-   .stabs "m_struct:Tt83=s16f1:9,0,16;f2:85=*84,32,32;f3:84,64,64;;",128,0,10,0
-
-   When processing t81, the array ar80 doesn't have a length, cause
-   struct m_struct is specified extern at thse moment. Afterwards m_struct
-   gets specified and updated, but not the surrounding type.
-
-   So we walk through array's till we find a type with a length and
-   calculate the array length.
-
-   FIXME: Where may this happen too ?
-   */
-
-static void
-calculate_array_length (type)
-     struct type *type;
-{
-  struct type *target_type;
-  struct type *range_type;
-  LONGEST lower_bound, upper_bound;
-
-  if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
-    /* not an array, stop processing */
-    return;
-
-  target_type = TYPE_TARGET_TYPE (type);
-  range_type = TYPE_FIELD_TYPE (type, 0);
-  lower_bound = TYPE_FIELD_BITPOS (range_type, 0);
-  upper_bound = TYPE_FIELD_BITPOS (range_type, 1);
-
-  if (TYPE_LENGTH (target_type) == 0 &&
-      TYPE_CODE (target_type) == TYPE_CODE_ARRAY)
-    /* we've got another array */
-    calculate_array_length (target_type);
-
-  TYPE_LENGTH (type) = (upper_bound - lower_bound + 1) * TYPE_LENGTH (target_type);
-}
-
 /* Print data of type TYPE located at VALADDR (within GDB), which came from
    the inferior at address ADDRESS, onto stdio stream STREAM according to
    FORMAT (a letter or 0 for natural format).  The data at VALADDR is in
@@ -254,10 +211,6 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_ARRAY:
-      if (TYPE_LENGTH (type) == 0)
-       /* see comment function calculate_array_length */
-       calculate_array_length (type);
-
       if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
        {
          if (prettyprint_arrays)