[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