kopia lustrzana https://github.com/micropython/micropython
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>pull/13583/head
rodzic
acbdbcd95e
commit
2b8e88c563
13
py/compile.c
13
py/compile.c
|
@ -196,6 +196,10 @@ typedef struct _compiler_t {
|
||||||
mp_emit_common_t emit_common;
|
mp_emit_common_t emit_common;
|
||||||
} compiler_t;
|
} compiler_t;
|
||||||
|
|
||||||
|
#if MICROPY_COMP_ALLOW_TOP_LEVEL_AWAIT
|
||||||
|
bool mp_compile_allow_top_level_await = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
// mp_emit_common_t helper functions
|
// mp_emit_common_t helper functions
|
||||||
// These are defined here so they can be inlined, to reduce code size.
|
// 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
|
#if MICROPY_PY_ASYNC_AWAIT
|
||||||
static void compile_atom_expr_await(compiler_t *comp, mp_parse_node_struct_t *pns) {
|
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) {
|
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"));
|
#if MICROPY_COMP_ALLOW_TOP_LEVEL_AWAIT
|
||||||
return;
|
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_atom_expr_normal(comp, pns);
|
||||||
compile_yield_from(comp);
|
compile_yield_from(comp);
|
||||||
|
|
|
@ -30,6 +30,11 @@
|
||||||
#include "py/parse.h"
|
#include "py/parse.h"
|
||||||
#include "py/emitglue.h"
|
#include "py/emitglue.h"
|
||||||
|
|
||||||
|
#if MICROPY_COMP_ALLOW_TOP_LEVEL_AWAIT
|
||||||
|
// set to `true` to allow top-level await expressions
|
||||||
|
extern bool mp_compile_allow_top_level_await;
|
||||||
|
#endif
|
||||||
|
|
||||||
// the compiler will raise an exception if an error occurred
|
// the compiler will raise an exception if an error occurred
|
||||||
// the compiler will clear the parse tree before it returns
|
// the compiler will clear the parse tree before it returns
|
||||||
// mp_globals_get() will be used for the context
|
// mp_globals_get() will be used for the context
|
||||||
|
|
|
@ -446,6 +446,11 @@
|
||||||
#define MICROPY_DYNAMIC_COMPILER (0)
|
#define MICROPY_DYNAMIC_COMPILER (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Whether the compiler allows compiling top-level await expressions
|
||||||
|
#ifndef MICROPY_COMP_ALLOW_TOP_LEVEL_AWAIT
|
||||||
|
#define MICROPY_COMP_ALLOW_TOP_LEVEL_AWAIT (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Whether to enable constant folding; eg 1+2 rewritten as 3
|
// Whether to enable constant folding; eg 1+2 rewritten as 3
|
||||||
#ifndef MICROPY_COMP_CONST_FOLDING
|
#ifndef MICROPY_COMP_CONST_FOLDING
|
||||||
#define MICROPY_COMP_CONST_FOLDING (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_CORE_FEATURES)
|
#define MICROPY_COMP_CONST_FOLDING (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_CORE_FEATURES)
|
||||||
|
|
Ładowanie…
Reference in New Issue