diff options
Diffstat (limited to 'py/vm.c')
-rw-r--r-- | py/vm.c | 27 |
1 files changed, 12 insertions, 15 deletions
@@ -481,13 +481,6 @@ dispatch_loop: } DISPATCH(); - /* we are trying to get away without using this opcode - ENTRY(MP_BC_SETUP_LOOP): - DECODE_UINT; - // push_block(MP_BC_SETUP_LOOP, ip + unum, sp) - DISPATCH(); - */ - ENTRY(MP_BC_SETUP_WITH): obj1 = TOP(); SET_TOP(mp_load_attr(obj1, MP_QSTR___exit__)); @@ -759,19 +752,23 @@ unwind_jump: SET_TOP(mp_make_function_from_raw_code((mp_raw_code_t*)unum, TOP(), obj1)); DISPATCH(); - ENTRY(MP_BC_MAKE_CLOSURE): + ENTRY(MP_BC_MAKE_CLOSURE): { DECODE_PTR; - // Stack layout: closure_tuple <- TOS - SET_TOP(mp_make_closure_from_raw_code((mp_raw_code_t*)unum, TOP(), MP_OBJ_NULL, MP_OBJ_NULL)); + machine_uint_t n_closed_over = *ip++; + // Stack layout: closed_overs <- TOS + sp -= n_closed_over - 1; + SET_TOP(mp_make_closure_from_raw_code((mp_raw_code_t*)unum, n_closed_over, sp)); DISPATCH(); + } - ENTRY(MP_BC_MAKE_CLOSURE_DEFARGS): + ENTRY(MP_BC_MAKE_CLOSURE_DEFARGS): { DECODE_PTR; - // Stack layout: def_tuple def_dict closure_tuple <- TOS - obj1 = POP(); - obj2 = POP(); - SET_TOP(mp_make_closure_from_raw_code((mp_raw_code_t*)unum, obj1, TOP(), obj2)); + machine_uint_t n_closed_over = *ip++; + // Stack layout: def_tuple def_dict closed_overs <- TOS + sp -= 2 + n_closed_over - 1; + SET_TOP(mp_make_closure_from_raw_code((mp_raw_code_t*)unum, 0x100 | n_closed_over, sp)); DISPATCH(); + } ENTRY(MP_BC_CALL_FUNCTION): DECODE_UINT; |