diff options
Diffstat (limited to 'py/vm.c')
-rw-r--r-- | py/vm.c | 73 |
1 files changed, 71 insertions, 2 deletions
@@ -1,4 +1,5 @@ #include <stdio.h> +#include <string.h> #include <assert.h> #include "nlr.h" @@ -670,6 +671,40 @@ unwind_jump: SET_TOP(mp_call_function_n_kw(*sp, unum & 0xff, (unum >> 8) & 0xff, sp + 1)); break; + case MP_BC_CALL_FUNCTION_VAR: + DECODE_UINT; + // unum & 0xff == n_positional + // (unum >> 8) & 0xff == n_keyword + // We have folowing stack layout here: + // fun arg0 arg1 ... kw0 val0 kw1 val1 ... seq <- TOS + obj1 = POP(); + sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe); + SET_TOP(mp_call_method_n_kw_var(false, unum, sp, obj1, MP_OBJ_NULL)); + break; + + case MP_BC_CALL_FUNCTION_KW: + DECODE_UINT; + // unum & 0xff == n_positional + // (unum >> 8) & 0xff == n_keyword + // We have folowing stack layout here: + // fun arg0 arg1 ... kw0 val0 kw1 val1 ... dict <- TOS + obj1 = POP(); + sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe); + SET_TOP(mp_call_method_n_kw_var(false, unum, sp, MP_OBJ_NULL, obj1)); + break; + + case MP_BC_CALL_FUNCTION_VAR_KW: + DECODE_UINT; + // unum & 0xff == n_positional + // (unum >> 8) & 0xff == n_keyword + // We have folowing stack layout here: + // fun arg0 arg1 ... kw0 val0 kw1 val1 ... seq dict <- TOS + obj2 = POP(); + obj1 = POP(); + sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe); + SET_TOP(mp_call_method_n_kw_var(false, unum, sp, obj1, obj2)); + break; + case MP_BC_CALL_METHOD: DECODE_UINT; // unum & 0xff == n_positional @@ -678,6 +713,40 @@ unwind_jump: SET_TOP(mp_call_method_n_kw(unum & 0xff, (unum >> 8) & 0xff, sp)); break; + case MP_BC_CALL_METHOD_VAR: + DECODE_UINT; + // unum & 0xff == n_positional + // (unum >> 8) & 0xff == n_keyword + // We have folowing stack layout here: + // fun self arg0 arg1 ... kw0 val0 kw1 val1 ... seq <- TOS + obj1 = POP(); + sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 1; + SET_TOP(mp_call_method_n_kw_var(true, unum, sp, obj1, MP_OBJ_NULL)); + break; + + case MP_BC_CALL_METHOD_KW: + DECODE_UINT; + // unum & 0xff == n_positional + // (unum >> 8) & 0xff == n_keyword + // We have folowing stack layout here: + // fun self arg0 arg1 ... kw0 val0 kw1 val1 ... dict <- TOS + obj1 = POP(); + sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 1; + SET_TOP(mp_call_method_n_kw_var(true, unum, sp, MP_OBJ_NULL, obj1)); + break; + + case MP_BC_CALL_METHOD_VAR_KW: + DECODE_UINT; + // unum & 0xff == n_positional + // (unum >> 8) & 0xff == n_keyword + // We have folowing stack layout here: + // fun self arg0 arg1 ... kw0 val0 kw1 val1 ... seq dict <- TOS + obj2 = POP(); + obj1 = POP(); + sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 1; + SET_TOP(mp_call_method_n_kw_var(true, unum, sp, obj1, obj2)); + break; + case MP_BC_RETURN_VALUE: unwind_return: while (exc_sp >= exc_stack) { @@ -739,9 +808,9 @@ yield: if (inject_exc != MP_OBJ_NULL) { t_exc = inject_exc; inject_exc = MP_OBJ_NULL; - ret_kind = mp_obj_gen_resume(TOP(), mp_const_none, t_exc, &obj2); + ret_kind = mp_resume(TOP(), mp_const_none, t_exc, &obj2); } else { - ret_kind = mp_obj_gen_resume(TOP(), obj1, MP_OBJ_NULL, &obj2); + ret_kind = mp_resume(TOP(), obj1, MP_OBJ_NULL, &obj2); } if (ret_kind == MP_VM_RETURN_YIELD) { |