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. }
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)”. }
resn:=caddnode.create_internal(orn,
resn,
caddnode.create_internal(equaln,
ctypeconvnode.create_internal(
cderefnode.create(
caddnode.create_internal(subn,ctypeconvnode.create_internal(tinlinenode(L).left.getcopy,voidpointertype),
cordconstnode.create(sizeof(uint32),ptruinttype,false))
),u32inttype
),
cordconstnode.create(0,u32inttype,false))
);
begin
{ Expand to “(pointer(L.left) = nil) or (PUint32(L.left)[-1] = 0)”. }
resn:=caddnode.create_internal(orn,
resn,
caddnode.create_internal(equaln,
ctypeconvnode.create_internal(
cderefnode.create(
caddnode.create_internal(subn,ctypeconvnode.create_internal(tinlinenode(L).left.getcopy,voidpointertype),
cordconstnode.create(sizeof(uint32),ptruinttype,false))
),u32inttype
),
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. }
{ resn now checks for Length = 0. For Length <> 0, invert. }