Просмотр исходного кода

* record/use the code page of string constants typecasted to an ansistring
type with a non-default code page
TODO: ensure that string constants typecasted to ansistring become
ansistrings rather than typeless string constants

git-svn-id: trunk@25207 -

Jonas Maebe 12 лет назад
Родитель
Сommit
fb8fb29574
10 измененных файлов с 73 добавлено и 16 удалено
  1. 1 0
      .gitattributes
  2. 1 1
      compiler/nadd.pas
  3. 1 1
      compiler/ncnv.pas
  4. 24 5
      compiler/ncon.pas
  5. 1 1
      compiler/ninl.pas
  6. 9 3
      compiler/pdecl.pas
  7. 1 1
      compiler/pexpr.pas
  8. 1 1
      compiler/ppu.pas
  9. 6 3
      compiler/symsym.pas
  10. 28 0
      tests/test/tcpstr24.pp

+ 1 - 0
.gitattributes

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

+ 1 - 1
compiler/nadd.pas

@@ -756,7 +756,7 @@ implementation
              case nodetype of
              case nodetype of
                 addn :
                 addn :
                   begin
                   begin
-                    t:=cstringconstnode.createpchar(concatansistrings(s1,s2,l1,l2),l1+l2);
+                    t:=cstringconstnode.createpchar(concatansistrings(s1,s2,l1,l2),l1+l2,nil);
                     typecheckpass(t);
                     typecheckpass(t);
                     tstringconstnode(t).changestringtype(resultdef);
                     tstringconstnode(t).changestringtype(resultdef);
                   end;
                   end;

+ 1 - 1
compiler/ncnv.pas

