[pypy-commit] pypy py3.7: only async *generator* expressions should work, not other comprehensions!
cfbolz
pypy.commits at gmail.com
Fri Jan 31 08:12:08 EST 2020
Author: Carl Friedrich Bolz-Tereick <cfbolz at gmx.de>
Branch: py3.7
Changeset: r98608:30f0db9aea2b
Date: 2020-01-30 16:00 +0100
http://bitbucket.org/pypy/pypy/changeset/30f0db9aea2b/
Log: only async *generator* expressions should work, not other
comprehensions!
diff --git a/pypy/interpreter/astcompiler/codegen.py b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -1567,7 +1567,11 @@
def _compile_comprehension(self, node, name, sub_scope):
is_async_function = self.scope.is_coroutine
code, qualname = self.sub_scope(sub_scope, name, node, node.lineno)
- is_async_generator = self.symbols.find_scope(node).is_coroutine
+ is_async_comprehension = self.symbols.find_scope(node).is_coroutine
+ if is_async_comprehension and not is_async_function:
+ if not isinstance(node, ast.GeneratorExp):
+ self.error("asynchronous comprehension outside of "
+ "an asynchronous function", node)
self.update_position(node.lineno)
self._make_function(code, qualname=qualname)
@@ -1581,7 +1585,7 @@
else:
self.emit_op(ops.GET_ITER)
self.emit_op_arg(ops.CALL_FUNCTION, 1)
- if is_async_generator and sub_scope is not GenExpCodeGenerator:
+ if is_async_comprehension and sub_scope is not GenExpCodeGenerator:
self.emit_op(ops.GET_AWAITABLE)
self.load_const(self.space.w_None)
self.emit_op(ops.YIELD_FROM)
diff --git a/pypy/interpreter/astcompiler/test/test_compiler.py b/pypy/interpreter/astcompiler/test/test_compiler.py
--- a/pypy/interpreter/astcompiler/test/test_compiler.py
+++ b/pypy/interpreter/astcompiler/test/test_compiler.py
@@ -1231,6 +1231,33 @@
"""
e = py.test.raises(SyntaxError, self.simple_test, source, "None", None)
+ def test_async_in_nested(self):
+ source = """if 1:
+ async def foo():
+ def bar():
+ [i async for i in items]
+ """
+ e = py.test.raises(SyntaxError, self.simple_test, source, "None", None)
+ source = """if 1:
+ async def foo():
+ def bar():
+ {i async for i in items}
+ """
+ e = py.test.raises(SyntaxError, self.simple_test, source, "None", None)
+ source = """if 1:
+ async def foo():
+ def bar():
+ {i: i+1 async for i in items}
+ """
+ e = py.test.raises(SyntaxError, self.simple_test, source, "None", None)
+ source = """if 1:
+ async def foo():
+ def bar():
+ (i async for i in items)
+ """
+ # ok!
+ self.simple_test(source, "None", None)
+
def test_load_classderef(self):
source = """if 1:
def f():
More information about the pypy-commit
mailing list