Am 16.08.2022 um 09:37 schrieb Michael Van Canneyt via fpc-devel:
On Tue, 16 Aug 2022, Juha Manninen via fpc-devel wrote:
On Thu, Aug 11, 2022 at 9:37 PM Martin Frb via fpc-devel <
fpc-devel@lists.freepascal.org> 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.
It is not buggy. It does not support enumerateds with gaps, because
RTTI does not support enumerateds with gaps.
It never has.
Well it is buggy, but a little bit differently: FPC indeed creates
PropInfo for enumerated types with gaps!
Allow me to slightly edit your demo code:
program RTTITest;
{$ifdef DCC}
// Delphi
{$APPTYPE CONSOLE}
{$else}
// FPC
{$mode objfpc}{$h+}
{$endif}
uses
SysUtils, Classes, TypInfo;
type
TFruitMore = (fmApple=1, fmOrange=3, fmBanana=5, fmGrapes, fmPear);
TMyClass = class(TPersistent)
private
FFruit: TFruitMore;
Published
property Fruit : TFruitMore Read FFruit Write FFruit;
end;
var
PI : PPropInfo;
aClass : TMyClass;
TypeData : PTypeData;
begin
aClass:=TMyClass.Create;
TypeData:=GetTypeData(aClass.ClassInfo);
Writeln('PropCount: ', TypeData^.PropCount); // Delphi writes 0, FPC
writes 1
PI:=GetPropInfo(aClass,'Fruit',tkAny);
if PI=nil then
Writeln('Property info is null')
else
begin
Writeln('Property name: ', PI^.Name);
Writeln('Property kind: ', GetEnumName(TypeInfo(TTypeKind),
Ord(PI^.PropType^.Kind)));
end;
Readln;
end.
--- code end
Run it in Delphi and FPC and compare the outputs:
Delphi output:
PropCount: 0
Property info is null
FPC output:
PropCount: 1
Property name: Fruit
Property kind: tkEnumeration
As you can see FPC creates a valid PropInfo for the property with valid
TypeInfo (PI^.PropType) of the kind tkEnumeration! This is definitely wrong.
So the solution is either:
1.) don't create PropInfo for the Fruit property like Delphi.
- or -
2.) PropType must not be thEnumeration. It should be either tkInteger or
a new custom value like tkCEnumeration or whatever. Because
thEnumeration means it has the enumeration TypeInfo with GetEnumName and
GetEnumValue.
Ondrej
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel