* Introduce TFPSList checkindex (bug ID 30886)

git-svn-id: trunk@34872 -
This commit is contained in:
michael 2016-11-11 10:16:57 +00:00
parent 5af24e94ae
commit aa6a8acb72

View File

@ -61,6 +61,7 @@ type
procedure SetLast(const Value: Pointer); procedure SetLast(const Value: Pointer);
function GetFirst: Pointer; function GetFirst: Pointer;
procedure SetFirst(const Value: Pointer); procedure SetFirst(const Value: Pointer);
Procedure CheckIndex(AIndex : Integer); inline;
public public
constructor Create(AItemSize: Integer = sizeof(Pointer)); constructor Create(AItemSize: Integer = sizeof(Pointer));
destructor Destroy; override; destructor Destroy; override;
@ -466,16 +467,14 @@ end;
function TFPSList.Get(Index: Integer): Pointer; function TFPSList.Get(Index: Integer): Pointer;
begin begin
if (Index < 0) or (Index >= FCount) then CheckIndex(Index);
RaiseIndexError(Index);
Result := InternalItems[Index]; Result := InternalItems[Index];
end; end;
procedure TFPSList.Put(Index: Integer; Item: Pointer); procedure TFPSList.Put(Index: Integer; Item: Pointer);
var p : Pointer; var p : Pointer;
begin begin
if (Index < 0) or (Index >= FCount) then CheckIndex(Index);
RaiseIndexError(Index);
p:=InternalItems[Index]; p:=InternalItems[Index];
if assigned(p) then if assigned(p) then
DeRef(p); DeRef(p);
@ -533,6 +532,14 @@ begin
Inc(FCount); Inc(FCount);
end; end;
procedure TFPSList.CheckIndex(AIndex : Integer);
begin
if (AIndex < 0) or (AIndex >= FCount) then
Error(SListIndexError, AIndex);
end;
procedure TFPSList.Clear; procedure TFPSList.Clear;
begin begin
if Assigned(FList) then if Assigned(FList) then
@ -546,8 +553,7 @@ procedure TFPSList.Delete(Index: Integer);
var var
ListItem: Pointer; ListItem: Pointer;
begin begin
if (Index < 0) or (Index >= FCount) then CheckIndex(Index);
Error(SListIndexError, Index);
Dec(FCount); Dec(FCount);
ListItem := InternalItems[Index]; ListItem := InternalItems[Index];
Deref(ListItem); Deref(ListItem);
@ -589,10 +595,8 @@ end;
procedure TFPSList.Exchange(Index1, Index2: Integer); procedure TFPSList.Exchange(Index1, Index2: Integer);
begin begin
if ((Index1 >= FCount) or (Index1 < 0)) then CheckIndex(Index1);
Error(SListIndexError, Index1); CheckIndex(Index2);
if ((Index2 >= FCount) or (Index2 < 0)) then
Error(SListIndexError, Index2);
InternalExchange(Index1, Index2); InternalExchange(Index1, Index2);
end; end;
@ -681,10 +685,8 @@ var
CurItem, NewItem, TmpItem, Src, Dest: Pointer; CurItem, NewItem, TmpItem, Src, Dest: Pointer;
MoveCount: Integer; MoveCount: Integer;
begin begin
if (CurIndex < 0) or (CurIndex >= Count) then CheckIndex(CurIndex);
Error(SListIndexError, CurIndex); CheckIndex(NewIndex);
if (NewIndex < 0) or (NewIndex >= Count) then
Error(SListIndexError, NewIndex);
if CurIndex = NewIndex then if CurIndex = NewIndex then
exit; exit;
CurItem := InternalItems[CurIndex]; CurItem := InternalItems[CurIndex];