Playing devil's advocate here: Can you mix these two types of 
properties?  That is, something like the following (please excuse any 
wrong syntax):

type
TMyRecord = record
    a,b: integer;
end;

TMyClass = class
    function GetProp: TMyRecord;
    procedure SetProp(AVal: TMyRecord);
    property MyProp: TMyRecord read GetProp write SetProp;
    property MyPropA: integer read MyProp.a;
end;

That is, a read of TMyClass's MyPropA would call TMyClass.GetProp and 
then return only its member a?

On 10/13/24 04:15, Martin via Dwarf-discuss wrote:
>
> On 13/10/2024 00:59, Adrian Prantl via Dwarf-discuss wrote:
>> On Sep 30, 2024, at 1:39 PM, Martin <li...@mfriebe.de> wrote:
>>>
>>> On 30/09/2024 19:30, Adrian Prantl wrote:
>>>> PS: One thing I left out is DW_AT_Property_Object. It wasn't clear 
>>>> to me why this wouldn't always be the address of the parent object 
>>>> of the DW_TAG_property.
>>>
>>> There is a construct where a property can point to an embedded 
>>> structure.
>>>
>>> type
>>> TMyRecord = record
>>>    a,b: integer;
>>> end;
>>>
>>> TMyClass = class
>>>    FPadding: word;
>>>    FData: TMyRecord;
>>>    FOther: TMyRecord; // Can't use the type to search for FData
>>>    property ValA: integer read FData.a;
>>> end;
>>>
>>> In that case DW_AT_Property_Forward  points to the member "a" in 
>>> "TMyRecord". This would be a DW_TAG_Member, which would have a 
>>> DW_AT_data_member_location relative to the structure FData address. 
>>> However there is no address where MyRecord is stored.
>>
>> Interesting example! In this case a DW_TAG_property_getter needs to 
>> point to the member "a" of the field FData specifically, so it can't 
>> be a reference to the DW_TAG_member "a" in TMyRecord. I can't think 
>> of a good way of preserving the access path of the field here. We 
>> could allow a DW_AT_location + DW_AT_type to allow a consumer to 
>> derive the value, but not the access path. In the general case (think 
>> something like "read FBinaryTree.left.left.right.data") we lack the 
>> expressivity to preserve which sub-field in the data structure, since 
>> DWARF does not encode expressions, only types.
>>
>> I think it would be reasonable to allow the common case of referring 
>> to a top-level field via a DW_TAG_member ref, and having an arbitrary 
>> DWARF expression in a DW_AT_location to recover the location in all 
>> other cases.
>>
> Well, I don't think we need the "access path", as in full access path.
> As you pointed out "a" could be in a nested record of TMyRecord, but I
> can't think of any case where that access path would matter.
>
> If we add DW_AT_Location:
> - keep the normal fields in the property, including the refernce to "a"
> - add DW_AT_Location to overwrite the DW_AT_data_member_location
> then, yes we have all the info we need.
>
> There is a choice to make that DW_AT_Location point directly to the data
> of the field. Or to the location of the directly enclosing object.
>
> My original idea was to describe the location of "FData" with a location
> expression, and then the debugger still adds the
> DW_AT_data_member_location to that.
>
> Currently directly specifying the location of the "pointed to field" is
> the simplest way.
>
> And currently, in Pascal, the above only works for fields in a record.
> So the address of the record containing the field should never be
> needed. But if that ever is extended (or if any other language allows)
> to use a getter method from such an object, then the object address
> would be needed for the "this" parameter.
> So maybe it is saver to use the DW_AT_Location to specify the address of
> that containing object?
>
> In either case, the nested object can be different for getter/setter. So
> that additional address must given per getter/setter.
> -- 
> Dwarf-discuss mailing list
> Dwarf-discuss@lists.dwarfstd.org 

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

Reply via email to