I tried to add the comparison operator and the method that returns the empty GUID to the TGuid type, as is done in Delphi. I thought that this would not be any problems, because that type is declared rtl/inc/objpash.inc file which is included in rtl/inc/systemh.inc and the systemh.inc have a {$modeswitch advancedrecords} line.
Unfortunately, it seems to rewrite the system modules is not so easy. After making the changes that are described by this patch: >>> Index: rtl/inc/objpas.inc =================================================================== --- rtl/inc/objpas.inc (revision 35175) +++ rtl/inc/objpas.inc (working copy) @@ -1000,6 +1000,27 @@ end; {**************************************************************************** + TGUID +****************************************************************************} + + + class operator TGuid.=(const left, right : TGuid) : boolean; + begin + result:=IsGUIDEqual(left,right); + end; + + class operator TGuid.<>(const left, right : TGuid) : boolean; + begin + result:=not(IsGUIDEqual(left,right)); + end; + + class function TGuid.Empty : TGuid; + begin + FillChar(result,SizeOf(result),0); + end; + + +{**************************************************************************** TINTERFACEDOBJECT ****************************************************************************} Index: rtl/inc/objpash.inc =================================================================== --- rtl/inc/objpash.inc (revision 35175) +++ rtl/inc/objpash.inc (working copy) @@ -132,6 +132,9 @@ PGuid = ^TGuid; TGuid = packed record + class operator =(const left, right : TGuid) : boolean; {$ifdef SYSTEMINLINE} inline; {$endif} + class operator <>(const left, right : TGuid) : boolean; {$ifdef SYSTEMINLINE} inline; {$endif} + class function Empty : TGuid; static; {$ifdef SYSTEMINLINE} inline; {$endif} case integer of 1 : ( Data1 : DWord; <<< I was get the following error (I use the source code from svn, revision #35175): C:/FPC/3.1.x/source/compiler/ppc1.exe -Ur -Xs -O2 -n -Twin32 -Pi386 -Fi../inc -Fi../i386 -Fi../win -FE. -FUC:/FPC/3.1.x/source/rtl/units/i386-win32 -di386 -dRELEASE -Us -Sg system.pp -Fi../winobjpash.inc(453,70) Error: $ENDIF expected for $IFDEF FPC_HAS_FEATURE_CLASSES defined in objpash.inc line 1550 Fatal: No memory left Quite a strange message, that it is difficult to understand where that was. But I got it. At the line 453 of file rtl/inc/objpash.inc: IObjectInstance: TGuid = '{D91C9AF4-3C93-420F-A303-BF5BA82BFD23}'; So the my code is interfere of constant assignment. And at the in line 1550 of file rtl/inc/systemh.inc we can see: {$ifdef FPC_HAS_FEATURE_CLASSES} {$i objpash.inc} {$endif FPC_HAS_FEATURE_CLASSES} Here is I stuck. Can anyone suggest what is wrong here? The compiler does not allow include operator overloading or record methods in the system modules? Or is it some kind of a bug? Dmitriy Pomerantsev. _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel