[fpc-devel] [Suggestion] Enumeration range-check intrinsic
Martok
listbox at martoks-place.de
Sat Jul 6 02:10:50 CEST 2019
Am 06.07.2019 um 01:21 schrieb J. Gareth Moreton:
> According to this <https://www.freepascal.org/docs-html/rtl/system/ord.html>, a
> Longint.
Ah, right.
I checked the source again: that is true only if the argument is an enum. If it
is any other ordinal type or Pointer, the result is of the same word size (but
possibly different signedness) as the source.
In that case, unlike what was previously said in this thread, this should simply
work:
generic function TStreamHelper.ReadEnum<T>(out aEnum: T): Boolean;
begin
if Read(aEnum, SizeOf(aEnum)) <> SizeOf(aEnum) then
Exit(False)
else begin
Result := (Ord(aEnum) >= Ord(Low(T))) and (Ord(aEnum) <= Ord(High(T)));
end;
end;
So this is a comparison of Longints (add a cast to Longword to fix the overflow
bug), nothing that should be optimized out. This should also work for subranges
in their host types. Unless the optimizer removes the typeconvnodes...
Of course, this needs to be done everywhere a subrange is passed anywhere that
is not FPC, so it can't really fix anything.
--
Regards,
Martok
More information about the fpc-devel
mailing list