> On Feb 17, 2025, at 10:00 AM, Adrian Prantl <apra...@apple.com> wrote:
> 
> Hi everyone,
> 
> Here is the latest update to the property proposal based on the feedback I’ve 
> received so far.
> 
> Martin, can you check that everything in here makes sense from a Pascal 
> perspective?
> 
> Changes include:
> - moved to a new Section 5.19 since properties can be global
> - added example for the “stored” keyword
> - fixed the accessibility override mechanism to use 
> DW_TAG_accessibility_declaration
> 
> -- adrian

I apologize for attaching the wrong Markdown file!
# Add support for "properties"

## Background

Pascal has a property construct, that allows a "variable like"
identifier, which can either point to a field (member variable) or a
getter/setter function.

    TFoo = class
      FField: integer;
      function GetProp: integer;
      procedure SetProp(AVal: Integer);
      property MyProp: integer read GetProp write SetProp;
      property MyOtherProp: integer read FField;
    end;

* Properties can exist in a structure, interface, or on a global level.

* Properties can be read/write, read only, write only.

* Properties can have one or more array like indexes (of any type).

        function GetProp(AIdx:word; AIdx2: boolean): integer;
        procedure SetProp(AIdx:word; AIdx2: boolean; AVal: Integer);
        property MyProp[AIdx:word; AIdx2: boolean]: integer read GetProp write SetProp;

* Properties can share a method, and provide an index (constant) to
  identify which property called the method.

        function GetProp(AIndex: Integer): integer;
        procedure SetProp(AIndex: Integer; AValue: integer);
        property MyProp1: integer index 1 read GetProp write SetProp;
        property MyProp2: integer index 2 read GetProp write SetProp;

* Properties can have a "default" flag, indicating that the array []
  access can omit the property name. I.e. accessing "Object[n]" is a
  shortcut for the default property. (default for non-array properties is
  being considered for future addition)

* Properties can have "default" and "stored" values for streaming
  (constant or via function).

* Properties can be elevated to a higher visibility (private/public) in
  inherited classes.

There may be partial overlaps with properties in Objective-C and C#.

Update: This proposal has been updated in a way to make to also useful
for properties in Objective-C and Swift.


### References

- [FreePascal property doc][freepascal]
- [Oxygene][oxygene]
- [Apple extension for Objective-C][objc]

[freepascal]: https://www.freepascal.org/docs-html/ref/refse27.html
[oxygene]: https://docs.elementscompiler.com/Oxygene/Members/Properties/
[objc]: https://github.com/llvm/llvm-project/blob/main/llvm/docs/SourceLevelDebugging.rst#debugging-information-format-1

## Proposed Changes

### Section 2.1: The Debugging Information Entry

In Table 2.1, add `DW_TAG_property`, `DW_TAG_property_getter`,
`DW_TAG_property_setter`, and `DW_TAG_property_stored`.

### New Section 5.7.11 Property Entries

A property member is represented by a debugging information entry with
the tag `DW_TAG_property` as specified in Section 5.19.

### New Section 5.19(?): Property Entries

Add the following new subsection to Chapter 5:

