summaryrefslogtreecommitdiff
path: root/py/compile.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2017-01-17 14:32:50 +1100
committerDamien George <damien.p.george@gmail.com>2017-02-16 18:38:06 +1100
commit6e769da0da2ae24cbdab50c57f0d088e137146e3 (patch)
tree708d50659e4f8b5aee1946889d70b5ae587e1c70 /py/compile.c
parentf4df3aaa72a0460614b1ab8b7b8a7927a1165e31 (diff)
py: Make FOR_ITER opcode pop 1+4 slots from the stack when finished.
The extra 4 slots correspond to the iterator object stored on the stack.
Diffstat (limited to 'py/compile.c')
-rw-r--r--py/compile.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/py/compile.c b/py/compile.c
index d2fa03f01..4fde278d0 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -2887,7 +2887,7 @@ STATIC void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_struct_t *pn
EMIT(yield_value);
EMIT(pop_top);
} else {
- EMIT_ARG(store_comp, comp->scope_cur->kind, for_depth + 2);
+ EMIT_ARG(store_comp, comp->scope_cur->kind, 5 * for_depth + 6);
}
} else if (MP_PARSE_NODE_IS_STRUCT_KIND(pn_iter, PN_comp_if)) {
// if condition
@@ -2900,13 +2900,13 @@ STATIC void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_struct_t *pn
// for loop
mp_parse_node_struct_t *pns_comp_for2 = (mp_parse_node_struct_t*)pn_iter;
compile_node(comp, pns_comp_for2->nodes[1]);
- EMIT_ARG(get_iter, false);
+ EMIT_ARG(get_iter, true);
compile_scope_comp_iter(comp, pns_comp_for2, pn_inner_expr, for_depth + 1);
}
EMIT_ARG(jump, l_top);
EMIT_ARG(label_assign, l_end);
- EMIT_ARG(for_iter_end, false);
+ EMIT_ARG(for_iter_end, true);
}
STATIC void check_for_doc_string(compiler_t *comp, mp_parse_node_t pn) {
@@ -3070,6 +3070,12 @@ STATIC void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) {
#endif
}
+ // dummy 4 objects
+ EMIT(load_null);
+ EMIT(load_null);
+ EMIT(load_null);
+ EMIT(load_null);
+
compile_load_id(comp, qstr_arg);
compile_scope_comp_iter(comp, pns_comp_for, pns->nodes[0], 0);