<div dir="auto"><div><div class="gmail_quote"><div dir="ltr">J. Gareth Moreton <<a href="mailto:gareth@moreton-family.com">gareth@moreton-family.com</a>> schrieb am Mi., 8. Aug. 2018, 23:45:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>Hi everyone,</div><div><br>
</div><div>So I'm making progress with my pure function implementation, or something passing as an early alpha prototype.  I do have a question though... when the "firstpass" routines are called, have all the procedures been compiled into nodes yet? I'm still trying to work out the best time to evaluate function purity, partly due to constructs such as this:<br>
<br>
interface<br>
<br>
function PureFunc1(Input: Integer): Boolean;<br>
function PureFunc2(Input: Integer): Boolean;<br>
<br>
implementation<br>
<br>
function PureFunc1(Input: Integer): Boolean; pure;<br>
begin<br>
  Result := PureFunc2(Input * Input); { "pure" directive for PureFunc2 hasn't been seen yet }<br>
end;<br>
<br>
function PureFunc2(Input: Integer): Boolean; pure;<br>
begin</div><div>  { Do something complicated but deterministic! }<br>
end;<br>
<br>
****<br>
<br>
I could probably find the answer after some long research, but I'm trying to avoid wasting time unnecessarily.  I would guess that the evaluation should occur at a similar time to when inline functions are expanded, where they are fully-defined and known to be inlinable.<br></div></blockquote></div></div><div dir="auto"><br></div><div dir="auto">First of such modifiers should only be allowed in the interface section, not the implementation section as they would essentially be a change of the routine's signature (doesn't matter that it isn't part of the routine's mangled name) and thus a change of the unit's interface which in turn would require a recompilation of units using that unit. </div><div dir="auto"><br></div><div dir="auto">To your question itself: once a non-nested routine body is parsed it's code is generated which includes both the first and second pass. For nested routines the same is done once the outermost routine as been parsed (but before that one's first pass). </div><div dir="auto"><br></div><div dir="auto">Regards, </div><div dir="auto">Sven </div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div></div>
</blockquote></div></div></div>