diff options
| author | Jeff Epler <jepler@gmail.com> | 2020-03-03 20:13:53 -0600 |
|---|---|---|
| committer | Jeff Epler <jepler@gmail.com> | 2020-03-03 20:13:53 -0600 |
| commit | da31acfcc45e5ad43c8ea515650ef16540de7fbb (patch) | |
| tree | dba7d3ef6c7099c8d79e7dde7bd42d132e435498 /py | |
| parent | c0bfa117661766cdc7d5a3daca88008a669b5a90 (diff) | |
| parent | e98991fd7e472f8d43ae60ad62ef1c32fd250fea (diff) | |
Merge remote-tracking branch 'origin/master' into ulab
Diffstat (limited to 'py')
| -rw-r--r-- | py/compile.c | 17 | ||||
| -rw-r--r-- | py/parse.c | 3 |
2 files changed, 20 insertions, 0 deletions
diff --git a/py/compile.c b/py/compile.c index 77715d3fe..d5fae0299 100644 --- a/py/compile.c +++ b/py/compile.c @@ -1711,6 +1711,16 @@ STATIC void compile_yield_from(compiler_t *comp) { } #if MICROPY_PY_ASYNC_AWAIT +STATIC bool compile_require_async_context(compiler_t *comp, mp_parse_node_struct_t *pns) { + int scope_flags = comp->scope_cur->scope_flags; + if(scope_flags & MP_SCOPE_FLAG_GENERATOR) { + return true; + } + compile_syntax_error(comp, (mp_parse_node_t)pns, + translate("'async for' or 'async with' outside async function")); + return false; +} + STATIC void compile_await_object_method(compiler_t *comp, qstr method) { EMIT_ARG(load_method, method, false); EMIT_ARG(call_method, 0, 0, 0); @@ -1720,6 +1730,10 @@ STATIC void compile_await_object_method(compiler_t *comp, qstr method) { STATIC void compile_async_for_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { // comp->break_label |= MP_EMIT_BREAK_FROM_FOR; + if(!compile_require_async_context(comp, pns)) { + return; + } + qstr context = MP_PARSE_NODE_LEAF_ARG(pns->nodes[1]); uint while_else_label = comp_next_label(comp); uint try_exception_label = comp_next_label(comp); @@ -1857,6 +1871,9 @@ STATIC void compile_async_with_stmt_helper(compiler_t *comp, int n, mp_parse_nod } STATIC void compile_async_with_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { + if(!compile_require_async_context(comp, pns)) { + return; + } // get the nodes for the pre-bit of the with (the a as b, c as d, ... bit) mp_parse_node_t *nodes; int n = mp_parse_node_extract_list(&pns->nodes[0], PN_with_stmt_list, &nodes); diff --git a/py/parse.c b/py/parse.c index 911b891e0..864528470 100644 --- a/py/parse.c +++ b/py/parse.c @@ -477,6 +477,9 @@ STATIC void push_result_token(parser_t *parser, uint8_t rule_id) { mp_parse_node_t pn; mp_lexer_t *lex = parser->lexer; if (lex->tok_kind == MP_TOKEN_NAME) { + if(lex->vstr.len >= (1 << (8 * MICROPY_QSTR_BYTES_IN_LEN))) { + mp_raise_msg(&mp_type_SyntaxError, translate("Name too long")); + } qstr id = qstr_from_strn(lex->vstr.buf, lex->vstr.len); #if MICROPY_COMP_CONST // if name is a standalone identifier, look it up in the table of dynamic constants |
