From e27ea76b8887c6d4c597054edf5beddc40100867 Mon Sep 17 00:00:00 2001 From: Sergey Larin Date: Fri, 6 Aug 2021 10:54:26 +0300 Subject: [PATCH] The TStream.ReadBuffer and TStream.WriteBuffer methods have changed the Count parameter type to NativeInt. Changed the implementation of ReadBuffer, WriteBuffer so that the size of the blocks when calling Read and Write does not exceed High(Longint). Notes: - Thanks to this change, for example, a file larger than 2GB can be loaded into TMemoryStream. - The fact that the Count parameter has the NativeInt type is compatible with the latest versions of Delphi. --- rtl/objpas/classes/classesh.inc | 4 ++-- rtl/objpas/classes/streams.inc | 40 ++++++++++++++++----------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/rtl/objpas/classes/classesh.inc b/rtl/objpas/classes/classesh.inc index d03cca3428..9925b99f6d 100644 --- a/rtl/objpas/classes/classesh.inc +++ b/rtl/objpas/classes/classesh.inc @@ -999,7 +999,7 @@ type function ReadData(var Buffer: TExtended80Rec): NativeInt; overload; function ReadData(var Buffer: TExtended80Rec; Count: NativeInt): NativeInt; overload; {$ENDIF} - procedure ReadBuffer(var Buffer; Count: Longint); + procedure ReadBuffer(var Buffer; Count: NativeInt); procedure ReadBuffer(var Buffer: TBytes; Count: NativeInt); overload; procedure ReadBuffer(var Buffer: TBytes; Offset, Count: NativeInt); overload; @@ -1035,7 +1035,7 @@ type procedure ReadBufferData(var Buffer: TExtended80Rec); overload; procedure ReadBufferData(var Buffer: TExtended80Rec; Count: NativeInt); overload; {$ENDIF} - procedure WriteBuffer(const Buffer; Count: Longint); + procedure WriteBuffer(const Buffer; Count: NativeInt); procedure WriteBuffer(const Buffer: TBytes; Count: NativeInt); overload; procedure WriteBuffer(const Buffer: TBytes; Offset, Count: NativeInt); overload; diff --git a/rtl/objpas/classes/streams.inc b/rtl/objpas/classes/streams.inc index 5e5ac06769..9de20eca56 100644 --- a/rtl/objpas/classes/streams.inc +++ b/rtl/objpas/classes/streams.inc @@ -404,19 +404,19 @@ begin end; {$ENDIF} -procedure TStream.ReadBuffer(var Buffer; Count: Longint); - -Var - r,t : longint; - +procedure TStream.ReadBuffer(var Buffer; Count: NativeInt); +var + r,t: NativeInt; begin t:=0; repeat - r:=Read(PByte(@Buffer)[t],Count-t); + r:=Count-t; + if r>High(Longint) then r:=High(Longint); + r:=Read(PByte(@Buffer)[t],r); inc(t,r); until (t=Count) or (r<=0); if (tHigh(Longint) then w:=High(Longint); + w:=Write(PByte(@Buffer)[t],w); + inc(t,w); + until (t=count) or (w<=0); + if (t