[fpc-devel] Trying to patch TGuid
Дмитрий Померанцев
pda2 at yandex.ru
Thu Dec 22 22:07:58 CET 2016
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.
More information about the fpc-devel
mailing list