2002-11-19 Pierre Muller <muller@ics.u-strasbg.fr>
authorPierre Muller <muller@sourceware.org>
Tue, 19 Nov 2002 12:44:43 +0000 (12:44 +0000)
committerPierre Muller <muller@sourceware.org>
Tue, 19 Nov 2002 12:44:43 +0000 (12:44 +0000)
* p-exp.y (typecast rule): Add automatic dereference of
pascal classes if needed.
(THIS): Set current_type.
Automatically dereference pascal classes.
(typebase rule): Add ^typebase recognition.

gdb/ChangeLog
gdb/p-exp.y

index 20277ed6fcb47b4fe5a1d838e27abb862ca2ae8e..190a3e0eb9fefd642c389f3127d68626808a6191 100644 (file)
@@ -1,3 +1,11 @@
+2002-11-19  Pierre Muller  <muller@ics.u-strasbg.fr>
+
+       * p-exp.y (typecast rule): Add automatic dereference of
+       pascal classes if needed.
+       (THIS): Set current_type.
+       Automatically dereference pascal classes. 
+       (typebase rule): Add ^typebase recognition.
+
 2002-11-18  Adam Fedor  <fedor@gnu.org>
 
        * expprint.c (print_subexp): Handle OP_OBJC_NSSTRING,
index cf521afb364b93c62f2074741b4e5de904846481..f15c217383d9094e88a3db7b52530eba6f7bdda7 100644 (file)
@@ -342,7 +342,15 @@ arglist    :
        ;
 
 exp    :       type '(' exp ')' %prec UNARY
-                       { write_exp_elt_opcode (UNOP_CAST);
+                       { if (current_type)
+                           {
+                             /* Allow automatic dereference of classes.  */
+                             if ((TYPE_CODE (current_type) == TYPE_CODE_PTR)
+                                 && (TYPE_CODE (TYPE_TARGET_TYPE (current_type)) == TYPE_CODE_CLASS)
+                                 && (TYPE_CODE ($1) == TYPE_CODE_CLASS))
+                               write_exp_elt_opcode (UNOP_IND);
+                           }
+                         write_exp_elt_opcode (UNOP_CAST);
                          write_exp_elt_type ($1);
                          write_exp_elt_opcode (UNOP_CAST); 
                          current_type = $1; }
@@ -504,8 +512,28 @@ exp        :       STRING
 
 /* Object pascal  */
 exp    :       THIS
-                       { write_exp_elt_opcode (OP_THIS);
-                         write_exp_elt_opcode (OP_THIS); }
+                       { 
+                         struct value * this_val;
+                         struct type * this_type;
+                         write_exp_elt_opcode (OP_THIS);
+                         write_exp_elt_opcode (OP_THIS); 
+                         /* we need type of this */
+                         this_val = value_of_this (0); 
+                         if (this_val)
+                           this_type = this_val->type;
+                         else
+                           this_type = NULL;
+                         if (this_type)
+                           {
+                             if (TYPE_CODE (this_type) == TYPE_CODE_PTR)
+                               {
+                                 this_type = TYPE_TARGET_TYPE (this_type);
+                                 write_exp_elt_opcode (UNOP_IND);
+                               }
+                           }
+               
+                         current_type = this_type;
+                       }
        ;
 
 /* end of object pascal.  */
@@ -693,7 +721,9 @@ type        :       ptype
        ;
 
 typebase  /* Implements (approximately): (type-qualifier)* type-specifier */
-       :       TYPENAME
+       :       '^' typebase
+                       { $$ = lookup_pointer_type ($2); }
+       |       TYPENAME
                        { $$ = $1.type; }
        |       STRUCT name
                        { $$ = lookup_struct (copy_name ($2),