Переглянути джерело

* fixed widechar to shortstring conversion after r8898 (webtbs/tw7758)

git-svn-id: trunk@8908 -
Jonas Maebe 18 роки тому
батько
коміт
0aba0acdf6
1 змінених файлів з 28 додано та 11 видалено
  1. 28 11
      compiler/ncnv.pas

+ 28 - 11
compiler/ncnv.pas

@@ -967,6 +967,9 @@ implementation
          para : tcallparanode;
          hp : tstringconstnode;
          ws : pcompilerwidestring;
+         newblock : tblocknode;
+         newstat  : tstatementnode;
+         restemp  : ttempcreatenode;
 
       begin
          result:=nil;
@@ -1003,19 +1006,33 @@ implementation
            if (tstringdef(resultdef).stringtype <> st_shortstring) or
               (torddef(left.resultdef).ordtype = uwidechar) then
              begin
-               { create the procname }
-               if torddef(left.resultdef).ordtype<>uwidechar then
-                 procname := 'fpc_char_to_'
+               if (tstringdef(resultdef).stringtype <> st_shortstring) then
+                 begin
+                   { create the procname }
+                   if torddef(left.resultdef).ordtype<>uwidechar then
+                     procname := 'fpc_char_to_'
+                   else
+                     procname := 'fpc_wchar_to_';
+                   procname:=procname+tstringdef(resultdef).stringtypname;
+
+                   { and the parameter }
+                   para := ccallparanode.create(left,nil);
+
+                   { and finally the call }
+                   result := ccallnode.createinternres(procname,para,resultdef);
+                 end
                else
-                 procname := 'fpc_wchar_to_';
-               procname:=procname+tstringdef(resultdef).stringtypname;
-
-               { and the parameter }
-               para := ccallparanode.create(left,nil);
+                 begin
+                   newblock:=internalstatements(newstat);
+                   restemp:=ctempcreatenode.create(resultdef,resultdef.size,tt_persistent,false);
+                   addstatement(newstat,restemp);
+                   addstatement(newstat,ccallnode.createintern('fpc_wchar_to_shortstr',ccallparanode.create(left,ccallparanode.create(
+                     ctemprefnode.create(restemp),nil))));
+                   addstatement(newstat,ctempdeletenode.create_normal_temp(restemp));
+                   addstatement(newstat,ctemprefnode.create(restemp));
+                   result:=newblock;
+                 end;
                left := nil;
-
-               { and finally the call }
-               result := ccallnode.createinternres(procname,para,resultdef);
              end
            else
              begin