@@ -1048,7 +1048,7 @@ implementation
                    begin
                    begin
                      pchtemp:=concatansistrings(tstringconstnode(left).value_str,pchar(StringOfChar(#0,arrsize-tstringconstnode(left).len)),tstringconstnode(left).len,arrsize-tstringconstnode(left).len);
                      pchtemp:=concatansistrings(tstringconstnode(left).value_str,pchar(StringOfChar(#0,arrsize-tstringconstnode(left).len)),tstringconstnode(left).len,arrsize-tstringconstnode(left).len);
                      left.free;
                      left.free;
-                     left:=cstringconstnode.createpchar(pchtemp,arrsize);
+                     left:=cstringconstnode.createpchar(pchtemp,arrsize,nil);
                      typecheckpass(left);
                      typecheckpass(left);
                    end;
                    end;
                  exit;
                  exit;

+ 24 - 5
compiler/ncon.pas

@@ -121,9 +121,11 @@ interface
           value_str : pchar;
           value_str : pchar;
           len     : longint;
           len     : longint;
           lab_str : tasmlabel;
           lab_str : tasmlabel;
+          astringdef : tdef;
+          astringdefderef : tderef;
           cst_type : tconststringtype;
           cst_type : tconststringtype;
           constructor createstr(const s : string);virtual;
           constructor createstr(const s : string);virtual;
-          constructor createpchar(s : pchar;l : longint);virtual;
+          constructor createpchar(s: pchar; l: longint; def: tdef);virtual;
           constructor createunistr(w : pcompilerwidestring);virtual;
           constructor createunistr(w : pcompilerwidestring);virtual;
           constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override;
           constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override;
           procedure ppuwrite(ppufile:tcompilerppufile);override;
           procedure ppuwrite(ppufile:tcompilerppufile);override;
@@ -309,7 +311,7 @@ implementation
               getmem(pc,len+1);
               getmem(pc,len+1);
               move(pchar(p.value.valueptr)^,pc^,len);
               move(pchar(p.value.valueptr)^,pc^,len);
               pc[len]:=#0;
               pc[len]:=#0;
-              p1:=cstringconstnode.createpchar(pc,len);
+              p1:=cstringconstnode.createpchar(pc,len,p.constdef);
             end;
             end;
           constwstring :
           constwstring :
             p1:=cstringconstnode.createunistr(pcompilerwidestring(p.value.valueptr));
             p1:=cstringconstnode.createunistr(pcompilerwidestring(p.value.valueptr));
@@ -827,12 +829,19 @@ implementation
       end;
       end;
 
 
 
 
-    constructor tstringconstnode.createpchar(s : pchar;l : longint);
+    constructor tstringconstnode.createpchar(s: pchar; l: longint; def: tdef);
       begin
       begin
          inherited create(stringconstn);
          inherited create(stringconstn);
          len:=l;
          len:=l;
          value_str:=s;
          value_str:=s;
-         cst_type:=cst_conststring;
+         if assigned(def) and
+            is_ansistring(def) then
+           begin
+             cst_type:=cst_ansistring;
+             astringdef:=def;
+           end
+         else
+           cst_type:=cst_conststring;
          lab_str:=nil;
          lab_str:=nil;
       end;
       end;
 
 
@@ -880,6 +889,8 @@ implementation
             value_str[len]:=#0;
             value_str[len]:=#0;
           end;
           end;
         lab_str:=tasmlabel(ppufile.getasmsymbol);
         lab_str:=tasmlabel(ppufile.getasmsymbol);
+        if cst_type=cst_ansistring then
+          ppufile.getderef(astringdefderef);
       end;
       end;
 
 
 
 
@@ -893,18 +904,22 @@ implementation
         else
         else
           ppufile.putdata(value_str^,len);
           ppufile.putdata(value_str^,len);
         ppufile.putasmsymbol(lab_str);
         ppufile.putasmsymbol(lab_str);
+        if cst_type=cst_ansistring then
+          ppufile.putderef(astringdefderef);
       end;
       end;
 
 
 
 
     procedure tstringconstnode.buildderefimpl;
     procedure tstringconstnode.buildderefimpl;
       begin
       begin
         inherited buildderefimpl;
         inherited buildderefimpl;
+        astringdefderef.build(astringdef);
       end;
       end;
 
 
 
 
     procedure tstringconstnode.derefimpl;
     procedure tstringconstnode.derefimpl;
       begin
       begin
         inherited derefimpl;
         inherited derefimpl;
+        astringdef:=tdef(astringdefderef.resolve);
       end;
       end;
 
 
 
 
@@ -925,6 +940,7 @@ implementation
            end
            end
          else
          else
            n.value_str:=getpcharcopy;
            n.value_str:=getpcharcopy;
+         n.astringdef:=astringdef;
          dogetcopy:=n;
          dogetcopy:=n;
       end;
       end;
 
 
@@ -948,7 +964,10 @@ implementation
           cst_shortstring :
           cst_shortstring :
             resultdef:=cshortstringtype;
             resultdef:=cshortstringtype;
           cst_ansistring :
           cst_ansistring :
-            resultdef:=getansistringdef;
+            if not assigned(astringdef) then
+              resultdef:=getansistringdef
+            else
+              resultdef:=astringdef;
           cst_unicodestring :
           cst_unicodestring :
             resultdef:=cunicodestringtype;
             resultdef:=cunicodestringtype;
           cst_widestring :
           cst_widestring :

+ 1 - 1
compiler/ninl.pas

@@ -2537,7 +2537,7 @@ implementation
           encodedtype:='';
           encodedtype:='';
           if not objctryencodetype(left.resultdef,encodedtype,errordef) then
           if not objctryencodetype(left.resultdef,encodedtype,errordef) then
             Message1(type_e_objc_type_unsupported,errordef.typename);
             Message1(type_e_objc_type_unsupported,errordef.typename);
-          result:=cstringconstnode.createpchar(ansistring2pchar(encodedtype),length(encodedtype));
+          result:=cstringconstnode.createpchar(ansistring2pchar(encodedtype),length(encodedtype),nil);
         end;
         end;
 
 
 
 

+ 9 - 3
compiler/pdecl.pas

@@ -109,7 +109,13 @@ implementation
                  begin
                  begin
                    getmem(sp,tstringconstnode(p).len+1);
                    getmem(sp,tstringconstnode(p).len+1);
                    move(tstringconstnode(p).value_str^,sp^,tstringconstnode(p).len+1);
                    move(tstringconstnode(p).value_str^,sp^,tstringconstnode(p).len+1);
-                   hp:=tconstsym.create_string(orgname,conststring,sp,tstringconstnode(p).len);
+                   { if a non-default ansistring code page has been specified,
+                     keep it }
+                   if is_ansistring(p.resultdef) and
+                      (tstringdef(p.resultdef).encoding<>0) then
+                     hp:=tconstsym.create_string(orgname,conststring,sp,tstringconstnode(p).len,p.resultdef)
+                   else
+                     hp:=tconstsym.create_string(orgname,conststring,sp,tstringconstnode(p).len,nil);
                  end;
                  end;
              end;
              end;
            realconstn :
            realconstn :
@@ -942,7 +948,7 @@ implementation
                                 getmem(sp,2);
                                 getmem(sp,2);
                                 sp[0]:=chr(tordconstnode(p).value.svalue);
                                 sp[0]:=chr(tordconstnode(p).value.svalue);
                                 sp[1]:=#0;
                                 sp[1]:=#0;
-                                sym:=tconstsym.create_string(orgname,constresourcestring,sp,1);
+                                sym:=tconstsym.create_string(orgname,constresourcestring,sp,1,nil);
                              end
                              end
                            else
                            else
                              Message(parser_e_illegal_expression);
                              Message(parser_e_illegal_expression);
@@ -952,7 +958,7 @@ implementation
                           begin
                           begin
                              getmem(sp,len+1);
                              getmem(sp,len+1);
                              move(value_str^,sp^,len+1);
                              move(value_str^,sp^,len+1);
-                             sym:=tconstsym.create_string(orgname,constresourcestring,sp,len);
+                             sym:=tconstsym.create_string(orgname,constresourcestring,sp,len,nil);
                           end;
                           end;
                       else
                       else
                         Message(parser_e_illegal_expression);
                         Message(parser_e_illegal_expression);

+ 1 - 1
compiler/pexpr.pas

@@ -3112,7 +3112,7 @@ implementation
 
 
              _CSTRING :
              _CSTRING :
                begin
                begin
-                 p1:=cstringconstnode.createpchar(ansistring2pchar(cstringpattern),length(cstringpattern));
+                 p1:=cstringconstnode.createpchar(ansistring2pchar(cstringpattern),length(cstringpattern),nil);
                  consume(_CSTRING);
                  consume(_CSTRING);
                  if token in postfixoperator_tokens then
                  if token in postfixoperator_tokens then
                    begin
                    begin

+ 1 - 1
compiler/ppu.pas

@@ -43,7 +43,7 @@ type
 {$endif Test_Double_checksum}
 {$endif Test_Double_checksum}
 
 
 const
 const
-  CurrentPPUVersion = 161;
+  CurrentPPUVersion = 162;
 
 
 { buffer sizes }
 { buffer sizes }
   maxentrysize = 1024;
   maxentrysize = 1024;

+ 6 - 3
compiler/symsym.pas

@@ -312,7 +312,7 @@ interface
           constructor create_ord(const n : string;t : tconsttyp;v : tconstexprint;def:tdef);
           constructor create_ord(const n : string;t : tconsttyp;v : tconstexprint;def:tdef);
           constructor create_ordptr(const n : string;t : tconsttyp;v : tconstptruint;def:tdef);
           constructor create_ordptr(const n : string;t : tconsttyp;v : tconstptruint;def:tdef);
           constructor create_ptr(const n : string;t : tconsttyp;v : pointer;def:tdef);
           constructor create_ptr(const n : string;t : tconsttyp;v : pointer;def:tdef);
-          constructor create_string(const n : string;t : tconsttyp;str:pchar;l:longint);
+          constructor create_string(const n : string;t : tconsttyp;str:pchar;l:longint;def:tdef);
           constructor create_wstring(const n : string;t : tconsttyp;pw:pcompilerwidestring);
           constructor create_wstring(const n : string;t : tconsttyp;pw:pcompilerwidestring);
           constructor ppuload(ppufile:tcompilerppufile);
           constructor ppuload(ppufile:tcompilerppufile);
           destructor  destroy;override;
           destructor  destroy;override;
@@ -2149,13 +2149,16 @@ implementation
       end;
       end;
 
 
 
 
-    constructor tconstsym.create_string(const n : string;t : tconsttyp;str:pchar;l:longint);
+    constructor tconstsym.create_string(const n : string;t : tconsttyp;str:pchar;l:longint;def: tdef);
       begin
       begin
          inherited create(constsym,n);
          inherited create(constsym,n);
          fillchar(value, sizeof(value), #0);
          fillchar(value, sizeof(value), #0);
          consttyp:=t;
          consttyp:=t;
          value.valueptr:=str;
          value.valueptr:=str;
-         constdef:=getarraydef(cansichartype,l);
+         if assigned(def) then
+           constdef:=def
+         else
+           constdef:=getarraydef(cansichartype,l);
          value.len:=l;
          value.len:=l;
       end;
       end;
 
 

+ 28 - 0
tests/test/tcpstr24.pp

@@ -0,0 +1,28 @@
+{$codepage utf8}
+
+
+type
+  str866 = type ansistring(866);
+const
+  x = utf8string('abcdef');
+  y = utf8string('®†◊√');
+  z = str866('abc');
+
+procedure test(const x: shortstring);
+begin
+  writeln('shortstring!');
+  halt(1);
+end;
+
+procedure test(const x: rawbytestring; cp: tsystemcodepage);
+begin
+  writeln('ansistring(',stringcodepage(x),')');
+  if stringcodepage(x)<>cp then
+    halt(2);
+end;
+
+begin
+  test(x,CP_UTF8);
+  test(y,CP_UTF8);
+  test(z,866);
+end.