Force shortcut boolean evaluation when rewriting length(Windows widestring) = 0.

This commit is contained in:
Rika Ichinose 2024-10-17 02:23:49 +03:00
parent 8e58bbea61
commit bb31f32941

View File

@ -513,18 +513,21 @@ const
{ COM widestrings have 32-bit lengths, and can explicitly have 0 while being non-nil. } { COM widestrings have 32-bit lengths, and can explicitly have 0 while being non-nil. }
if is_widestring(tinlinenode(L).left.resultdef) and (tf_winlikewidestring in target_info.flags) then if is_widestring(tinlinenode(L).left.resultdef) and (tf_winlikewidestring in target_info.flags) then
{ Expand to “(pointer(L.left) = nil) or (PUint32(L.left)[-1] = 0)”. } begin
resn:=caddnode.create_internal(orn, { Expand to “(pointer(L.left) = nil) or (PUint32(L.left)[-1] = 0)”. }
resn, resn:=caddnode.create_internal(orn,
caddnode.create_internal(equaln, resn,
ctypeconvnode.create_internal( caddnode.create_internal(equaln,
cderefnode.create( ctypeconvnode.create_internal(
caddnode.create_internal(subn,ctypeconvnode.create_internal(tinlinenode(L).left.getcopy,voidpointertype), cderefnode.create(
cordconstnode.create(sizeof(uint32),ptruinttype,false)) caddnode.create_internal(subn,ctypeconvnode.create_internal(tinlinenode(L).left.getcopy,voidpointertype),
),u32inttype cordconstnode.create(sizeof(uint32),ptruinttype,false))
), ),u32inttype
cordconstnode.create(0,u32inttype,false)) ),
); cordconstnode.create(0,u32inttype,false))
);
include(taddnode(resn).addnodeflags,anf_short_bool);
end;
tinlinenode(L).left:=nil; { Was stolen inside resn, and no longer of interest. } tinlinenode(L).left:=nil; { Was stolen inside resn, and no longer of interest. }
{ resn now checks for Length = 0. For Length <> 0, invert. } { resn now checks for Length = 0. For Length <> 0, invert. }