Hello Martin,

Thanks for submitting your proposal! In order to prepare it for discussion I 
would suggest to first try pick a first choice for all the design options in 
the proposal and then once the direction is clear, distill the normative text 
changes that would need to be made in the DWARF specification.

Adding a new TAG called DW_TAG_property seems like a good approach. There is 
nothing that's overly specific about Pascal in the proposal, so using the 
generic name seems like a good choice.

I had a couple of initial questions that came up while reading through the 
proposal:

- What does it mean for a property to be default? I couldn't find that defined 
in the linked FreePascal documentation.
- Why is there both a DW_AT_Default_Property and a DW_TAG_Property_Default?
- What is the purpose of DW_TAG_Property_Stored? Maybe also add an example for 
this.
- DW_TAG_Property_Argument_List would also benefit from an example.

- If I understand correctly, the purpose of DW_AT_Property_Forward is to 
reference a getter or setter DW_TAG_subprogram.
  Is there a specific reason you decided for this representation over nesting a 
DW_TAG_subprogram with a DW_AT_property_getter (true) inside the 
DW_TAG_property?

- Why isn't the accessibility attribute on the linked DW_TAG_subprogram?

After having read the last example, I think I can answer my question from 
above: Pascal allows to specify an access path to a (nested) field as the read 
accessor.

- Why is DW_AT_property_object needed? Couldn't the debugger determine the 
location from following the DW_AT_Property_Forward link? Related: Does this 
need to be a new attribute, or could this be DW_AT_location?

thanks,
Adrian

> On May 9, 2024, at 10:48 AM, Cary Coutant via Dwarf-discuss 
> <dwarf-discuss@lists.dwarfstd.org> wrote:
> 
> I've posted this as issue 240507.1.
> 
> -cary
> 
> On Wed, May 8, 2024 at 3:47 AM Martin via Dwarf-discuss 
> <dwarf-discuss@lists.dwarfstd.org> wrote:
> Small correction
> 
>    property MyProp: integer read public MyFunc write MyMember;
> 
> Should be
>    property MyProp: integer read public MyFunc write MyMember; default;
> 
> As I added the  DW_AT_Default_Property flag in the example.
> In FreePascal, this would currently only be valid for properties with 
> array-indexes, but may be extended in future. For the example it just 
> shows where the attribute would go.
> 
> 
> 
> On 08/05/2024 12:35, Martin via Dwarf-discuss wrote:
> > Here are 2 examples of what it would look like
> > 
> > ## Property with different visibility
> > 
> > ```
> >    type
> >      TFoo = class
> >      private
> >        MyMember: integer;
> >        function MyFunc: integer;
> >      protected
> >        // "read public" is currently from oxygene, but may be added to 
> > FreePascal
> >        property MyProp: integer read public MyFunc write MyMember;
> >      end;
> > 
> >      TBar = clall(TFoo)
> >      public
> >        property MyProp; // elevate to public
> >      end;
> > ```
> > 
> > ```
> >    DW_TAG_Structure_type
> >      DW_AT_Name :  "TFoo"
> > L1:
> >      DW_TAG_Member
> >          DW_AT_Name            :  "MyMember"
> >          DW_AT_Type            :  <...>
> >          DW_AT_Member_location :  <...>
> > L2:
> >      DW_TAG_subprogram
> >          DW_AT_Name            :  "MyFunc"
> >          DW_AT_Type            :  <...>
> > 
> >      DW_TAG_Property
> >          DW_AT_Name             :  "MyProp"
> >          DW_AT_Type             :  <...>
> >          DW_AT_Accessibility    :  DW_ACCESS_protected
> >          DW_AT_Default_Property :  TRUE
> >        DW_TAG_Property_Getter
> >            DW_AT_Property_Forward :  reference to L2
> >            DW_AT_Accessibility    :  DW_ACCESS_public
> >        DW_TAG_Property_Setter
> >            DW_AT_Property_Forward :  reference to L1
> > 
> >    DW_TAG_Structure_type
> >      DW_AT_Name :  "TBar"
> >      DW_TAG_Inheritance
> >          <...>
> >      DW_TAG_Property
> >          DW_AT_Name             :  "MyProp"
> >          DW_AT_Accessibility    :  DW_ACCESS_public
> > ```
> > 
> > ## Property with access to nested field
> > 
> > 
> > ```
> >    type
> >      TFoo = class
> >        OtherData: DWORD;
> >        FNested: record
> >          MyMember: integer;
> >        end;
> >        property MyProp: integer read FNested.MyMember;
> >      end;
> > ```
> > 
> > ```
> > L1:
> >    DW_TAG_Structure_type
> > L2:
> >      DW_TAG_Member
> >          DW_AT_Name            :  "MyMember"
> >          DW_AT_Type            :  <...>
> >          DW_AT_Member_location :  <...>    ! inside FNested
> > 
> >    DW_TAG_Structure_type
> >      DW_AT_Name :  "TFoo"
> >      DW_TAG_Member
> >          DW_AT_Name :  "OtherData"
> >      DW_TAG_Member
> >          DW_AT_Name :  "FNested"
> >          DW_AT_Type            :  reference to L1
> >          DW_AT_Member_location :
> >                DW_OP_plus_uconst 4             ! where 4 == offset of 
> > MyMember in the instance data
> > 
> >      DW_TAG_Property
> >          DW_AT_Name             :  "MyProp"
> >          DW_AT_Type             :  <...>
> >        DW_TAG_Property_Getter
> >            DW_AT_Property_Forward :  reference to L2
> >            DW_AT_Property_Object  :
> >                DW_OP_push_object_address  ! maybe should be on stack by 
> > default
> >                DW_OP_plus_uconst 4        ! where 4 == offset of 
> > MyMember in the instance data
> >                                           ! There could be several 
> > levels of nesting, so that expression could be more complex
> > ```
> > 
> > In the example the property does not have a reference to FNested itself. 
> > All it needs is the object_address of FNested, so it can calculate the 
> > location of the referenced field MyMember (using the member_location).
> > 
> > 
> 
> -- 
> Dwarf-discuss mailing list
> Dwarf-discuss@lists.dwarfstd.org
> https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss
> -- 
> Dwarf-discuss mailing list
> Dwarf-discuss@lists.dwarfstd.org
> https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss

-- 
Dwarf-discuss mailing list
Dwarf-discuss@lists.dwarfstd.org
https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss

Reply via email to