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