summaryrefslogtreecommitdiffstatshomepage
path: root/py/vm.c
diff options
context:
space:
mode:
authorDamien <damien.p.george@gmail.com>2013-12-11 00:41:43 +0000
committerDamien <damien.p.george@gmail.com>2013-12-11 00:41:43 +0000
commit9ecbcfff994621aa17fdbb5bf2f0c6710e54ea4c (patch)
tree5ab817267cb59848a83b9efa46826e403518d921 /py/vm.c
parent5285155ef766a00d1eac868cebe92c01c836c64d (diff)
downloadmicropython-9ecbcfff994621aa17fdbb5bf2f0c6710e54ea4c.tar.gz
micropython-9ecbcfff994621aa17fdbb5bf2f0c6710e54ea4c.zip
py: work towards working closures.
Diffstat (limited to 'py/vm.c')
-rw-r--r--py/vm.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/py/vm.c b/py/vm.c
index fabed0f02e..55c7bd30cd 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -120,6 +120,16 @@ bool py_execute_byte_code_2(const byte **ip_in_out, py_obj_t *fastn, py_obj_t **
PUSH(fastn[unum]);
break;
+ case PYBC_LOAD_DEREF:
+ DECODE_UINT;
+ PUSH(py_obj_get_cell(fastn[unum]));
+ break;
+
+ case PYBC_LOAD_CLOSURE:
+ DECODE_UINT;
+ PUSH(fastn[unum]);
+ break;
+
case PYBC_LOAD_NAME:
DECODE_QSTR;
PUSH(rt_load_name(qstr));
@@ -162,6 +172,11 @@ bool py_execute_byte_code_2(const byte **ip_in_out, py_obj_t *fastn, py_obj_t **
fastn[unum] = POP();
break;
+ case PYBC_STORE_DEREF:
+ DECODE_UINT;
+ py_obj_set_cell(fastn[unum], POP());
+ break;
+
case PYBC_STORE_NAME:
DECODE_QSTR;
rt_store_name(qstr, POP());
@@ -382,6 +397,12 @@ bool py_execute_byte_code_2(const byte **ip_in_out, py_obj_t *fastn, py_obj_t **
PUSH(rt_make_function_from_id(unum));
break;
+ case PYBC_MAKE_CLOSURE:
+ DECODE_UINT;
+ obj1 = POP();
+ PUSH(rt_make_closure_from_id(unum, obj1));
+ break;
+
case PYBC_CALL_FUNCTION:
DECODE_UINT;
assert((unum & 0xff00) == 0); // n_keyword