From 600ae734cf3d0ca5274086b897f1ebaf20cf9d20 Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 21 Jan 2014 23:48:04 +0000 Subject: py: Implement break and continue byte codes, and add tests. Also fixes a bug in the for-in-range optimiser. I hope to remove break and continue byte codes in the future and just use jump (if possible). --- py/vm.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'py/vm.c') diff --git a/py/vm.c b/py/vm.c index c41146ac8f..b6db0bb87f 100644 --- a/py/vm.c +++ b/py/vm.c @@ -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 -- cgit v1.2.3