> 5.19(?) Property Entries
>
> [Non-normative] Many object-oriented languages like Pascal and
> Objective-C have properties, which are member functions that
> syntactically behave like data members of an object. Pascal can also
> have global properties that behave like data members of a unit.
>
> A property is represented by a debugging information entry with the
> tag `DW_TAG_property`. A property entry has a `DW_AT_name` string
> attribute whose value is the property name. A property entry may have
> a `DW_AT_type` attribute to denote the type of that property.
>
> A property may have `DW_AT_accessibility`, `DW_AT_external`,
> `DW_AT_virtuality`, `DW_AT_start_scope`, `DW_AT_decl_column`,
> `DW_AT_decl_file` and `DW_AT_decl_line` attributes with the respective
> semantics described for these attributes for `DW_TAG_member` (see Section 5.7.6).
>
> A property may have one or several of `DW_TAG_property_getter`,
> `DW_TAG_property_setter`, or `DW_TAG_property_stored` children to
> represent the getter and setter (member) functions, or the Pascal-style
> `stored` accessor for this property. Each of these tags have a
> `DW_AT_property_forward` attribute to point to a (member) function
> declaration or a data member. If they point to a function, they may also
> have `DW_TAG_formal_parameter` children (matching the ones in the
> function) that can have `DW_AT_default_value` attributes to declare
> additional default arguments for when these functions are used as
> property accessors.
>
> Some languages can automatically derive accessors for properties from a
> field in property's parent object. In such cases the
> `DW_AT_property_forward` attribute of the accessor entry points to the
> `DW_TAG_property`'s sibling `DW_TAG_member` entry of field that holds
> the properties underlying storage.
>
> Property accessors may also have any other attributes allowed in a
> `DW_TAG_subprogram` function declaration. If the value of a property can
> be derived by evaluating a DWARF expression, the
> `DW_TAG_property_getter` may have a `DW_AT_location` holding a DWARF
> expression that may use `DW_OP_push_object_address` to inquire the
> address of the property's parent object.
>
> To change the accessibility of a property in an inherited class, a
> access declaration [link to 5.7.4: Access Declarations] can be
> specified with the property name and accessibility.  For example if
> in a subclass property `a` becomes private it is sufficient to add the
> following to the subclass entry:
>
>     DW_TAG_class
>       DW_AT_name            "subclass"
>       DW_TAG_inheritance
>         ...
>
>       DW_TAG_access_declaration
>         DW_AT_name            "a"
>         DW_AT_accessibility   DW_ACCESS_private

### Section 7

Add to Table 7.3
> DW_TAG_property 0x4c
> DW_TAG_property_getter 0x4d
> DW_TAG_property_setter 0x4e
> DW_TAG_property_stored 0x4f

Add to Table 7.5
> DW_AT_property_forward 0x61 reference 

### Appendix D: Examples

Add a new subsection:

> D.x Properties
>
> The properties in the Pascal object in this example are represented by
> the following DWARF.
>
>     TClass = class
>       private
>          PrivateField: integer;
>          function shouldStore : boolean;
>       public
>          function GetProp: integer;
>          procedure SetProp(AVal: Integer);
>          property PropFromMethods: integer read GetProp write SetProp;
>          property PropFromField: integer read PrivateField;
>          function GetValue(x: word; AIndex: Integer): char;
>          property Indexed[x: word]: char index 1 read GetValue;
>          property MaybeStored: integer stored shouldStore;
>     end;
>
>
>     DW_TAG_class_type
>       DW_AT_name "TClass"
>       DW_TAG_member
>         DW_AT_accessibility DW_AT_private
>         DW_AT_name "PrivateField"
>         DW_AT_type <ref to integer>
>       DW_TAG_subprogram
>         DW_AT_name "GetProp"
>         ...
>       DW_TAG_subprogram
>         DW_AT_name "SetProp"
>         ...
>
>       DW_TAG_property
>         DW_AT_name "PropFromMethods"
>         DW_TAG_property_getter
>           DW_AT_property_forward <ref to GetProp>
>         DW_TAG_property_setter
>           DW_AT_property_forward <ref to SetProp>
>
>       DW_TAG_property
>         DW_AT_name "PropFromField"
>         DW_TAG_property_getter
>           DW_AT_property_forward <ref to PrivateField>
>
>       DW_TAG_subprogram
>         DW_AT_name "GetValue"
>         ...
>
>       DW_TAG_property
>         DW_AT_name "Indexed"
>
>         DW_TAG_property_getter
>           DW_AT_property_forward <ref to GetValue>
>
>           DW_TAG_formal_parameter  ; _this (no default specified, details inherited from GetValue
>           DW_TAG_formal_parameter  ; x (no default specified)
>           DW_TAG_formal_parameter
>             DW_AT_default_value <DW_OP_lit 1> ; property index
>
>       DW_TAG_property
>         DW_AT_name "MaybeStored"
>
>         DW_TAG_property_stored
>           DW_AT_property_forward <ref to shouldStore>
>

---

2024-05-07: [Original proposal][orig].

2024-10-12: [Revised][diff1] after online discussion.

2025-01-03: [Revised][diff2] with updated examples and Chapter 7 changes.

2025-02-17: [Revised][diff3] with updated examples and Chapter 7 changes, and a fix to accessibility.
-- 
Dwarf-discuss mailing list
Dwarf-discuss@lists.dwarfstd.org
https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss

Reply via email to