summaryrefslogtreecommitdiff
path: root/py/compile.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-09-04 14:31:28 +1000
committerDamien George <damien.p.george@gmail.com>2018-09-04 14:31:28 +1000
commit4ae7111573f6866e027e2919e4d331c01108db23 (patch)
tree709ddd2a07cd2169539b7c4a83109b2868d5d321 /py/compile.c
parent3cd2c281d7cf990b3afb78287a58cf4ee3f23ca5 (diff)
py/emitnative: Add support for return/break/continue in try and with.
This patch adds full support for unwinding jumps to the native emitter. This means that return/break/continue can be used in try-except, try-finally and with statements. For code that doesn't use unwinding jumps there is almost no overhead added to the generated code.
Diffstat (limited to 'py/compile.c')
-rw-r--r--py/compile.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/py/compile.c b/py/compile.c
index 8ef05d238..89505c85a 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -1595,6 +1595,7 @@ STATIC void compile_try_except(compiler_t *comp, mp_parse_node_t pn_body, int n_
compile_decrease_except_level(comp);
EMIT(end_finally);
+ reserve_labels_for_native(comp, 1);
}
EMIT_ARG(jump, l2);
EMIT_ARG(label_assign, end_finally_label);
@@ -1603,6 +1604,7 @@ STATIC void compile_try_except(compiler_t *comp, mp_parse_node_t pn_body, int n_
compile_decrease_except_level(comp);
EMIT(end_finally);
+ reserve_labels_for_native(comp, 1);
EMIT(end_except_handler);
EMIT_ARG(label_assign, success_label);
@@ -1631,6 +1633,7 @@ STATIC void compile_try_finally(compiler_t *comp, mp_parse_node_t pn_body, int n
compile_decrease_except_level(comp);
EMIT(end_finally);
+ reserve_labels_for_native(comp, 1);
}
STATIC void compile_try_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) {
@@ -1683,9 +1686,10 @@ STATIC void compile_with_stmt_helper(compiler_t *comp, int n, mp_parse_node_t *n
compile_with_stmt_helper(comp, n - 1, nodes + 1, body);
// finish this with block
EMIT_ARG(with_cleanup, l_end);
- reserve_labels_for_native(comp, 2); // used by native's with_cleanup
+ reserve_labels_for_native(comp, 3); // used by native's with_cleanup
compile_decrease_except_level(comp);
EMIT(end_finally);
+ reserve_labels_for_native(comp, 1);
}
}
@@ -1752,6 +1756,7 @@ STATIC void compile_async_for_stmt(compiler_t *comp, mp_parse_node_struct_t *pns
EMIT_ARG(adjust_stack_size, 1); // if we jump here, the exc is on the stack
compile_decrease_except_level(comp);
EMIT(end_finally);
+ reserve_labels_for_native(comp, 1);
EMIT(end_except_handler);
EMIT_ARG(label_assign, try_else_label);
@@ -1879,6 +1884,7 @@ STATIC void compile_async_with_stmt_helper(compiler_t *comp, int n, mp_parse_nod
EMIT_ARG(label_assign, l_end);
compile_decrease_except_level(comp);
EMIT(end_finally);
+ reserve_labels_for_native(comp, 1);
}
}