On Thu, Aug 11, 2022 at 9:37 PM Martin Frb via fpc-devel <
[email protected]> wrote:
> fpc code is still "unexpected".
> It takes into account the MinValue
>
> type TMyEnum = (a=5, b=7);
>
> GetEnumName(pt, 5) // a
> GetEnumName(pt, 6) // b // should be 7
>
> if it is just the nth name, then it should start at 0 (or if needs be at
> 1).
>
And function GetEnumValue() is buggy.
This was noticed when testing the original Lazarus enum property editor bug.
A little modified enum :
type
TFruitMore = (fmApple=1, fmOrange=3, fmBanana=5, fmGrapes, fmPear);
var
I: Integer;
EnumType: PTypeInfo;
...
I := GetEnumValue(EnumType, 'fmBanana'); // Returns 3
I := GetEnumValue(EnumType, 'fmGrapes'); // Returns 4 which is an
illegal value
Looking at the source of GetEnumValue() the reason is clear.
It increments Count one by one while it should take the gaps into account.
---
PS:=@PT^.NameList;
While (Result=-1) and (PByte(PS)^<>0) do
begin
If ShortCompareText(PS^, sName) = 0 then
Result:=Count+PT^.MinValue;
PS:=PShortString(pointer(PS)+PByte(PS)^+1);
Inc(Count);
end;
---
Where are the ordinal values for enums stored? They are not in TTypeData.
I wanted to fix this right away but I have no idea how.
Regards,
Juha
_______________________________________________
fpc-devel maillist - [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel