[fpc-pascal] Case statement for class introspection

Sven Barth pascaldragon at googlemail.com
Mon Jan 17 07:55:24 CET 2022


Ryan Joseph via fpc-pascal <fpc-pascal at lists.freepascal.org> schrieb am
Mo., 17. Jan. 2022, 02:38:

>
>
> > On Jan 16, 2022, at 11:15 PM, Sven Barth <pascaldragon at googlemail.com>
> wrote:
> >
> > The class type already is a unique "ID" for each class type when doing
> an equal comparison. You can essentially take the address of the VMT as the
> constant values that the loaded value is compared against.
>
> Does that look something like this then? and if so, this is better then
> doing the if-statement block, like string case statements?
>

At least the compiler would be able to optimize it better.


>   case PtrUInt(o.ClassType.ClassInfo) of
>     PtrUInt(TObject.ClassInfo): writeln('TObject');
>   end;
>

No, that is the RTTI. While that would work as well that is an additional
indirection. So it would be more like:

case PtrUInt(o.ClassType) of
    PtrUInt(TObject): writeln('TObject');
  end;


> Question then is how you get the VMT address as a constant at compile time.
>

I'll need to get back to you with that.

Regards,
Sven

>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20220117/b70ef6a5/attachment-0001.htm>


More information about the fpc-pascal mailing list