diff options
| author | Damien <damien.p.george@gmail.com> | 2013-11-26 15:15:50 +0000 |
|---|---|---|
| committer | Damien <damien.p.george@gmail.com> | 2013-11-26 15:15:50 +0000 |
| commit | 6f3e7fc505a59b2b084ca576c22b08287278d1f9 (patch) | |
| tree | 9f6c6e57116dae7bc36831230a6da51e84322d07 /py | |
| parent | ff099f36d636a36888344834032383ab21611a45 (diff) | |
py: add UNPACK_SEQUENCE and keyword methods to VM.
Diffstat (limited to 'py')
| -rw-r--r-- | py/vm.c | 20 |
1 files changed, 16 insertions, 4 deletions
@@ -369,6 +369,12 @@ bool py_execute_byte_code_2(const byte **ip_in_out, py_obj_t *fastn, py_obj_t ** sp++; break; + case PYBC_UNPACK_SEQUENCE: + DECODE_UINT; + rt_unpack_sequence(sp[0], unum, sp - unum + 1); + sp -= unum - 1; + break; + case PYBC_MAKE_FUNCTION: DECODE_UINT; PUSH(rt_make_function_from_id(unum)); @@ -384,10 +390,16 @@ bool py_execute_byte_code_2(const byte **ip_in_out, py_obj_t *fastn, py_obj_t ** case PYBC_CALL_METHOD: DECODE_UINT; - assert((unum & 0xff00) == 0); // n_keyword - unum &= 0xff; - obj1 = rt_call_method_n(unum, sp); - sp += unum + 1; + if ((unum & 0xff00) == 0) { + // no keywords + unum &= 0xff; + obj1 = rt_call_method_n(unum, sp); + sp += unum + 1; + } else { + // keywords + obj1 = rt_call_method_n_kw(unum & 0xff, (unum >> 8) & 0xff, sp); + sp += (unum & 0xff) + ((unum >> 7) & 0x1fe) + 1; + } *sp = obj1; break; |
