Selaa lähdekoodia

* never change the code page of a non-empty string when calling setlength on
it

git-svn-id: branches/cpstrrtl@25298 -

Jonas Maebe 12 vuotta sitten
vanhempi
commit
b115231ea4
3 muutettua tiedostoa jossa 22 lisäystä ja 6 poistoa
  1. 1 0
      .gitattributes
  2. 7 6
      rtl/inc/astrings.inc
  3. 14 0
      tests/test/tcpstr25.pp

+ 1 - 0
.gitattributes

@@ -11007,6 +11007,7 @@ tests/test/tcpstr21a.pp svneol=native#text/pascal
 tests/test/tcpstr22.pp svneol=native#text/pascal
 tests/test/tcpstr23.pp svneol=native#text/pascal
 tests/test/tcpstr24.pp svneol=native#text/plain
+tests/test/tcpstr25.pp svneol=native#text/plain
 tests/test/tcpstr2a.pp svneol=native#text/plain
 tests/test/tcpstr3.pp svneol=native#text/plain
 tests/test/tcpstr4.pp svneol=native#text/plain

+ 7 - 6
rtl/inc/astrings.inc

@@ -764,6 +764,12 @@ begin
       if Pointer(S)=nil then
         begin
           Pointer(S):=NewAnsiString(L);
+{$ifdef FPC_HAS_CPSTRING}
+          cp:=TranslatePlaceholderCP(cp);
+          PAnsiRec(Pointer(S)-AnsiFirstOff)^.CodePage:=cp;
+{$else}
+          PAnsiRec(Pointer(S)-AnsiFirstOff)^.CodePage:=DefaultSystemCodePage;
+{$endif FPC_HAS_CPSTRING}
         end
       else if PAnsiRec(Pointer(S)-AnsiFirstOff)^.Ref=1 then
         begin
@@ -781,6 +787,7 @@ begin
         begin
           { Reallocation is needed... }
           Temp:=NewAnsiString(L);
+          PAnsiRec(Pointer(Temp)-AnsiFirstOff)^.CodePage:=PAnsiRec(Pointer(S)-AnsiFirstOff)^.CodePage;
           { also move terminating null }
           lens:=succ(length(s));
           if l<lens then
@@ -791,12 +798,6 @@ begin
           fpc_ansistr_decr_ref(Pointer(s));
           Pointer(S):=Temp;
         end;
-{$ifdef FPC_HAS_CPSTRING}
-      cp:=TranslatePlaceholderCP(cp);
-      PAnsiRec(Pointer(S)-AnsiFirstOff)^.CodePage:=cp;
-{$else}
-      PAnsiRec(Pointer(S)-AnsiFirstOff)^.CodePage:=DefaultSystemCodePage;
-{$endif FPC_HAS_CPSTRING}
       { Force nil termination in case it gets shorter }
       PByte(Pointer(S)+l)^:=0;
       PAnsiRec(Pointer(S)-AnsiFirstOff)^.Len:=l;

+ 14 - 0
tests/test/tcpstr25.pp

@@ -0,0 +1,14 @@
+var
+ r: rawbytestring;
+begin
+ r:='abc';
+ setcodepage(r,850);
+ setlength(r,length(r)+1);
+ if stringcodepage(r)<>850 then
+   halt(1);
+ setcodepage(r,437);
+ setlength(r,length(r)+1000);
+ if stringcodepage(r)<>437 then
+   halt(2);
+end.
+