Преглед на файлове

RTL, wide/unicode strings cleanup:
- Removed outdated debugging code
- Removed DefaultWide2AnsiMove, using DefaultUnicode2AnsiMove instead.
- Removed unnecessary operations like SetLength before widestringmanager conversion calls and null-termination afterwards.
- Removed setting pointer to nil after fpc_wide/unicodestr_decr_ref.

git-svn-id: trunk@20231 -

sergei преди 13 години
родител
ревизия
8d26b3358f
променени са 3 файла, в които са добавени 29 реда и са изтрити 115 реда
  1. 18 52
      rtl/inc/ustrings.inc
  2. 0 1
      rtl/inc/wstringh.inc
  3. 11 62
      rtl/inc/wstrings.inc

+ 18 - 52
rtl/inc/ustrings.inc

@@ -162,23 +162,6 @@ procedure UnicodeStringError;
   end;
 
 
-{$ifdef UnicodeStrDebug}
-Procedure DumpUnicodeRec(S : Pointer);
-begin
-  If S=Nil then
-    Writeln ('String is nil')
-  Else
-    Begin
-      With PUnicodeRec(S-UnicodeFirstOff)^ do
-       begin
-         Write   ('(Len:',len);
-         Writeln (' Ref: ',ref,')');
-       end;
-    end;
-end;
-{$endif}
-
-
 Function NewUnicodeString(Len : SizeInt) : Pointer;
 {
   Allocate a new UnicodeString on the heap.
@@ -271,11 +254,7 @@ begin
   result:='';
   Size:=Length(S2);
   if Size>0 then
-    begin
-      widestringmanager.Ansi2UnicodeMoveProc(PChar(@S2[1]),DefaultSystemCodePage,result,Size);
-      { Terminating Zero }
-      PUnicodeChar(Pointer(fpc_ShortStr_To_UnicodeStr)+Size*sizeof(UnicodeChar))^:=#0;
-    end;
+    widestringmanager.Ansi2UnicodeMoveProc(PChar(@S2[1]),DefaultSystemCodePage,result,Size);
 end;
 
 
@@ -715,7 +694,6 @@ begin
     end
   else
     i:=high(arr)+1;
-  SetLength(fpc_CharArray_To_UnicodeStr,i);
   widestringmanager.Ansi2UnicodeMoveProc(pchar(@arr),DefaultSystemCodePage,fpc_CharArray_To_UnicodeStr,i);
 end;
 
@@ -764,7 +742,6 @@ begin
     end
   else
     i := high(arr)+1;
-  SetLength(fpc_UnicodeCharArray_To_AnsiStr,i);
   widestringmanager.Unicode2AnsiMoveProc (punicodechar(@arr),fpc_UnicodeCharArray_To_AnsiStr,cp,i);
 end;
 
@@ -849,7 +826,6 @@ begin
     end
   else
     i := high(arr)+1;
-  SetLength(fpc_WideCharArray_To_AnsiStr,i);
   widestringmanager.Wide2AnsiMoveProc (pwidechar(@arr),fpc_WideCharArray_To_AnsiStr,cp,i);
 end;
 
@@ -1089,17 +1065,19 @@ begin
       else
         if (PUnicodeRec(Pointer(S)-UnicodeFirstOff)^.Ref = 1) then
           begin
-            Dec(Pointer(S),UnicodeFirstOff);
-            lens:=MemSize(Pointer(s));
+            Temp:=Pointer(s)-UnicodeFirstOff;
+            lens:=MemSize(Temp);
             lena:=SizeUInt(L*sizeof(UnicodeChar)+UnicodeRecLen);
             if (lena>lens) or ((lens>32) and (lena<=(lens div 2))) then
-              reallocmem(pointer(S), lena);
-            Inc(Pointer(S), UnicodeFirstOff);
-        end
+              begin
+                reallocmem(Temp, lena);
+                Pointer(S):=Temp+UnicodeFirstOff;
+              end;
+          end
       else
         begin
           { Reallocation is needed... }
-          Temp:=Pointer(NewUnicodeString(L));
+          Temp:=NewUnicodeString(L);
           if Length(S)>0 then
             begin
               if l < succ(length(s)) then
@@ -1116,13 +1094,8 @@ begin
       PWord(Pointer(S)+l*sizeof(UnicodeChar))^:=0;
       PUnicodeRec(Pointer(S)-UnicodeFirstOff)^.Len:=l;
     end
-  else
-    begin
-      { Length=0 }
-      if Pointer(S)<>nil then
-        fpc_unicodestr_decr_ref (Pointer(S));
-      Pointer(S):=Nil;
-    end;
+  else  { length=0, deallocate the string }
+    fpc_unicodestr_decr_ref (Pointer(S));
 end;
 
 {*****************************************************************************
@@ -1270,15 +1243,10 @@ begin
    Size:=Length(S)-Index;
   If Size>0 then
    begin
-     If Index<0 Then
-      Index:=0;
-     ResultAddress:=Pointer(NewUnicodeString (Size));
-     if ResultAddress<>Nil then
-      begin
-        Move (PUnicodeChar(S)[Index],ResultAddress^,Size*sizeof(UnicodeChar));
-        PUnicodeRec(ResultAddress-UnicodeFirstOff)^.Len:=Size;
-        PUnicodeChar(ResultAddress+Size*sizeof(UnicodeChar))^:=#0;
-      end;
+     ResultAddress:=NewUnicodeString(Size);
+     Move (PUnicodeChar(S)[Index],ResultAddress^,Size*sizeof(UnicodeChar));
+     PUnicodeRec(ResultAddress-UnicodeFirstOff)^.Len:=Size;
+     PUnicodeChar(ResultAddress+Size*sizeof(UnicodeChar))^:=#0;
    end;
   fpc_unicodestr_decr_ref(Pointer(fpc_unicodestr_copy));
   Pointer(fpc_unicodestr_Copy):=ResultAddress;
@@ -1409,7 +1377,6 @@ begin
   if index > LS then
    index := LS+1;
   Dec(Index);
-  Pointer(Temp) := NewUnicodeString(Length(Source)+LS);
   SetLength(Temp,Length(Source)+LS);
   If Index>0 then
     move (PUnicodeChar(S)^,PUnicodeChar(Temp)^,Index*sizeof(UnicodeChar));
@@ -1444,12 +1411,11 @@ end;
 
 
 Procedure SetString (Out S : UnicodeString; Buf : PChar; Len : SizeInt);
-var
-  BufLen: SizeInt;
 begin
-  SetLength(S,Len);
   If (Buf<>Nil) and (Len>0) then
-    widestringmanager.Ansi2UnicodeMoveProc(Buf,DefaultSystemCodePage,S,Len);
+    widestringmanager.Ansi2UnicodeMoveProc(Buf,DefaultSystemCodePage,S,Len)
+  else
+    SetLength(S,Len);
 end;
 
 

+ 0 - 1
rtl/inc/wstringh.inc

@@ -31,7 +31,6 @@ Procedure Delete (Var S : WideString; Index,Size: SizeInt);
 Procedure SetString (Out S : WideString; Buf : PWideChar; Len : SizeInt);
 Procedure SetString (Out S : WideString; Buf : PChar; Len : SizeInt);
 
-procedure DefaultWide2AnsiMove(source:pwidechar;var dest:ansistring;cp : TSystemCodePage;len:SizeInt);
 procedure DefaultAnsi2WideMove(source:pchar;cp : TSystemCodePage;var dest:widestring;len:SizeInt);
 
 type

+ 11 - 62
rtl/inc/wstrings.inc

@@ -50,25 +50,6 @@ Const
   These routines can be overwritten for the Current Locale
 }
 
-procedure DefaultWide2AnsiMove(source:pwidechar;var dest:ansistring;cp : TSystemCodePage;len:SizeInt);
-var
-  i : SizeInt;
-  destp: PChar;
-begin
-  setlength(dest,len);
-  destp := PChar(Pointer(dest));
-  for i:=1 to len do
-    begin
-      if word(source^)<256 then
-        destp^:=char(word(source^))
-      else
-        destp^:='?';
-      inc(source);
-      inc(destp);
-    end;
-end;
-
-
 procedure DefaultAnsi2WideMove(source:pchar;cp : TSystemCodePage;var dest:widestring;len:SizeInt);
 var
   i : SizeInt;
@@ -93,23 +74,6 @@ procedure WideStringError;
   end;
 
 
-{$ifdef WideStrDebug}
-Procedure DumpWideRec(S : Pointer);
-begin
-  If S=Nil then
-    Writeln ('String is nil')
-  Else
-    Begin
-      With PWideRec(S-WideFirstOff)^ do
-       begin
-         Write   ('(Len:',len);
-         Writeln (' Ref: ',ref,')');
-       end;
-    end;
-end;
-{$endif}
-
-
 Function NewWideString(Len : SizeInt) : Pointer;
 {
   Allocate a new WideString on the heap.
@@ -294,11 +258,7 @@ begin
           end;
     end
   else
-    begin
-      { Free S1 }
-      fpc_widestr_decr_ref (S1);
-      S1:=nil;
-    end;
+    fpc_widestr_decr_ref (S1);  // will set S1 to nil
 end;
 
 
@@ -618,13 +578,8 @@ begin
 {$endif MSWINDOWS}
         PWideRec(Pointer(S)-WideFirstOff)^.Len:=l*sizeof(WideChar);
     end
-  else
-    begin
-      { Length=0 }
-      if Pointer(S)<>nil then
-        fpc_widestr_decr_ref (Pointer(S));
-      Pointer(S):=Nil;
-    end;
+  else  // length=0, deallocate the string
+    fpc_widestr_decr_ref (Pointer(S));
 end;
 
 {*****************************************************************************
@@ -652,15 +607,10 @@ begin
    Size:=Length(S)-Index;
   If Size>0 then
    begin
-     If Index<0 Then
-      Index:=0;
-     ResultAddress:=Pointer(NewWideString (Size));
-     if ResultAddress<>Nil then
-      begin
-        Move (PWideChar(S)[Index],ResultAddress^,Size*sizeof(WideChar));
-        PWideRec(ResultAddress-WideFirstOff)^.Len:=Size*sizeof(WideChar);
-        PWideChar(ResultAddress+Size*sizeof(WideChar))^:=#0;
-      end;
+     { NewWideString won't return a nil pointer }
+     ResultAddress:=NewWideString(Size);
+     Move (PWideChar(S)[Index],ResultAddress^,Size*sizeof(WideChar));
+     PWideChar(ResultAddress+Size*sizeof(WideChar))^:=#0;
    end;
   fpc_widestr_decr_ref(Pointer(fpc_widestr_copy));
   Pointer(fpc_widestr_Copy):=ResultAddress;
@@ -771,7 +721,6 @@ begin
   if (Index>LS) or (Index<=0) or (Size<=0) then
     exit;
 
-  UniqueString (S);
   { (Size+Index) will overflow if Size=MaxInt. }
   if Size>LS-Index then
     Size:=LS-Index+1;
@@ -797,7 +746,6 @@ begin
   if index > LS then
    index := LS+1;
   Dec(Index);
-  Pointer(Temp) := NewWideString(Length(Source)+LS);
   SetLength(Temp,Length(Source)+LS);
   If Index>0 then
     move (PWideChar(S)^,PWideChar(Temp)^,Index*sizeof(WideChar));
@@ -824,9 +772,10 @@ end;
 
 Procedure SetString (Out S : WideString; Buf : PChar; Len : SizeInt);
 begin
-  SetLength(S,Len);
   If (Buf<>Nil) and (Len>0) then
-    widestringmanager.Ansi2WideMoveProc(Buf,DefaultSystemCodePage,S,Len);
+    widestringmanager.Ansi2WideMoveProc(Buf,DefaultSystemCodePage,S,Len)
+  else
+    SetLength(s,len);
 end;
 
 
@@ -1509,7 +1458,7 @@ procedure initwidestringmanager;
   begin
     fillchar(widestringmanager,sizeof(widestringmanager),0);
 {$ifndef HAS_WIDESTRINGMANAGER}
-    widestringmanager.Wide2AnsiMoveProc:=@DefaultWide2AnsiMove;
+    widestringmanager.Wide2AnsiMoveProc:=@DefaultUnicode2AnsiMove;
     widestringmanager.Ansi2WideMoveProc:=@DefaultAnsi2WideMove;
     widestringmanager.UpperWideStringProc:=@GenericWideCase;
     widestringmanager.LowerWideStringProc:=@GenericWideCase;