3. Another example: I'm working right now on a feature to step into a method. To do that right now my approach is: - Compute the function call names and bytecode offsets in a given frame. - When a frame is called (during a frame.f_trace call), check the parent frame bytecode offset (frame.f_lasti) to detect if the last thing was the expected call (and if it was, break the execution).
This seems reasonable given the current implementation, where bytecodes are all fixed and there's a mapping from the frame.f_lasti ... Will that still work with the specializing adaptive interpreter?
If you are implementing this in Python, then everything should work as it does now.
Ok... this part is all done in Python, so, if frame.f_lasti is still updated properly according to the original bytecode while executing the super instructions, then all seems to work properly on my side ;).
OOI, would inserting a breakpoint at offset 0 in the callee function work?
Yes... if you're curious, for the breakpoint to actually work, what is done is generate bytecode which calls a function to set the tracing and later generates a spurious line event (so that the tracing function is then able to make the pause. The related code that generates this bytecode would be: https://github.com/fabioz/PyDev.Debugger/blob/pydev_debugger_2_4_1/_pydevd_f... ).
4. Will it still be possible to change the frame.f_code prior to execution from a callback set in `PyThreadState.interp.eval_frame` (which will change the code to add a breakpoint to the bytecode and later call `_PyEval_EvalFrameDefault`)? Note: this is done in the debugger so that Python can run without any tracing until the breakpoint is hit (tracing is set afterwards to actually pause the execution as well as doing step operations).
Since frame.f_code is read-only in Python, I assume you mean in C.
I can make no guarantees about the layout or meaning of fields in the C frame struct, I'm afraid. But I'm sure we can get something to work for you.
Yes, it's indeed done in C (cython in this case... the related code for reference is: https://github.com/fabioz/PyDev.Debugger/blob/pydev_debugger_2_4_1/_pydevd_f... ). I'm fine in going through some other way or using some other API (this is quite specific to a debugger after all), I just wanted to let you know of the use case so that something along those lines can still be supported (currently on CPython, this is as low-overhead for debugging as I can think of, but since there'll be an adaptive bytecode specializer, using any other custom API would also be reasonable). Cheers, Fabio