summaryrefslogtreecommitdiff
path: root/py/vm.c
diff options
context:
space:
mode:
authorDavid Lechner <david@lechnology.com>2020-03-24 21:39:46 -0500
committerDamien George <damien@micropython.org>2022-03-31 16:54:00 +1100
commit1e99d29f362f8cccc60a36fcbd8590404c719f40 (patch)
tree05f686b181fdb078dbc2595809f2e24d2fa3a2db /py/vm.c
parentbb70874111dbb246624a68c013e8f1c3245ca0d8 (diff)
py/runtime: Allow multiple **args in a function call.
This is a partial implementation of PEP 448 to allow multiple ** unpackings when calling a function or method. The compiler is modified to encode the argument as a None: obj key-value pair (similar to how regular keyword arguments are encoded as str: obj pairs). The extra object that was pushed on the stack to hold a single ** unpacking object is no longer used and is removed. The runtime is modified to decode this new format. Signed-off-by: David Lechner <david@pybricks.com>
Diffstat (limited to 'py/vm.c')
-rw-r--r--py/vm.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/py/vm.c b/py/vm.c
index fa163423a..145000483 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -949,8 +949,8 @@ unwind_jump:;
// unum & 0xff == n_positional
// (unum >> 8) & 0xff == n_keyword
// We have following stack layout here:
- // fun arg0 arg1 ... kw0 val0 kw1 val1 ... seq dict <- TOS
- sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 2;
+ // fun arg0 arg1 ... kw0 val0 kw1 val1 ... seq <- TOS
+ sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 1;
#if MICROPY_STACKLESS
if (mp_obj_get_type(*sp) == &mp_type_fun_bc) {
code_state->ip = ip;
@@ -1034,8 +1034,8 @@ unwind_jump:;
// unum & 0xff == n_positional
// (unum >> 8) & 0xff == n_keyword
// We have following stack layout here:
- // fun self arg0 arg1 ... kw0 val0 kw1 val1 ... seq dict <- TOS
- sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 3;
+ // fun self arg0 arg1 ... kw0 val0 kw1 val1 ... seq <- TOS
+ sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 2;
#if MICROPY_STACKLESS
if (mp_obj_get_type(*sp) == &mp_type_fun_bc) {
code_state->ip = ip;