diff options
Diffstat (limited to 'py')
-rw-r--r-- | py/compile.c | 7 | ||||
-rw-r--r-- | py/obj.c | 5 | ||||
-rw-r--r-- | py/vm.c | 14 |
3 files changed, 18 insertions, 8 deletions
diff --git a/py/compile.c b/py/compile.c index f61c4580c7..2aa98506d1 100644 --- a/py/compile.c +++ b/py/compile.c @@ -1442,24 +1442,27 @@ void compile_for_stmt_optimised_range(compiler_t *comp, mp_parse_node_t pn_var, comp->continue_label = continue_label; int top_label = comp_next_label(comp); + int entry_label = comp_next_label(comp); // compile: var = start compile_node(comp, pn_start); c_assign(comp, pn_var, ASSIGN_STORE); - EMIT(jump, continue_label); + EMIT(jump, entry_label); EMIT(label_assign, top_label); // compile body compile_node(comp, pn_body); + EMIT(label_assign, continue_label); + // compile: var += step c_assign(comp, pn_var, ASSIGN_AUG_LOAD); compile_node(comp, pn_step); EMIT(binary_op, RT_BINARY_OP_INPLACE_ADD); c_assign(comp, pn_var, ASSIGN_AUG_STORE); - EMIT(label_assign, continue_label); + EMIT(label_assign, entry_label); // compile: if var <cond> end: goto top compile_node(comp, pn_var); @@ -177,11 +177,6 @@ machine_int_t mp_obj_get_int(mp_obj_t arg) { return MP_OBJ_SMALL_INT_VALUE(arg); } else if (MP_OBJ_IS_TYPE(arg, &int_type)) { return mp_obj_int_get_checked(arg); -#if MICROPY_ENABLE_FLOAT - } else if (MP_OBJ_IS_TYPE(arg, &float_type)) { - // TODO work out if this should be floor, ceil or trunc - return (machine_int_t)mp_obj_float_get(arg); -#endif } else { nlr_jump(mp_obj_new_exception_msg_varg(MP_QSTR_TypeError, "can't convert %s to int", mp_obj_get_type_str(arg))); } @@ -326,6 +326,18 @@ bool mp_execute_byte_code_2(const byte *code_info, const byte **ip_in_out, mp_ob break; */ + // TODO this might need more sophisticated handling when breaking from within an except + case MP_BC_BREAK_LOOP: + DECODE_ULABEL; + ip += unum; + break; + + // TODO this might need more sophisticated handling when breaking from within an except + case MP_BC_CONTINUE_LOOP: + DECODE_ULABEL; + ip += unum; + break; + // matched against: POP_BLOCK or POP_EXCEPT (anything else?) case MP_BC_SETUP_EXCEPT: DECODE_ULABEL; // except labels are always forward @@ -366,7 +378,7 @@ bool mp_execute_byte_code_2(const byte *code_info, const byte **ip_in_out, mp_ob exc_sp -= 2; // pop back to previous exception handler break; - // matched againts: SETUP_EXCEPT + // matched against: SETUP_EXCEPT case MP_BC_POP_EXCEPT: // TODO need to work out how blocks work etc // pops block, checks it's an exception block, and restores the stack, saving the 3 exception values to local threadstate |