[Dwarf-discuss] Proposal: Add support for "property" with getter/setter (based on Pascal properties)
Martin
lists@mfriebe.de
Wed May 8 10:46:58 GMT 2024
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).
>
>
More information about the Dwarf-discuss
mailing list