[fpc-devel] Consideration on "$CapturerClass" - reference to function - and debugging

Martin Frb lazarus at mfriebe.de
Tue Aug 25 22:19:07 CEST 2026


On 25/08/2026 21:42, Sven Barth via fpc-devel wrote:
> Am 25.08.2026 um 09:21 schrieb Martin Frb via fpc-devel:
>> *** But the question is: Could the compiler just write that class on 
>> the top level? ***
>
> No, it makes no logical sense to put a type, that is *logically* a 
> child of a routine be part of the top level. Also it may contain 
> references to types that are local to the surrounding routine.

Ok.

btw, and unrelated to my initial reasons... But has this been tested 
with gdb/lldb?

I don't know if it is related to this or maybe it could be something 
entirely else, but my gdb (17.1 on Windows) reports (when trying to step 
through an anon proc / pascal code at the end)
=> line 22 is outside / calling the invoke.
=> line 14 is correct
=> and then gdb looses it.


Thread 1 hit Breakpoint 1, B (X=0x14e7cf8) at project1.lpr:22
22        write(x());
(gdb) s
WRPR_$P$PROJECT1$_$F$$TFUNC_$$_$CAPTURERCLASS_1_1_10_10_$_P$PROJECT1$_$F$$TFUNC_$$HK1jjfl_kbwP 
() at project1.lpr:14
14        result := function: integer begin
(gdb) n
0x0000000100001709 in INVOKE__FPCINTERNAL__1_1_14_21 (this=0x14e7cf8)
(gdb) n
Single stepping until exit from function INVOKE__FPCINTERNAL__1_1_14_21,
which has no line number information.
2B (X=0x14e7cf8) at project1.lpr:21
21      begin
(gdb) n
23      end;

The line info is there. So that must be some issue in the GDB that I 
have. (interestingly gdb also reports the addresses for those lines to 
the IDE on a different query)


I haven't tested with LLDB.
FpDebug had no problems.



program Project1;
{$Mode objfpc}
{$ModeSwitch anonymousfunctions}
{$ModeSwitch functionreferences}

type TFunc = reference to function: integer;
var
   n: TFunc;

function f: TFunc;
var a: integer;
begin
   a := 1;
   result := function: integer begin
     inc(a);
     result := a;
   end;
end;

procedure b(x: TFunc);
begin
   write(x());
end;

begin
   n := f;
   b(n);
   b(n);
   b(n);

end.



More information about the fpc-devel mailing list