diff options
author | Damien George <damien.p.george@gmail.com> | 2014-03-31 11:59:23 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-03-31 11:59:23 +0100 |
commit | 523b575039d96d63669ad8c1fa318ba4db046aca (patch) | |
tree | bc191c86845b3c5714d11f24e8848f22020308e5 /py/vm.c | |
parent | 3056509e00c02e4faef44d90bf3953dcf0b0d4a0 (diff) |
py: Add LOAD_NULL bytecode and use it to simplify function calls.
Adding this bytecode allows to remove 4 others related to
function/method calls with * and ** support. Will also help with
bytecodes that make functions/closures with default positional and
keyword args.
Diffstat (limited to 'py/vm.c')
-rw-r--r-- | py/vm.c | 60 |
1 files changed, 8 insertions, 52 deletions
@@ -220,6 +220,10 @@ dispatch_loop: PUSH(mp_load_const_str(qst)); break; + case MP_BC_LOAD_NULL: + PUSH(MP_OBJ_NULL); + break; + case MP_BC_LOAD_FAST_0: PUSH(fastn[0]); break; @@ -671,38 +675,14 @@ 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)); + sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 2; + SET_TOP(mp_call_method_n_kw_var(false, unum, sp)); break; case MP_BC_CALL_METHOD: @@ -713,38 +693,14 @@ 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)); + sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 3; + SET_TOP(mp_call_method_n_kw_var(true, unum, sp)); break; case MP_BC_RETURN_VALUE: |