summaryrefslogtreecommitdiffstatshomepage
path: root/py/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/vm.c')
-rw-r--r--py/vm.c73
1 files changed, 71 insertions, 2 deletions
diff --git a/py/vm.c b/py/vm.c
index 8e16c12ffe..edcad39565 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -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) {