<div dir="auto"><div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Hairy Pixels <<a href="mailto:genericptr@gmail.com">genericptr@gmail.com</a>> schrieb am Fr., 3. Nov. 2023, 02:00:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<br>
> On Nov 2, 2023, at 1:44 PM, Sven Barth <<a href="mailto:pascaldragon@googlemail.com" target="_blank" rel="noreferrer">pascaldragon@googlemail.com</a>> wrote:<br>
> <br>
> Now for nested as well as anonymous routines the compiler determines whether a capturer is required at the point that the nested or anonymous routine is assigned to a function reference (cause otherwise it can be handled as a nested function or even a function or method pointer). This requirement is detected during the parsing of the routine.<br>
<br>
On second thought I had some questions about this part. From what I see FPC always allocates the interface when reference pointers are used but what you write suggests maybe the compiler will demote the type to something more optimized (like a nested function). We talked about this at length before but I don't think anything was decided yet.<br>
<br>
for example:<br>
<br>
procedure DoThis;<br>
var<br>
  proc: reference to procedure;<br>
begin<br>
  proc := procedure<br>
          begin<br>
          end;<br>
  proc();<br>
end;<br>
<br>
doesn't need the heap allocated instance because the function reference never escapes the scope and it has no captured variables so it could be demoted to a global function even of nested.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">As soon as an anonymous function gets assigned to a function reference it *must* be converted to a method of the capturer and an interface to that must be assigned to the function reference. Because that's what function references are: interfaces. </div><div dir="auto"><br></div><div dir="auto">If you don't want that then call the anonymous function directly without assigning it to anything or assign it to a nested function pointer and call that. </div><div dir="auto"><br></div><div dir="auto">In *theory* the compiler could detect that "proc" doesn't leave the scope and that it's value is "constant" (namely a function) and thus could optimize that, but that requires quite some improvements to the optimizer. </div><div dir="auto"><br></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">
<br>
In fact Swift requires you to mark closures types as "@escaping" if they can escape the current scope so that the compiler can be optimize them. This is the feature I was thinking FPC needs.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">By default the purpose of anonymous functions assigned to function references *is* that they can escape their scope. This will not change, because they were after all introduced for Delphi-compatibility and there won't be any designations that the value can't escape. If the compiler can't figure it out by its own (see above) then tough luck; use a feature better suited for that. </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">
</blockquote></div></div></div>