[fpc-devel] restbase.pp LoadFromJSON calling StopRecordPropertyChanges;

Wayne Sherman wsherman at gmail.com
Sat Jan 14 21:39:14 CET 2023


On Sat, Jan 14, 2023 at 10:34 AM Michael Van Canneyt wrote:
> On Sat, 14 Jan 2023, Wayne Sherman wrote:
> > 3) Why does MarkPropertyChanged offset the index and
> > IsPropertyModified does not take the offset into account?
>
> They should be the same. I don't remember why I created the two methods
> differently.

For property index specifiers, it seems that NameIndex might be the
wrong index used in IsPropertyModified:

function TBaseObject.IsPropertyModified(Info: PPropInfo): Boolean;
begin
  Result:=Not Assigned(FBits) or FBits.Bits[Info^.NameIndex]
end;

and possibly the rtl docs are incorrect(?):
   https://www.freepascal.org/docs-html/rtl/typinfo/tpropinfo.html
   Index - Index for array properties
   NameIndex - Index for indexed properties  << IS THIS CORRECT?

In the typinfo.pp unit, a comment indicates that NameIndex has to do
with property names (i.e. not the index specifier)
https://gitlab.com/freepascal.org/fpc/source/-/blob/main/rtl/objpas/typinfo.pp#L1689
        // Don't overwrite properties with the same name
        if PropList^[TP^.NameIndex]=nil then
          PropList^[TP^.NameIndex]:=TP;
        // Point to TP next propinfo record.
        // Located at Name[Length(Name)+1] !
        TP:=aligntoptr(PPropInfo(pointer(@TP^.Name)+PByte(@TP^.Name)^+1));
        Dec(Count);
      end;

NameIndex in Delphi typeinfo also has to do with Names of properties
and Index has the information on indexed properties:
   https://docwiki.embarcadero.com/Libraries/Sydney/en/System.TypInfo.TPropInfo
   Index - The index of the property. It is used as a parameter to the
GetProc and SetProc methods on indexed properties.
   NameIndex - The offset into the Name field where the property's name starts.


More information about the fpc-devel mailing list