On Wed, Jun 19, 2019 at 3:40 PM Ryan Joseph <generic...@gmail.com> wrote:
> What are the rules with he calling context? I didn’t even know that was a > factor! I’ll have to look to get some examples. > Basically, if you're calling a function marked inline from another function, the implementation of the function to be inlined has to come first in the unit. So for example, the following code generates assembly that is completely identical for all three functions, because `Proc` gets inlined into `Proc2` and then through that into `Proc3`. unit Example; {$mode ObjFPC} {$modeswitch AdvancedRecords} interface type Letters = (A, B, C); type TRecord = record procedure Proc; inline; procedure Proc2; inline; procedure Proc3; end; implementation procedure TRecord.Proc; begin WriteLn([B] <= [A, B, C]); end; procedure TRecord.Proc2; begin Proc(); end; procedure TRecord.Proc3; begin Proc2(); end; end. If the implementation order was `Proc2` -> `Proc` -> `Proc3`, however, `Proc3` could still inline away both `Proc` and `Proc2`, but `Proc2` itself could not inline away `Proc.` Lastly, if the implementation for `Proc` came after both those for `Proc2` and `Proc3`, it would not be inlined into either. (I.E. `Proc3` would directly call `Proc2`, and `Proc2` would directly call `Proc`.)
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal