summaryrefslogtreecommitdiff
path: root/py/compile.c
diff options
context:
space:
mode:
authorJonathan Hogg <me@jonathanhogg.com>2020-07-21 18:47:28 +0100
committerDamien George <damien@micropython.org>2020-07-25 00:58:18 +1000
commit37e1b5c891f9964bb6c95228bc2d718511507a69 (patch)
treece64d2ee23a57c72e32266ee656b726e48da467a /py/compile.c
parentfe7d47971f7de0cc094b28ae34e49f40b41d456d (diff)
py/compile: Don't await __aiter__ special method in async-for.
MicroPython's original implementation of __aiter__ was correct for an earlier (provisional) version of PEP492 (CPython 3.5), where __aiter__ was an async-def function. But that changed in the final version of PEP492 (in CPython 3.5.2) where the function was changed to a normal one. See https://www.python.org/dev/peps/pep-0492/#why-aiter-does-not-return-an-awaitable See also the note at the end of this subsection in the docs: https://docs.python.org/3.5/reference/datamodel.html#asynchronous-iterators And for completeness the BPO: https://bugs.python.org/issue27243 To be consistent with the Python spec as it stands today (and now that PEP492 is final) this commit changes MicroPython's behaviour to match CPython: __aiter__ should return an async-iterable object, but is not itself awaitable. The relevant tests are updated to match. See #6267.
Diffstat (limited to 'py/compile.c')
-rw-r--r--py/compile.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/py/compile.c b/py/compile.c
index 53108b706..d1a4d65c8 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -1798,7 +1798,8 @@ STATIC void compile_async_for_stmt(compiler_t *comp, mp_parse_node_struct_t *pns
uint try_finally_label = comp_next_label(comp);
compile_node(comp, pns->nodes[1]); // iterator
- compile_await_object_method(comp, MP_QSTR___aiter__);
+ EMIT_ARG(load_method, MP_QSTR___aiter__, false);
+ EMIT_ARG(call_method, 0, 0, 0);
compile_store_id(comp, context);
START_BREAK_CONTINUE_BLOCK