Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enable Delphi XE RTTI only for some classes

Tags:

delphi

rtti

I'm trying to have RTTI enabled only for a subset of my classes.

The reason is that for those classes for which I want RTTI, I want RTTI on public methods too, but if that is enabled project-wide, then all public methods from all classes get into the final executable. This basically turns off the smart-linking, as the compiler considers that every public method could be called at runtime, and thus ends up compiling pretty much everything and the kitchen sink into the executable...

I've tried several things:

  • Turning off RTTI at the project level with {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} and then re-enabling it for the relevant units results in crashes at compile time (an AV somewhere in the compiler) on the $RTTI directive.
  • Turning off RTTI at the project level and then enabling it class-by-class compiles, but at runtime it results in an unqualified AV deep in "Rtti.pas" when attempting to access the RTII for the exposed classes
  • Controling RTTI via $RTTI directives embedded in the ".inc" all units use results in random AV at compile time (always at the line of the $RTTI directive, but not always for the same unit).

Any other ideas?

like image 946
Eric Grange Avatar asked Aug 26 '11 08:08

Eric Grange


1 Answers

Compiler bug submitted as QC 98261 for Embarcadero consideration.

The runtime AV was related to attributes, so a workaround is to make sure (manually, there are no compiler errors or warnings) that the attributes used in the exposed classes all have RTTI for them, otherwise you get the unqualified runtime AV.

The compiler AV happens whenever the $RTTI directive is used before the "unit" statement of a unit, if you place it after the AV doesn't happen and it works.

like image 59
Eric Grange Avatar answered Oct 16 '22 15:10

Eric Grange