Skip to content

Commit a831243

Browse files
committed
py/compile: Simplify compilation of comprehension iterators.
Saves 88 bytes on Thumb2, and 200 bytes on x86-64 archs.
1 parent 2eb844e commit a831243

File tree

1 file changed

+14
-19
lines changed

1 file changed

+14
-19
lines changed

py/compile.c

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2660,7 +2660,14 @@ STATIC void compile_scope_func_annotations(compiler_t *comp, mp_parse_node_t pn)
26602660
}
26612661
#endif // MICROPY_EMIT_NATIVE
26622662

2663-
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) {
2663+
STATIC void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_struct_t *pns_comp_for, mp_parse_node_t pn_inner_expr, int for_depth) {
2664+
uint l_top = comp_next_label(comp);
2665+
uint l_end = comp_next_label(comp);
2666+
EMIT_ARG(label_assign, l_top);
2667+
EMIT_ARG(for_iter, l_end);
2668+
c_assign(comp, pns_comp_for->nodes[0], ASSIGN_STORE);
2669+
mp_parse_node_t pn_iter = pns_comp_for->nodes[2];
2670+
26642671
tail_recursion:
26652672
if (MP_PARSE_NODE_IS_NULL(pn_iter)) {
26662673
// no more nested if/for; compile inner expression
@@ -2688,17 +2695,13 @@ STATIC void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_t pn_iter, m
26882695
// for loop
26892696
mp_parse_node_struct_t *pns_comp_for2 = (mp_parse_node_struct_t*)pn_iter;
26902697
compile_node(comp, pns_comp_for2->nodes[1]);
2691-
uint l_end2 = comp_next_label(comp);
2692-
uint l_top2 = comp_next_label(comp);
26932698
EMIT(get_iter);
2694-
EMIT_ARG(label_assign, l_top2);
2695-
EMIT_ARG(for_iter, l_end2);
2696-
c_assign(comp, pns_comp_for2->nodes[0], ASSIGN_STORE);
2697-
compile_scope_comp_iter(comp, pns_comp_for2->nodes[2], pn_inner_expr, l_top2, for_depth + 1);
2698-
EMIT_ARG(jump, l_top2);
2699-
EMIT_ARG(label_assign, l_end2);
2700-
EMIT(for_iter_end);
2699+
compile_scope_comp_iter(comp, pns_comp_for2, pn_inner_expr, for_depth + 1);
27012700
}
2701+
2702+
EMIT_ARG(jump, l_top);
2703+
EMIT_ARG(label_assign, l_end);
2704+
EMIT(for_iter_end);
27022705
}
27032706

27042707
STATIC void check_for_doc_string(compiler_t *comp, mp_parse_node_t pn) {
@@ -2862,16 +2865,8 @@ STATIC void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) {
28622865
#endif
28632866
}
28642867

2865-
uint l_end = comp_next_label(comp);
2866-
uint l_top = comp_next_label(comp);
28672868
compile_load_id(comp, qstr_arg);
2868-
EMIT_ARG(label_assign, l_top);
2869-
EMIT_ARG(for_iter, l_end);
2870-
c_assign(comp, pns_comp_for->nodes[0], ASSIGN_STORE);
2871-
compile_scope_comp_iter(comp, pns_comp_for->nodes[2], pns->nodes[0], l_top, 0);
2872-
EMIT_ARG(jump, l_top);
2873-
EMIT_ARG(label_assign, l_end);
2874-
EMIT(for_iter_end);
2869+
compile_scope_comp_iter(comp, pns_comp_for, pns->nodes[0], 0);
28752870

28762871
if (scope->kind == SCOPE_GEN_EXPR) {
28772872
EMIT_ARG(load_const_tok, MP_TOKEN_KW_NONE);

0 commit comments

Comments
 (0)