STINNER Victor added the comment: Oh wow, the bug is tricky.
_PyGen_yf() checks if the next instruction is YIELD_FROM using code[f_lasti+2]. The problem is that WORDCODE kept f_lasti == -1 for a frame not executed yet: f_lasti+2 is 1 in this case. Problem: code[1] is not an operation code, but the argment. Python 3.6 bytecode now uses the "wordcode" format: 16-bit units of (operation, argument). The obvious and simple fix is to add a special case for f_lasti==-1 in _PyGen_yf(): see attached patch. pygen_yf.patch fixes the crash. -- Another much larger change would be to change f_lasti to -2... In the rewiew of the huge WORDCODE patch, if I recall correctly, I asked Demur to use -1 for backward compatibility. Or maybe I asked to kept the backward compatibility at the Python level using a getter converting -2 to -1... I don't recall correctly. See http://bugs.python.org/issue26647 for wordcode. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue28782> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com