Inside MakeFib_Impl(), the object reference should be an interface reference instead, to better match what the compiler actually produces:
function MakeFib_Impl: TFunc<integer,int64>;
var
fib: TFunc<integer,int64>;
begin
fib := MakeFibAnonClass.Create; // refcnt is 1
obj.fib := fib; // refcnt is now 2
Result := fib;
end;
Although this is a gross oversimplification, as the actual compiler implementation is much more complex (see Variable Binding Mechanism for details). The local fib variable inside of the calling function, and the captured fib variable inside the anonymous method, are actually the same variable in memory. But yes, the self-referencing issue still applies (just on a separate frame object that holds the fib variable).
This self-referencing issue is even mentioned in the documentation: