summaryrefslogtreecommitdiff
path: root/py/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/vm.c')
-rw-r--r--py/vm.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/py/vm.c b/py/vm.c
index c8e4ba9f4..78a96a48c 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -759,19 +759,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;