New issue 2000: bytecode changed but pyc version didn't in pypy 2.5.x https://bitbucket.org/pypy/pypy/issue/2000/bytecode-changed-but-pyc-version-didnt-in
Antonio Cuni: PyPy 2.5.x compiles the statement ```exec(src, d)``` (i.e., when passing a tuple) differently than PyPy 2.5.0 and CPython. However, the pyc version is the same, which results in an exception when trying to import a pyc which was compiled with a previous version of PyPy. To reproduce, create a file named ```execbug.py``` ``` #!python import sys import dis def foo(src, d): exec(src, d) print sys.version dis.dis(foo) foo('None', {}) print 'ALL OK' ``` Then, make sure that exebug.pyc does NOT exist, and execute the following with PyPy 2.5.0: ``` $ /tmp/pypy-2.5.0-linux64/bin/pypy -c 'import execbug' 2.7.8 (10f1b29a2bd2, Feb 02 2015, 21:22:43) [PyPy 2.5.0 with GCC 4.6.3] 5 0 LOAD_FAST 0 (src) 3 LOAD_FAST 1 (d) 6 BUILD_TUPLE 2 9 LOAD_CONST 0 (None) 12 DUP_TOP 13 EXEC_STMT 14 LOAD_CONST 0 (None) 17 RETURN_VALUE ALL OK ``` Now, if you try with pypy 2.5.1 (as well as the current trunk): ``` 2.7.9 (5aed0a41060e, Mar 17 2015, 05:46:24) [PyPy 2.5.1 with GCC 4.6.3] 5 0 LOAD_FAST 0 (src) 3 LOAD_FAST 1 (d) 6 BUILD_TUPLE 2 9 LOAD_CONST 0 (None) 12 DUP_TOP 13 EXEC_STMT 14 LOAD_CONST 0 (None) 17 RETURN_VALUE Traceback (most recent call last): File "<builtin>//app_main.py", line 75, in run_toplevel File "<builtin>//app_main.py", line 588, in run_it File "<string>", line 1, in <module> File "execbug.py", line 9, in <module> foo('None', {}) File "execbug.py", line 5, in foo exec(src, d) TypeError: exec: arg 1 must be a string, file, or code object ``` If you remove the .pyc, pypy 2.5.1 works well (note that the bytecode is different, not sure why) ``` $ /tmp/pypy-c-jit-76420-5aed0a41060e-linux64/bin/pypy -c 'import execbug' 2.7.9 (5aed0a41060e, Mar 17 2015, 05:46:24) [PyPy 2.5.1 with GCC 4.6.3] 5 0 LOAD_FAST 0 (src) 3 LOAD_FAST 1 (d) 6 DUP_TOP 7 EXEC_STMT 8 LOAD_CONST 0 (None) 11 RETURN_VALUE ALL OK ``` This is a serious bug, because it triggers random errors if someone upgrades from PyPy 2.5.0 to 2.5.1. Note that this also breaks code like ```x=('None', {}); exec x```, which works fine on CPython and PyPy up to 2.5.0 _______________________________________________ pypy-issue mailing list pypy-issue@python.org https://mail.python.org/mailman/listinfo/pypy-issue