summaryrefslogtreecommitdiffstatshomepage
path: root/py/emitglue.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-04-20 17:50:40 +0100
committerDamien George <damien.p.george@gmail.com>2014-04-20 17:50:40 +0100
commit3558f62fb5c21a19a518c2ba75860f0b5963219e (patch)
treecf8626118be5d0169ec0f1cd0482563595704c4e /py/emitglue.c
parentbc5f0c19775e23b4f0621d52de47fb9438a78ba2 (diff)
downloadmicropython-3558f62fb5c21a19a518c2ba75860f0b5963219e.tar.gz
micropython-3558f62fb5c21a19a518c2ba75860f0b5963219e.zip
py: Making closures now passes pointer to stack, not a tuple for vars.
Closed over variables are now passed on the stack, instead of creating a tuple and passing that. This way memory for the closed over variables can be allocated within the closure object itself. See issue #510 for background.
Diffstat (limited to 'py/emitglue.c')
-rw-r--r--py/emitglue.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/py/emitglue.c b/py/emitglue.c
index ce296f4321..8b1fd97021 100644
--- a/py/emitglue.c
+++ b/py/emitglue.c
@@ -158,10 +158,17 @@ mp_obj_t mp_make_function_from_raw_code(mp_raw_code_t *rc, mp_obj_t def_args, mp
return fun;
}
-mp_obj_t mp_make_closure_from_raw_code(mp_raw_code_t *rc, mp_obj_t closure_tuple, mp_obj_t def_args, mp_obj_t def_kw_args) {
- DEBUG_OP_printf("make_closure_from_raw_code %p\n", rc);
+mp_obj_t mp_make_closure_from_raw_code(mp_raw_code_t *rc, uint n_closed_over, const mp_obj_t *args) {
+ DEBUG_OP_printf("make_closure_from_raw_code %p %u %p\n", rc, n_closed_over, argrs);
// make function object
- mp_obj_t ffun = mp_make_function_from_raw_code(rc, def_args, def_kw_args);
+ mp_obj_t ffun;
+ if (n_closed_over & 0x100) {
+ // default positional and keyword args given
+ ffun = mp_make_function_from_raw_code(rc, args[0], args[1]);
+ } else {
+ // default positional and keyword args not given
+ ffun = mp_make_function_from_raw_code(rc, MP_OBJ_NULL, MP_OBJ_NULL);
+ }
// wrap function in closure object
- return mp_obj_new_closure(ffun, closure_tuple);
+ return mp_obj_new_closure(ffun, n_closed_over & 0xff, args + ((n_closed_over >> 7) & 2));
}