瀏覽代碼

* 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 WideStringToUCS4String(const s : WideString) : UCS4String;
 function UCS4StringToWideString(const s : UCS4String) : WideString;
 function UCS4StringToWideString(const s : UCS4String) : WideString;
 
 
+{$ifdef MSWINDOWS}
+const
+  winwidestringalloc : boolean = true;
+{$endif MSWINDOWS}
+
 var
 var
   widestringmanager : TWideStringManager;
   widestringmanager : TWideStringManager;
 
 

+ 13 - 9
rtl/inc/wstrings.inc

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