diff options
author | Damien George <damien.p.george@gmail.com> | 2015-04-07 00:08:17 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-04-07 00:08:17 +0100 |
commit | c9aa1883ed87da61d5745036dc55c382c3f4d6ca (patch) | |
tree | d4967e844be00547c329f38606f4ac3fc7fc4728 | |
parent | 78772ada0ddc9222c0338f94a42e33e10bb24b55 (diff) | |
download | micropython-c9aa1883ed87da61d5745036dc55c382c3f4d6ca.tar.gz micropython-c9aa1883ed87da61d5745036dc55c382c3f4d6ca.zip |
py: Simplify bytecode prelude when encoding closed over variables.
-rw-r--r-- | py/bc.c | 7 | ||||
-rw-r--r-- | py/emitbc.c | 11 | ||||
-rw-r--r-- | py/showbc.c | 6 | ||||
-rw-r--r-- | tests/cmdline/cmd_showbc.py.exp | 10 | ||||
-rw-r--r-- | tests/cmdline/cmd_verbose.py.exp | 1 |
5 files changed, 8 insertions, 27 deletions
@@ -228,9 +228,10 @@ continue2:; // bytecode prelude: initialise closed over variables const byte *ip = code_state->ip; - for (mp_uint_t n_local = *ip++; n_local > 0; n_local--) { - mp_uint_t local_num = *ip++; - code_state->state[n_state - 1 - local_num] = mp_obj_new_cell(code_state->state[n_state - 1 - local_num]); + mp_uint_t local_num; + while ((local_num = *ip++) != 255) { + code_state->state[n_state - 1 - local_num] = + mp_obj_new_cell(code_state->state[n_state - 1 - local_num]); } // now that we skipped over the prelude, set the ip for the VM diff --git a/py/emitbc.c b/py/emitbc.c index 70267bd7cc..f55fa964be 100644 --- a/py/emitbc.c +++ b/py/emitbc.c @@ -322,21 +322,14 @@ void mp_emit_bc_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope) { } // bytecode prelude: initialise closed over variables - int num_cell = 0; - for (int i = 0; i < scope->id_info_len; i++) { - id_info_t *id = &scope->id_info[i]; - if (id->kind == ID_INFO_KIND_CELL) { - num_cell += 1; - } - } - assert(num_cell <= 255); - emit_write_bytecode_byte(emit, num_cell); // write number of locals that are cells for (int i = 0; i < scope->id_info_len; i++) { id_info_t *id = &scope->id_info[i]; if (id->kind == ID_INFO_KIND_CELL) { + assert(id->local_num < 255); emit_write_bytecode_byte(emit, id->local_num); // write the local which should be converted to a cell } } + emit_write_bytecode_byte(emit, 255); // end of list sentinel } void mp_emit_bc_end_pass(emit_t *emit) { diff --git a/py/showbc.c b/py/showbc.c index 3a468326db..c9eeaff9fa 100644 --- a/py/showbc.c +++ b/py/showbc.c @@ -95,10 +95,8 @@ void mp_bytecode_print(const void *descr, mp_uint_t n_total_args, const byte *ip // bytecode prelude: initialise closed over variables { - uint n_local = *ip++; - printf("(NUM_LOCAL %u)\n", n_local); - for (; n_local > 0; n_local--) { - uint local_num = *ip++; + uint local_num; + while ((local_num = *ip++) != 255) { printf("(INIT_CELL %u)\n", local_num); } len -= ip - mp_showbc_code_start; diff --git a/tests/cmdline/cmd_showbc.py.exp b/tests/cmdline/cmd_showbc.py.exp index edea49ae7a..a7088894e7 100644 --- a/tests/cmdline/cmd_showbc.py.exp +++ b/tests/cmdline/cmd_showbc.py.exp @@ -5,7 +5,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: (N_STATE 3) (N_EXC_STACK 0) -(NUM_LOCAL 0) bc=-3 line=1 ######## bc=\\d\+ line=134 @@ -32,7 +31,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: (N_STATE 25) (N_EXC_STACK 2) -(NUM_LOCAL 3) (INIT_CELL 14) (INIT_CELL 15) (INIT_CELL 16) @@ -304,7 +302,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: a (N_STATE 5) (N_EXC_STACK 0) -(NUM_LOCAL 1) (INIT_CELL 0) ######## bc=\\d\+ line=124 @@ -323,7 +320,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: (N_STATE 2) (N_EXC_STACK 0) -(NUM_LOCAL 0) bc=-3 line=1 bc=0 line=129 bc=3 line=130 @@ -348,7 +344,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: (N_STATE 1) (N_EXC_STACK 0) -(NUM_LOCAL 0) bc=-3 line=1 bc=10 line=135 00 LOAD_NAME __name__ (cache=0) @@ -364,7 +359,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: c e (N_STATE 6) (N_EXC_STACK 0) -(NUM_LOCAL 0) bc=-\\d\+ line=1 00 LOAD_FAST 2 01 FOR_ITER 17 @@ -384,7 +378,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: c e (N_STATE 7) (N_EXC_STACK 0) -(NUM_LOCAL 0) bc=-\\d\+ line=1 00 BUILD_LIST 0 02 LOAD_FAST 2 @@ -403,7 +396,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: c e (N_STATE 8) (N_EXC_STACK 0) -(NUM_LOCAL 0) bc=-\\d\+ line=1 ######## 00 BUILD_MAP 0 @@ -424,7 +416,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: x (N_STATE 4) (N_EXC_STACK 0) -(NUM_LOCAL 0) bc=-\\d\+ line=1 ######## bc=\\d\+ line=105 @@ -444,7 +435,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: b a (N_STATE 4) (N_EXC_STACK 0) -(NUM_LOCAL 0) bc=-\\d\+ line=1 ######## bc=\\d\+ line=125 diff --git a/tests/cmdline/cmd_verbose.py.exp b/tests/cmdline/cmd_verbose.py.exp index cf18fcfd16..3e115f9ae6 100644 --- a/tests/cmdline/cmd_verbose.py.exp +++ b/tests/cmdline/cmd_verbose.py.exp @@ -7,7 +7,6 @@ Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+): arg names: (N_STATE 2) (N_EXC_STACK 0) -(NUM_LOCAL 0) bc=-3 line=1 bc=0 line=3 00 LOAD_NAME print (cache=0) |