|
@@ -3290,7 +3290,7 @@ implementation
|
|
|
var
|
|
|
p: tnode;
|
|
|
newstatement : tstatementnode;
|
|
|
- tempnode (*,tempnode2*) : ttempcreatenode;
|
|
|
+ tempnode : ttempcreatenode;
|
|
|
cmpfuncname: string;
|
|
|
para: tcallparanode;
|
|
|
begin
|
|
@@ -3399,8 +3399,6 @@ implementation
|
|
|
{ generate better code for comparison with empty string, we
|
|
|
only need to compare the length with 0 }
|
|
|
if (nodetype in [equaln,unequaln,gtn,gten,ltn,lten]) and
|
|
|
- { windows widestrings are too complicated to be handled optimized }
|
|
|
- not(is_widestring(left.resultdef) and (target_info.system in systems_windows)) and
|
|
|
(((left.nodetype=stringconstn) and (tstringconstnode(left).len=0)) or
|
|
|
((right.nodetype=stringconstn) and (tstringconstnode(right).len=0))) then
|
|
|
begin
|
|
@@ -3419,40 +3417,18 @@ implementation
|
|
|
result := caddnode.create(nodetype,
|
|
|
cinlinenode.create(in_length_x,false,left),
|
|
|
cordconstnode.create(0,s8inttype,false))
|
|
|
- else
|
|
|
+ else { nodetype in [equaln,unequaln] }
|
|
|
begin
|
|
|
- (*
|
|
|
- if is_widestring(left.resultdef) and
|
|
|
- (target_info.system in system_windows) then
|
|
|
+ if is_widestring(left.resultdef) and (tf_winlikewidestring in target_info.flags) then
|
|
|
begin
|
|
|
{ windows like widestrings requires that we also check the length }
|
|
|
- result:=internalstatements(newstatement);
|
|
|
- tempnode:=ctempcreatenode.create(voidpointertype,voidpointertype.size,tt_persistent,true);
|
|
|
- tempnode2:=ctempcreatenode.create(resultdef,resultdef.size,tt_persistent,true);
|
|
|
- addstatement(newstatement,tempnode);
|
|
|
- addstatement(newstatement,tempnode2);
|
|
|
- { poor man's cse }
|
|
|
- addstatement(newstatement,cassignmentnode.create(ctemprefnode.create(tempnode),
|
|
|
- ctypeconvnode.create_internal(left,voidpointertype))
|
|
|
- );
|
|
|
- addstatement(newstatement,cassignmentnode.create(ctemprefnode.create(tempnode2),
|
|
|
- caddnode.create(orn,
|
|
|
- caddnode.create(nodetype,
|
|
|
- ctemprefnode.create(tempnode),
|
|
|
- cpointerconstnode.create(0,voidpointertype)
|
|
|
- ),
|
|
|
- caddnode.create(nodetype,
|
|
|
- ctypeconvnode.create_internal(cderefnode.create(ctemprefnode.create(tempnode)),s32inttype),
|
|
|
- cordconstnode.create(0,s32inttype,false)
|
|
|
- )
|
|
|
- )
|
|
|
- ));
|
|
|
- addstatement(newstatement,ctempdeletenode.create_normal_temp(tempnode));
|
|
|
- addstatement(newstatement,ctempdeletenode.create_normal_temp(tempnode2));
|
|
|
- addstatement(newstatement,ctemprefnode.create(tempnode2));
|
|
|
+ result:=cinlinenode.create(in_length_x,false,left);
|
|
|
+ { and compare its result with 0 }
|
|
|
+ result:=caddnode.create(equaln,result,cordconstnode.create(0,s8inttype,false));
|
|
|
+ if nodetype=unequaln then
|
|
|
+ result:=cnotnode.create(result);
|
|
|
end
|
|
|
else
|
|
|
- *)
|
|
|
begin
|
|
|
{ compare the pointer with nil (for ansistrings etc), }
|
|
|
{ faster than getting the length (JM) }
|