فهرست منبع

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.

Sergey Larin 4 سال پیش
والد
کامیت
e27ea76b88
2فایلهای تغییر یافته به همراه22 افزوده شده و 22 حذف شده
  1. 2 2
      rtl/objpas/classes/classesh.inc
  2. 20 20
      rtl/objpas/classes/streams.inc

+ 2 - 2
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;
 

+ 20 - 20
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 (t<Count) then
-    Raise EReadError.Create(SReadError);
+    raise EReadError.Create(SReadError);
 end;
 
 procedure TStream.ReadBuffer(var Buffer: TBytes; Count: NativeInt);
@@ -581,20 +581,20 @@ begin
 end;
 {$ENDIF}
 
-procedure TStream.WriteBuffer(const Buffer; Count: Longint);
-
+procedure TStream.WriteBuffer(const Buffer; Count: NativeInt);
 var
-  r,t : Longint;
-
-  begin
-    T:=0;
-    Repeat
-       r:=Write(PByte(@Buffer)[t],Count-t);
-       inc(t,r);
-    Until (t=count) or (r<=0);
-    if (t<Count) then
-       Raise EWriteError.Create(SWriteError);
-  end;
+  w,t: NativeInt;
+begin
+  t:=0;
+  repeat
+    w:=Count-t;
+    if w>High(Longint) then w:=High(Longint);
+    w:=Write(PByte(@Buffer)[t],w);
+    inc(t,w);
+  until (t=count) or (w<=0);
+  if (t<Count) then
+    raise EWriteError.Create(SWriteError);
+end;
 
 procedure TStream.WriteBuffer(const Buffer: TBytes; Count: NativeInt);
 begin