py: Simplify compilation of elif blocks.
This commit is contained in:
parent
9870fdd4b0
commit
235f9b33c8
30
py/compile.c
30
py/compile.c
|
@ -1677,29 +1677,12 @@ void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) {
|
|||
|
||||
EMIT_ARG(label_assign, l_fail);
|
||||
|
||||
if (!MP_PARSE_NODE_IS_NULL(pns->nodes[2])) {
|
||||
// compile elif blocks
|
||||
|
||||
mp_parse_node_struct_t *pns_elif = (mp_parse_node_struct_t*)pns->nodes[2];
|
||||
|
||||
if (MP_PARSE_NODE_STRUCT_KIND(pns_elif) == PN_if_stmt_elif_list) {
|
||||
// multiple elif blocks
|
||||
|
||||
int n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns_elif);
|
||||
for (int i = 0; i < n; i++) {
|
||||
mp_parse_node_struct_t *pns_elif2 = (mp_parse_node_struct_t*)pns_elif->nodes[i];
|
||||
l_fail = comp_next_label(comp);
|
||||
c_if_cond(comp, pns_elif2->nodes[0], false, l_fail); // elif condition
|
||||
|
||||
compile_node(comp, pns_elif2->nodes[1]); // elif block
|
||||
if (!EMIT(last_emit_was_return_value)) { // simple optimisation to align with CPython
|
||||
EMIT_ARG(jump, l_end);
|
||||
}
|
||||
EMIT_ARG(label_assign, l_fail);
|
||||
}
|
||||
|
||||
} else {
|
||||
// a single elif block
|
||||
// compile elif blocks (if any)
|
||||
mp_parse_node_t *pn_elif;
|
||||
int n_elif = list_get(&pns->nodes[2], PN_if_stmt_elif_list, &pn_elif);
|
||||
for (int i = 0; i < n_elif; i++) {
|
||||
assert(MP_PARSE_NODE_IS_STRUCT_KIND(pn_elif[i], PN_if_stmt_elif)); // should be
|
||||
mp_parse_node_struct_t *pns_elif = (mp_parse_node_struct_t*)pn_elif[i];
|
||||
|
||||
l_fail = comp_next_label(comp);
|
||||
c_if_cond(comp, pns_elif->nodes[0], false, l_fail); // elif condition
|
||||
|
@ -1710,7 +1693,6 @@ void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) {
|
|||
}
|
||||
EMIT_ARG(label_assign, l_fail);
|
||||
}
|
||||
}
|
||||
|
||||
// compile else block
|
||||
compile_node(comp, pns->nodes[3]); // can be null
|
||||
|
|
Loading…
Reference in New Issue