Assertion failure in OptimizingVisitor.visit_Name
Created originally on Bitbucket by dwatola (Dave Watola)
Using version 2.4 of pypy, the very simple test case attached crashes with
#!
% pypy main.py
RPython traceback:
File "pypy_interpreter_pycompiler.c", line 1567, in PythonAstCompiler__compile_ast
File "pypy_interpreter_astcompiler_ast_1.c", line 20718, in Module_mutate_over
File "pypy_interpreter_astcompiler_ast_2.c", line 10177, in ASTVisitor__mutate_sequence
File "pypy_interpreter_astcompiler_ast_1.c", line 45287, in Assign_mutate_over
File "pypy_interpreter_astcompiler_ast_2.c", line 10177, in ASTVisitor__mutate_sequence
File "pypy_interpreter_astcompiler_ast_1.c", line 53781, in List_mutate_over
File "pypy_interpreter_astcompiler_ast_2.c", line 10177, in ASTVisitor__mutate_sequence
File "pypy_interpreter_astcompiler_optimize.c", line 252, in OptimizingVisitor_visit_Name
Fatal RPython error: AssertionError
Abort (core dumped)
This test case uses macropy, which adjusts AST representation using an import hook. The crash occurs during compilation -- there is no runtime code in this case. Aside from this issue, macropy seems to work correctly with pypy. All seems well with the proposed fix below.
It is not clear what is triggering this optimization, because the original and final ASTs involved do not use "None", I was able to eliminate the problem by editing OptimizingVisitor.visit_Name in pypy/interpreter/astcompiler/optimize.py and changing the guard condition on the "if" statement to include the assertion condition would provide a correct solution. i.e.
#!python
if name.id=="None" and name.ctx ==ast.Load
(and then eliminate the assertion).
This appears to be a safe and correct change, but I have no familiarity with the pypy code base and thought that someone else should evaluate the situation.
Attachments: testcase.tar.gz