py/compile: Add option to allow compiling top-level await.

Enabled by MICROPY_COMPILE_ALLOW_TOP_LEVEL_AWAIT.  When enabled, this means
that scope such as module-level functions and REPL statements can yield.
The outer C code must then handle this yielded generator.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George
2023-06-24 17:02:58 +10:00
parent acbdbcd95e
commit 2b8e88c563
3 changed files with 21 additions and 2 deletions

View File

@@ -196,6 +196,10 @@ typedef struct _compiler_t {
mp_emit_common_t emit_common;
} compiler_t;
#if MICROPY_COMP_ALLOW_TOP_LEVEL_AWAIT
bool mp_compile_allow_top_level_await = false;
#endif
/******************************************************************************/
// mp_emit_common_t helper functions
// These are defined here so they can be inlined, to reduce code size.
@@ -2759,8 +2763,13 @@ static void compile_yield_expr(compiler_t *comp, mp_parse_node_struct_t *pns) {
#if MICROPY_PY_ASYNC_AWAIT
static void compile_atom_expr_await(compiler_t *comp, mp_parse_node_struct_t *pns) {
if (comp->scope_cur->kind != SCOPE_FUNCTION && comp->scope_cur->kind != SCOPE_LAMBDA) {
compile_syntax_error(comp, (mp_parse_node_t)pns, MP_ERROR_TEXT("'await' outside function"));
return;
#if MICROPY_COMP_ALLOW_TOP_LEVEL_AWAIT
if (!mp_compile_allow_top_level_await)
#endif
{
compile_syntax_error(comp, (mp_parse_node_t)pns, MP_ERROR_TEXT("'await' outside function"));
return;
}
}
compile_atom_expr_normal(comp, pns);
compile_yield_from(comp);