In order to better support shim frames, trampolines, Cython frames and other such bits and pieces, we need to relax the requirement that the f_func field is a function.
The only reason for it to be a function is that it needs to hold a strong reference to builtins and globals, as the frame only has a borrowed reference to those. Any object with those references will do.
In fact, for code that has no builtins or globals (many shims and trampolines) there is no need for those references and f_func could even be None.
In order to better support shim frames, trampolines, Cython frames and other such bits and pieces, we need to relax the requirement that the
f_funcfield is a function.The only reason for it to be a function is that it needs to hold a strong reference to builtins and globals, as the frame only has a borrowed reference to those. Any object with those references will do.
In fact, for code that has no builtins or globals (many shims and trampolines) there is no need for those references and
f_funccould even beNone.