mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 15:39:29 +02:00
parent
2ea611e069
commit
c6d3bc813f
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -8014,6 +8014,7 @@ tests/webtbs/tw8199.pp svneol=native#text/plain
|
||||
tests/webtbs/tw8222.pp svneol=native#text/plain
|
||||
tests/webtbs/tw8222a.pp svneol=native#text/plain
|
||||
tests/webtbs/tw8222b.pp svneol=native#text/plain
|
||||
tests/webtbs/tw8229.pp svneol=native#text/plain
|
||||
tests/webtbs/ub1873.pp svneol=native#text/plain
|
||||
tests/webtbs/ub1883.pp svneol=native#text/plain
|
||||
tests/webtbs/uw0555.pp svneol=native#text/plain
|
||||
|
@ -1586,7 +1586,7 @@ implementation
|
||||
var
|
||||
p: tnode;
|
||||
newstatement : tstatementnode;
|
||||
tempnode : ttempcreatenode;
|
||||
tempnode,tempnode2 : ttempcreatenode;
|
||||
begin
|
||||
{ when we get here, we are sure that both the left and the right }
|
||||
{ node are both strings of the same stringtype (JM) }
|
||||
@ -1645,6 +1645,8 @@ 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 system_windows)) and
|
||||
(((left.nodetype=stringconstn) and (tstringconstnode(left).len=0)) or
|
||||
((right.nodetype=stringconstn) and (tstringconstnode(right).len=0))) then
|
||||
begin
|
||||
@ -1664,11 +1666,45 @@ implementation
|
||||
cordconstnode.create(0,s32inttype,false))
|
||||
else
|
||||
begin
|
||||
{ compare the pointer with nil (for ansistrings etc), }
|
||||
{ faster than getting the length (JM) }
|
||||
result:= caddnode.create(nodetype,
|
||||
ctypeconvnode.create_internal(left,voidpointertype),
|
||||
cpointerconstnode.create(0,voidpointertype));
|
||||
(*
|
||||
if is_widestring(left.resultdef) and
|
||||
(target_info.system in system_windows) 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));
|
||||
end
|
||||
else
|
||||
*)
|
||||
begin
|
||||
{ compare the pointer with nil (for ansistrings etc), }
|
||||
{ faster than getting the length (JM) }
|
||||
result:= caddnode.create(nodetype,
|
||||
ctypeconvnode.create_internal(left,voidpointertype),
|
||||
cpointerconstnode.create(0,voidpointertype));
|
||||
end;
|
||||
end;
|
||||
{ left is reused }
|
||||
left := nil;
|
||||
|
17
tests/webtbs/tw8229.pp
Normal file
17
tests/webtbs/tw8229.pp
Normal file
@ -0,0 +1,17 @@
|
||||
program WideStringFault;
|
||||
|
||||
procedure Test;
|
||||
var
|
||||
w: widestring;
|
||||
v: variant;
|
||||
begin
|
||||
w := '';
|
||||
v := w;
|
||||
w := v;
|
||||
if w <> '' then
|
||||
halt(1);
|
||||
end;
|
||||
|
||||
begin
|
||||
Test;
|
||||
end.
|
Loading…
Reference in New Issue
Block a user