This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATH] Change is_pascal_string_type args


Pierre Muller wrote:
> 
> The following patch is only to prepare for the
> next patch for p-exp.y that will enhance the field
> search for pascal expressions.
> 
> It adds a new argument that can contain
> a pointer to the name of the field containing the
> chars of the string.
> If the type is a pascal string the retruned value is now
> the char array field index plus one.
> (to avoid a zero if some new pascal compiler
> use the first field to contain the char array one day...)

Pierre, aren't you the Pascal maintainer for gdb?
Seems like you could be approving some of these changes
yourself, since they affect only Pascal.

 
> ChangeLog entry:
> 
> 2002-05-02  Pierre Muller  <muller@ics.u-strasbg.fr>
> 
>         * p-lang.h (is_pascal_string_type): Declaration changed,
>         new sixth argument of type char ** added.
>         * p-lang.c (is_pascal_string_type): Implementation
>         changed. Args length_pos, length_size, string_pos, char_size
>         can now be NULL. New argument arrayname set to the field
>         name of the char array. Return value set to char array
>         field index plus one.
> 
>         * p-valprint.c (pascal_val_print): Adapt to new declaration of
>         is_pascal_string_type function.
> 
> Index: p-lang.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/p-lang.c,v
> retrieving revision 1.5
> diff -u -p -r1.5 p-lang.c
> --- p-lang.c    13 Feb 2002 18:49:30 -0000      1.5
> +++ p-lang.c    2 May 2002 11:12:00 -0000
> @@ -44,7 +44,8 @@ extern void _initialize_pascal_language
>      but this does not happen for Free Pascal nor for GPC.  */
>   int
>   is_pascal_string_type (struct type *type,int *length_pos,
> -                       int * length_size, int *string_pos, int *char_size)
> +                       int *length_size, int *string_pos, int *char_size,
> +                      char **arrayname)
>   {
>     if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
>       {
> @@ -54,11 +55,17 @@ is_pascal_string_type (struct type *type
>             && strcmp (TYPE_FIELDS (type)[0].name, "length") == 0
>             && strcmp (TYPE_FIELDS (type)[1].name, "st") == 0)
>           {
> -          *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT;
> -          *length_size = TYPE_FIELD_TYPE (type, 0)->length;
> -          *string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
> -          *char_size = 1;
> -          return 1;
> +          if (length_pos)
> +           *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT;
> +          if (length_size)
> +           *length_size = TYPE_FIELD_TYPE (type, 0)->length;
> +          if (string_pos)
> +           *string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
> +          if (char_size)
> +           *char_size = 1;
> +         if (arrayname)
> +           *arrayname = TYPE_FIELDS (type)[1].name;
> +         return 2;
>           };
>         /* GNU pascal strings.  */
>         /* Three fields: Capacity, length and schema$ or _p_schema.  */
> @@ -66,12 +73,18 @@ is_pascal_string_type (struct type *type
>             && strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0
>             && strcmp (TYPE_FIELDS (type)[1].name, "length") == 0)
>           {
> -          *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
> -          *length_size = TYPE_FIELD_TYPE (type, 1)->length;
> -          *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT;
> +          if (length_pos)
> +           *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
> +          if (length_size)
> +           *length_size = TYPE_FIELD_TYPE (type, 1)->length;
> +          if (string_pos)
> +           *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT;
>             /* FIXME: how can I detect wide chars in GPC ?? */
> -          *char_size = 1;
> -          return 1;
> +          if (char_size)
> +           *char_size = 1;
> +         if (arrayname)
> +           *arrayname = TYPE_FIELDS (type)[2].name;
> +         return 3;
>           };
>       }
>     return 0;
> Index: p-lang.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/p-lang.h,v
> retrieving revision 1.3
> diff -u -p -r1.3 p-lang.h
> --- p-lang.h    9 Nov 2001 09:48:09 -0000       1.3
> +++ p-lang.h    2 May 2002 11:12:00 -0000
> @@ -38,7 +38,8 @@ extern void pascal_type_print_method_arg
> 
>   /* These are in p-lang.c: */
> 
> -extern int is_pascal_string_type (struct type *, int *, int *, int *, int*);
> +extern int
> +  is_pascal_string_type (struct type *, int *, int *, int *, int *, char **);
> 
>   extern void pascal_printchar (int, struct ui_file *);
> 
> Index: p-valprint.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/p-valprint.c,v
> retrieving revision 1.9
> diff -u -p -r1.9 p-valprint.c
> --- p-valprint.c        8 Jan 2002 02:09:31 -0000       1.9
> +++ p-valprint.c        2 May 2002 11:12:01 -0000
> @@ -190,8 +190,8 @@ pascal_val_print (struct type *type, cha
>              as GDB does not recognize stabs pascal strings
>              Pascal strings are mapped to records
>              with lowercase names PM  */
> -          if (is_pascal_string_type (elttype, &length_pos,
> -                                     &length_size, &string_pos, &char_size)
> +          if (is_pascal_string_type (elttype, &length_pos, &length_size,
> +                                     &string_pos, &char_size, NULL)
>               && addr != 0)
>             {
>               ULONGEST string_length;
> @@ -320,7 +320,7 @@ pascal_val_print (struct type *type, cha
>         else
>         {
>             if (is_pascal_string_type (type, &length_pos, &length_size,
> -                                     &string_pos, &char_size))
> +                                     &string_pos, &char_size, NULL))
>             {
>               len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size);
>               LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);
> 
> Pierre Muller
> Institut Charles Sadron
> 6,rue Boussingault
> F 67083 STRASBOURG CEDEX (France)
> mailto:muller@ics.u-strasbg.fr
> Phone : (33)-3-88-41-40-07  Fax : (33)-3-88-41-40-99


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]