In PyPy 3.5, the following small piece of code cannot be imported, and causes a 
SystemError:

def test(*a: lambda x: None):
    pass

Stderr:

# pypy3 test.py
RPython traceback:
  File "pypy_interpreter.c", line 33969, in BuiltinCode_funcrun_obj
  File "pypy_module___builtin__.c", line 2705, in compile
  File "pypy_interpreter.c", line 50963, in PythonAstCompiler__compile_ast
  File "pypy_interpreter_astcompiler.c", line 1543, in compile_ast
  File "pypy_interpreter_astcompiler.c", line 5995, in Module_walkabout
  File "pypy_interpreter_astcompiler.c", line 13362, in 
PythonCodeGenerator__handle_body
  File "pypy_interpreter_astcompiler_2.c", line 20473, in 
PythonCodeGenerator_visit_FunctionDef
  File "pypy_interpreter_astcompiler_2.c", line 37632, in 
_visit_function__FunctionCodeGenerator
  File "pypy_interpreter_astcompiler_2.c", line 61299, in 
_visit_annotations__pypy_interpreter_astcompiler_1
  File "pypy_interpreter_astcompiler_3.c", line 8128, in 
PythonCodeGenerator__visit_arg_annotation
  File "pypy_interpreter_astcompiler_2.c", line 22498, in 
PythonCodeGenerator_visit_Lambda
  File "pypy_interpreter_astcompiler_2.c", line 35719, in 
PythonCodeGenerator_sub_scope
  File "pypy_interpreter_astcompiler.c", line 11371, in 
PythonCodeGenerator___init__
SystemError: unexpected internal exception (please report a bug): <KeyError 
object at 0x7efeb2749d20>; internal traceback was dumped to stderr

The crash appears when:
A varaible argument of a function has an annotation (like *args or **kwargs, 
normal arguments are not affected), and
A lambda expression is used in the annotation
Both criterias must be met.

This cannot be reproduced on CPython3.5+. Also, Python document says:

Parameters may have annotations of the form “: expression” following the 
parameter name. Any parameter may have an annotation even those of the form 
*identifier or **identifier. Functions may have “return” annotation of the form 
“-> expression” after the parameter list. These annotations can be any valid 
Python expression. The presence of annotations does not change the semantics of 
a function. The annotation values are available as values of a dictionary keyed 
by the parameters’ names in the __annotations__ attribute of the function 
object.

Mutiple versions of PyPy 3.5 have this bug,  including 5.8, 5.10 and 6.0

2018-07-27


hubo 
_______________________________________________
pypy-dev mailing list
pypy-dev@python.org
https://mail.python.org/mailman/listinfo/pypy-dev

Reply via email to