fcl-passrc: made helpers deterministic

This commit is contained in:
mattias 2019-09-01 19:24:08 +00:00
parent f810306aae
commit da53f15c45

View File

@ -2126,8 +2126,6 @@ function IsValidIdent(const Ident: string; AllowDots: Boolean = False; StrictDot
function DotExprToName(Expr: TPasExpr): string; function DotExprToName(Expr: TPasExpr): string;
function NoNil(o: TObject): TObject; function NoNil(o: TObject): TObject;
function ComparePRHelperEntries(Entry1, Entry2: TPRHelperEntry): integer;
function dbgs(const Flags: TPasResolverComputeFlags): string; overload; function dbgs(const Flags: TPasResolverComputeFlags): string; overload;
function dbgs(const a: TResolvedRefAccess): string; overload; function dbgs(const a: TResolvedRefAccess): string; overload;
function dbgs(const Flags: TResolvedReferenceFlags): string; overload; function dbgs(const Flags: TResolvedReferenceFlags): string; overload;
@ -2704,27 +2702,6 @@ begin
end; end;
{$ENDIF} {$ENDIF}
function ComparePRHelperEntries(Entry1, Entry2: TPRHelperEntry): integer;
var
HelperForType1, HelperForType2: TPasType;
begin
HelperForType1:=Entry1.HelperForType;
HelperForType2:=Entry2.HelperForType;
{$IFDEF Pas2js}
if HelperForType1.PasElementId<HelperForType2.PasElementId then
exit(1)
else if HelperForType1.PasElementId>HelperForType2.PasElementId then
exit(-1)
{$ELSE}
if Pointer(HelperForType1)>Pointer(HelperForType2) then
exit(1)
else if Pointer(HelperForType1)<Pointer(HelperForType2) then
exit(-1)
{$ENDIF}
else
Result:=Entry1.Added-Entry2.Added;
end;
function dbgs(const Flags: TPasResolverComputeFlags): string; function dbgs(const Flags: TPasResolverComputeFlags): string;
var var
s: string; s: string;
@ -17385,40 +17362,19 @@ end;
procedure TPasResolver.AddHelper(Helper: TPasClassType; procedure TPasResolver.AddHelper(Helper: TPasClassType;
var List: TPRHelperEntryArray); var List: TPRHelperEntryArray);
{$IF defined(fpc) and (FPC_FULLVERSION<30101)}
procedure Insert(Item: TPRHelperEntry; var A: TPRHelperEntryArray; Index: integer); overload;
var
i: Integer;
begin
if Index<0 then
RaiseInternalError(20190118211455);
if Index>length(A) then
RaiseInternalError(20190119122624);
SetLength(A,length(A)+1);
for i:=length(A)-1 downto Index+1 do
A[i]:=A[i-1];
A[Index]:=Item;
end;
{$ENDIF}
var var
NewEntry, Entry: TPRHelperEntry; NewEntry: TPRHelperEntry;
i: Integer; Added: Integer;
HelperForType: TPasType; HelperForType: TPasType;
begin begin
HelperForType:=ResolveAliasType(Helper.HelperForType,false); HelperForType:=ResolveAliasType(Helper.HelperForType,false);
NewEntry:=TPRHelperEntry.Create; NewEntry:=TPRHelperEntry.Create;
NewEntry.Helper:=Helper; NewEntry.Helper:=Helper;
NewEntry.HelperForType:=HelperForType; NewEntry.HelperForType:=HelperForType;
NewEntry.Added:=length(List); Added:=length(List);
// keep list sorted for 1. HelperForType and 2. Added NewEntry.Added:=Added;
i:=0; SetLength(List,Added+1);
while i<length(List) do List[Added]:=NewEntry;
begin
Entry:=List[i];
if ComparePRHelperEntries(NewEntry,Entry)<=0 then break;
inc(i);
end;
Insert(NewEntry,List,i);
end; end;
procedure TPasResolver.AddActiveHelper(Helper: TPasClassType); procedure TPasResolver.AddActiveHelper(Helper: TPasClassType);