|
@@ -215,7 +215,7 @@ interface
|
|
|
implementation
|
|
|
|
|
|
uses
|
|
|
- cclasses,globtype,systems,constexp,
|
|
|
+ globtype,systems,constexp,
|
|
|
cutils,verbose,globals,widestr,
|
|
|
symconst,symdef,symsym,symbase,symtable,
|
|
|
ncon,ncal,nset,nadd,ninl,nmem,nmat,nbas,nutils,
|
|
@@ -822,17 +822,35 @@ implementation
|
|
|
function ttypeconvnode.typecheck_chararray_to_string : tnode;
|
|
|
var
|
|
|
chartype : string[8];
|
|
|
+ newblock : tblocknode;
|
|
|
+ newstat : tstatementnode;
|
|
|
+ restemp : ttempcreatenode;
|
|
|
begin
|
|
|
if is_widechar(tarraydef(left.resultdef).elementdef) then
|
|
|
chartype:='widechar'
|
|
|
else
|
|
|
chartype:='char';
|
|
|
- result := ccallnode.createinternres(
|
|
|
- 'fpc_'+chartype+'array_to_'+tstringdef(resultdef).stringtypname,
|
|
|
- ccallparanode.create(cordconstnode.create(
|
|
|
- ord(tarraydef(left.resultdef).lowrange=0),booltype,false),
|
|
|
- ccallparanode.create(left,nil)),resultdef);
|
|
|
- left := nil;
|
|
|
+ if tstringdef(resultdef).stringtype=st_shortstring then
|
|
|
+ begin
|
|
|
+ newblock:=internalstatements(newstat);
|
|
|
+ restemp:=ctempcreatenode.create(resultdef,resultdef.size,tt_persistent,false);
|
|
|
+ addstatement(newstat,restemp);
|
|
|
+ addstatement(newstat,ccallnode.createintern('fpc_'+chartype+'array_to_shortstr',
|
|
|
+ ccallparanode.create(cordconstnode.create(
|
|
|
+ ord(tarraydef(left.resultdef).lowrange=0),booltype,false),
|
|
|
+ ccallparanode.create(left,ccallparanode.create(
|
|
|
+ ctemprefnode.create(restemp),nil)))));
|
|
|
+ addstatement(newstat,ctempdeletenode.create_normal_temp(restemp));
|
|
|
+ addstatement(newstat,ctemprefnode.create(restemp));
|
|
|
+ result:=newblock;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ result:=ccallnode.createinternres(
|
|
|
+ 'fpc_'+chartype+'array_to_'+tstringdef(resultdef).stringtypname,
|
|
|
+ ccallparanode.create(cordconstnode.create(
|
|
|
+ ord(tarraydef(left.resultdef).lowrange=0),booltype,false),
|
|
|
+ ccallparanode.create(left,nil)),resultdef);
|
|
|
+ left:=nil;
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -900,11 +918,11 @@ implementation
|
|
|
|
|
|
|
|
|
function ttypeconvnode.typecheck_string_to_string : tnode;
|
|
|
-
|
|
|
var
|
|
|
procname: string[31];
|
|
|
- stringpara : tcallparanode;
|
|
|
-
|
|
|
+ newblock : tblocknode;
|
|
|
+ newstat : tstatementnode;
|
|
|
+ restemp : ttempcreatenode;
|
|
|
begin
|
|
|
result:=nil;
|
|
|
if (left.nodetype=stringconstn) and
|
|
@@ -924,18 +942,20 @@ implementation
|
|
|
procname := 'fpc_'+tstringdef(left.resultdef).stringtypname+
|
|
|
'_to_'+tstringdef(resultdef).stringtypname;
|
|
|
|
|
|
- { create parameter (and remove left node from typeconvnode }
|
|
|
- { since it's reused as parameter) }
|
|
|
- stringpara := ccallparanode.create(left,nil);
|
|
|
- left := nil;
|
|
|
-
|
|
|
- { when converting to shortstrings, we have to pass high(destination) too }
|
|
|
- if (tstringdef(resultdef).stringtype = st_shortstring) then
|
|
|
- stringpara.right := ccallparanode.create(cinlinenode.create(
|
|
|
- in_high_x,false,self.getcopy),nil);
|
|
|
-
|
|
|
- { and create the callnode }
|
|
|
- result := ccallnode.createinternres(procname,stringpara,resultdef);
|
|
|
+ if tstringdef(resultdef).stringtype=st_shortstring then
|
|
|
+ begin
|
|
|
+ newblock:=internalstatements(newstat);
|
|
|
+ restemp:=ctempcreatenode.create(resultdef,resultdef.size,tt_persistent,false);
|
|
|
+ addstatement(newstat,restemp);
|
|
|
+ addstatement(newstat,ccallnode.createintern(procname,ccallparanode.create(left,ccallparanode.create(
|
|
|
+ ctemprefnode.create(restemp),nil))));
|
|
|
+ addstatement(newstat,ctempdeletenode.create_normal_temp(restemp));
|
|
|
+ addstatement(newstat,ctemprefnode.create(restemp));
|
|
|
+ result:=newblock;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ result := ccallnode.createinternres(procname,ccallparanode.create(left,nil),resultdef);
|
|
|
+ left:=nil;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
@@ -1280,11 +1300,27 @@ implementation
|
|
|
|
|
|
|
|
|
function ttypeconvnode.typecheck_pchar_to_string : tnode;
|
|
|
+ var
|
|
|
+ newblock : tblocknode;
|
|
|
+ newstat : tstatementnode;
|
|
|
+ restemp : ttempcreatenode;
|
|
|
begin
|
|
|
- result := ccallnode.createinternres(
|
|
|
- 'fpc_pchar_to_'+tstringdef(resultdef).stringtypname,
|
|
|
- ccallparanode.create(left,nil),resultdef);
|
|
|
- left := nil;
|
|
|
+ if tstringdef(resultdef).stringtype=st_shortstring then
|
|
|
+ begin
|
|
|
+ newblock:=internalstatements(newstat);
|
|
|
+ restemp:=ctempcreatenode.create(resultdef,resultdef.size,tt_persistent,false);
|
|
|
+ addstatement(newstat,restemp);
|
|
|
+ addstatement(newstat,ccallnode.createintern('fpc_pchar_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
|
|
|
+ else
|
|
|
+ result := ccallnode.createinternres(
|
|
|
+ 'fpc_pchar_to_'+tstringdef(resultdef).stringtypname,
|
|
|
+ ccallparanode.create(left,nil),resultdef);
|
|
|
+ left:=nil;
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -1310,11 +1346,27 @@ implementation
|
|
|
|
|
|
|
|
|
function ttypeconvnode.typecheck_pwchar_to_string : tnode;
|
|
|
+ var
|
|
|
+ newblock : tblocknode;
|
|
|
+ newstat : tstatementnode;
|
|
|
+ restemp : ttempcreatenode;
|
|
|
begin
|
|
|
- result := ccallnode.createinternres(
|
|
|
- 'fpc_pwidechar_to_'+tstringdef(resultdef).stringtypname,
|
|
|
- ccallparanode.create(left,nil),resultdef);
|
|
|
- left := nil;
|
|
|
+ if tstringdef(resultdef).stringtype=st_shortstring then
|
|
|
+ begin
|
|
|
+ newblock:=internalstatements(newstat);
|
|
|
+ restemp:=ctempcreatenode.create(resultdef,resultdef.size,tt_persistent,false);
|
|
|
+ addstatement(newstat,restemp);
|
|
|
+ addstatement(newstat,ccallnode.createintern('fpc_pwidechar_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
|
|
|
+ else
|
|
|
+ result := ccallnode.createinternres(
|
|
|
+ 'fpc_pwidechar_to_'+tstringdef(resultdef).stringtypname,
|
|
|
+ ccallparanode.create(left,nil),resultdef);
|
|
|
+ left:=nil;
|
|
|
end;
|
|
|
|
|
|
|