فهرست منبع

* add winwidestringalloc boolean, set it to false to use the fpc
heapmanager to allocate widestrings

git-svn-id: trunk@1306 -

peter 20 سال پیش
والد
کامیت
cc38ec676e
2فایلهای تغییر یافته به همراه18 افزوده شده و 9 حذف شده
  1. 5 0
      rtl/inc/wstringh.inc
  2. 13 9
      rtl/inc/wstrings.inc

+ 5 - 0
rtl/inc/wstringh.inc

@@ -85,6 +85,11 @@ function Utf8ToAnsi(const s : UTF8String) : ansistring;{$ifdef SYSTEMINLINE}inli
 function WideStringToUCS4String(const s : WideString) : UCS4String;
 function UCS4StringToWideString(const s : UCS4String) : WideString;
 
+{$ifdef MSWINDOWS}
+const
+  winwidestringalloc : boolean = true;
+{$endif MSWINDOWS}
+
 var
   widestringmanager : TWideStringManager;
 

+ 13 - 9
rtl/inc/wstrings.inc

@@ -151,10 +151,11 @@ Var
   P : Pointer;
 begin
 {$ifdef MSWINDOWS}
-  P:=SysAllocStringLen(nil,Len*sizeof(WideChar)+WideRecLen);
-{$else MSWINDOWS}
-  GetMem(P,Len*sizeof(WideChar)+WideRecLen);
+  if winwidestringalloc then
+    P:=SysAllocStringLen(nil,Len*sizeof(WideChar)+WideRecLen)
+  else
 {$endif MSWINDOWS}
+    GetMem(P,Len*sizeof(WideChar)+WideRecLen);
   If P<>Nil then
     begin
      PWideRec(P)^.Len:=0;         { Initial length }
@@ -177,10 +178,11 @@ begin
     exit;
   Dec (S,WideFirstOff);
 {$ifdef MSWINDOWS}
-  SysFreeString(S);
-{$else MSWINDOWS}
-  FreeMem (S);
+  if winwidestringalloc then
+    SysFreeString(S)
+  else
 {$endif MSWINDOWS}
+    FreeMem (S);
   S:=Nil;
 end;
 
@@ -627,15 +629,17 @@ begin
       { windows doesn't support reallocing widestrings, this code
         is anyways subject to be removed because widestrings shouldn't be
         ref. counted anymore (FK) }
-{$ifndef MSWINDOWS}
-      else if (PWideRec(Pointer(S)-WideFirstOff)^.Ref = 1) then
+      else if
+{$ifdef MSWINDOWS}
+              not winwidestringalloc and
+{$endif MSWINDOWS}
+              (PWideRec(Pointer(S)-WideFirstOff)^.Ref = 1) then
         begin
           Dec(Pointer(S),WideFirstOff);
           if L*sizeof(WideChar)+WideRecLen>MemSize(Pointer(S)) then
               reallocmem(pointer(S), L*sizeof(WideChar)+WideRecLen);
           Inc(Pointer(S), WideFirstOff);
         end
-{$endif MSWINDOWS}
       else
         begin
           { Reallocation is needed... }