diff --git a/py/compile.c b/py/compile.c index 7117fcae5..8580c8ce4 100644 --- a/py/compile.c +++ b/py/compile.c @@ -2786,6 +2786,7 @@ STATIC void compile_scope_lambda_param(compiler_t *comp, mp_parse_node_t pn) { compile_scope_func_lambda_param(comp, pn, PN_varargslist_name, PN_varargslist_star, PN_varargslist_dbl_star); } +#if MICROPY_EMIT_NATIVE STATIC void compile_scope_func_annotations(compiler_t *comp, mp_parse_node_t pn) { if (!MP_PARSE_NODE_IS_STRUCT(pn)) { // no annotation @@ -2816,22 +2817,19 @@ STATIC void compile_scope_func_annotations(compiler_t *comp, mp_parse_node_t pn) mp_parse_node_t pn_annotation = pns->nodes[1]; if (!MP_PARSE_NODE_IS_NULL(pn_annotation)) { - #if MICROPY_EMIT_NATIVE qstr param_name = MP_PARSE_NODE_LEAF_ARG(pns->nodes[0]); id_info_t *id_info = scope_find(comp->scope_cur, param_name); assert(id_info != NULL); - if (comp->scope_cur->emit_options == MP_EMIT_OPT_VIPER) { - if (MP_PARSE_NODE_IS_ID(pn_annotation)) { - qstr arg_type = MP_PARSE_NODE_LEAF_ARG(pn_annotation); - EMIT_ARG(set_native_type, MP_EMIT_NATIVE_TYPE_ARG, id_info->local_num, arg_type); - } else { - compile_syntax_error(comp, pn_annotation, "parameter annotation must be an identifier"); - } + if (MP_PARSE_NODE_IS_ID(pn_annotation)) { + qstr arg_type = MP_PARSE_NODE_LEAF_ARG(pn_annotation); + EMIT_ARG(set_native_type, MP_EMIT_NATIVE_TYPE_ARG, id_info->local_num, arg_type); + } else { + compile_syntax_error(comp, pn_annotation, "parameter annotation must be an identifier"); } - #endif // MICROPY_EMIT_NATIVE } } +#endif // MICROPY_EMIT_NATIVE STATIC void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_t pn_iter, mp_parse_node_t pn_inner_expr, int l_top, int for_depth) { tail_recursion: @@ -2954,8 +2952,11 @@ STATIC void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { if (comp->pass == MP_PASS_SCOPE) { comp->have_star = false; apply_to_single_or_list(comp, pns->nodes[1], PN_typedargslist, compile_scope_func_param); - } else { + } + #if MICROPY_EMIT_NATIVE + else if (scope->emit_options == MP_EMIT_OPT_VIPER) { // compile annotations; only needed on latter compiler passes + // only needed for viper emitter // argument annotations apply_to_single_or_list(comp, pns->nodes[1], PN_typedargslist, compile_scope_func_annotations); @@ -2963,19 +2964,16 @@ STATIC void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { // pns->nodes[2] is return/whole function annotation mp_parse_node_t pn_annotation = pns->nodes[2]; if (!MP_PARSE_NODE_IS_NULL(pn_annotation)) { - #if MICROPY_EMIT_NATIVE - if (scope->emit_options == MP_EMIT_OPT_VIPER) { - // nodes[2] can be null or a test-expr - if (MP_PARSE_NODE_IS_ID(pn_annotation)) { - qstr ret_type = MP_PARSE_NODE_LEAF_ARG(pn_annotation); - EMIT_ARG(set_native_type, MP_EMIT_NATIVE_TYPE_RETURN, 0, ret_type); - } else { - compile_syntax_error(comp, pn_annotation, "return annotation must be an identifier"); - } + // nodes[2] can be null or a test-expr + if (MP_PARSE_NODE_IS_ID(pn_annotation)) { + qstr ret_type = MP_PARSE_NODE_LEAF_ARG(pn_annotation); + EMIT_ARG(set_native_type, MP_EMIT_NATIVE_TYPE_RETURN, 0, ret_type); + } else { + compile_syntax_error(comp, pn_annotation, "return annotation must be an identifier"); } - #endif // MICROPY_EMIT_NATIVE } } + #endif // MICROPY_EMIT_NATIVE compile_node(comp, pns->nodes[3]); // 3 is function body // emit return if it wasn't the last opcode