py: Clear state to MP_OBJ_NULL before executing byte code.
This commit is contained in:
parent
a157e4caba
commit
d99944acdd
@ -252,14 +252,15 @@ mp_obj_t mp_obj_new_gen_instance(const byte *bytecode, uint n_args, const mp_obj
|
|||||||
o->state[n_state - 1 - n_args - i] = args2[i];
|
o->state[n_state - 1 - n_args - i] = args2[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set rest of state to MP_OBJ_NULL
|
||||||
|
for (uint i = 0; i < n_state - n_args - n_args2; i++) {
|
||||||
|
o->state[i] = MP_OBJ_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// bytecode prelude: initialise closed over variables
|
// bytecode prelude: initialise closed over variables
|
||||||
for (uint n_local = *bytecode++; n_local > 0; n_local--) {
|
for (uint n_local = *bytecode++; n_local > 0; n_local--) {
|
||||||
uint local_num = *bytecode++;
|
uint local_num = *bytecode++;
|
||||||
if (local_num < n_args + n_args2) {
|
o->state[n_state - 1 - local_num] = mp_obj_new_cell(o->state[n_state - 1 - local_num]);
|
||||||
o->state[n_state - 1 - local_num] = mp_obj_new_cell(o->state[n_state - 1 - local_num]);
|
|
||||||
} else {
|
|
||||||
o->state[n_state - 1 - local_num] = mp_obj_new_cell(MP_OBJ_NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// set ip to start of actual byte code
|
// set ip to start of actual byte code
|
||||||
|
11
py/vm.c
11
py/vm.c
@ -95,14 +95,15 @@ mp_vm_return_kind_t mp_execute_byte_code(const byte *code, const mp_obj_t *args,
|
|||||||
state[n_state - 1 - n_args - i] = args2[i];
|
state[n_state - 1 - n_args - i] = args2[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set rest of state to MP_OBJ_NULL
|
||||||
|
for (uint i = 0; i < n_state - n_args - n_args2; i++) {
|
||||||
|
state[i] = MP_OBJ_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// bytecode prelude: initialise closed over variables
|
// bytecode prelude: initialise closed over variables
|
||||||
for (uint n_local = *ip++; n_local > 0; n_local--) {
|
for (uint n_local = *ip++; n_local > 0; n_local--) {
|
||||||
uint local_num = *ip++;
|
uint local_num = *ip++;
|
||||||
if (local_num < n_args + n_args2) {
|
state[n_state - 1 - local_num] = mp_obj_new_cell(state[n_state - 1 - local_num]);
|
||||||
state[n_state - 1 - local_num] = mp_obj_new_cell(state[n_state - 1 - local_num]);
|
|
||||||
} else {
|
|
||||||
state[n_state - 1 - local_num] = mp_obj_new_cell(MP_OBJ_NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// execute the byte code
|
// execute the byte code
|
||||||
|
Loading…
Reference in New Issue
Block a user