Xavier de Gaye <xdeg...@gmail.com> added the comment:

xdegaye wrote:
> An explanation should be given for the behavior of 3.7 and 3.8 in the jump.py 
> case.

In 3.7 when running jump.py as in msg183254, Python aborts with a frame stack 
overflow.  The reason is that when the generator is resumed after the jump, its 
send() method is called with an argument and pushes the argument on the frame 
stack (i.e. f->f_stacktop - f->f_valuestack == 1 in gen_send_ex() before the 
call to PyEval_EvalFrameEx()). This argument is supposed to be popped by the 
first instruction executed by the generator which is expected to be YIELD_VALUE 
but, because of the jump, f->f_lasti is now 0 and the send() argument is not 
popped.  Hence the stack overflow.

When LLTRACE is undefined in ceval.c, stack oveflow checking is disabled. I 
have checked with gdb that, in that case, when YIELD_VALUE is about to be 
executed then STACK_LEVEL() is 3 instead of 1 and therefore YIELD_VALUE does 
not pop the right value from the stack. The stack is indeed corrupted.

So there are two reasons for forbiddig to jump from a yield statement:
* the ceval loop has exited and the jump is not allowing the user to jump to 
another line
* after the jump, resuming a generator corrupts the frame stack

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue17288>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to