summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-04-07 00:08:17 +0100
committerDamien George <damien.p.george@gmail.com>2015-04-07 00:08:17 +0100
commitc9aa1883ed87da61d5745036dc55c382c3f4d6ca (patch)
treed4967e844be00547c329f38606f4ac3fc7fc4728
parent78772ada0ddc9222c0338f94a42e33e10bb24b55 (diff)
downloadmicropython-c9aa1883ed87da61d5745036dc55c382c3f4d6ca.tar.gz
micropython-c9aa1883ed87da61d5745036dc55c382c3f4d6ca.zip
py: Simplify bytecode prelude when encoding closed over variables.
-rw-r--r--py/bc.c7
-rw-r--r--py/emitbc.c11
-rw-r--r--py/showbc.c6
-rw-r--r--tests/cmdline/cmd_showbc.py.exp10
-rw-r--r--tests/cmdline/cmd_verbose.py.exp1
5 files changed, 8 insertions, 27 deletions
diff --git a/py/bc.c b/py/bc.c
index af855e9474..865065ab19 100644
--- a/py/bc.c
+++ b/py/bc.c
@@ -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)