summaryrefslogtreecommitdiffstatshomepage
path: root/py/emitbc.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/emitbc.c
parent5285155ef766a00d1eac868cebe92c01c836c64d (diff)
downloadmicropython-9ecbcfff994621aa17fdbb5bf2f0c6710e54ea4c.tar.gz
micropython-9ecbcfff994621aa17fdbb5bf2f0c6710e54ea4c.zip
py: work towards working closures.
Diffstat (limited to 'py/emitbc.c')
-rw-r--r--py/emitbc.c55
1 files changed, 26 insertions, 29 deletions
diff --git a/py/emitbc.c b/py/emitbc.c
index 7d02e439e2..880c10807e 100644
--- a/py/emitbc.c
+++ b/py/emitbc.c
@@ -75,7 +75,7 @@ static void emit_bc_end_pass(emit_t *emit) {
emit->code_base = m_new(byte, emit->code_size);
} else if (emit->pass == PASS_3) {
- rt_assign_byte_code(emit->scope->unique_code_id, emit->code_base, emit->code_size, emit->scope->num_params, emit->scope->num_locals, emit->scope->stack_size, (emit->scope->flags & SCOPE_FLAG_GENERATOR) != 0);
+ rt_assign_byte_code(emit->scope->unique_code_id, emit->code_base, emit->code_size, emit->scope->num_params, emit->scope->num_locals, emit->scope->num_cells, emit->scope->stack_size, (emit->scope->flags & SCOPE_FLAG_GENERATOR) != 0);
}
}
@@ -302,24 +302,24 @@ static void emit_bc_load_fast(emit_t *emit, qstr qstr, int local_num) {
}
}
-static void emit_bc_load_name(emit_t *emit, qstr qstr) {
+static void emit_bc_load_deref(emit_t *emit, qstr qstr, int local_num) {
emit_pre(emit, 1);
- emit_write_byte_1_qstr(emit, PYBC_LOAD_NAME, qstr);
+ emit_write_byte_1_uint(emit, PYBC_LOAD_DEREF, local_num);
}
-static void emit_bc_load_global(emit_t *emit, qstr qstr) {
+static void emit_bc_load_closure(emit_t *emit, qstr qstr, int local_num) {
emit_pre(emit, 1);
- emit_write_byte_1_qstr(emit, PYBC_LOAD_GLOBAL, qstr);
+ emit_write_byte_1_uint(emit, PYBC_LOAD_CLOSURE, local_num);
}
-static void emit_bc_load_deref(emit_t *emit, qstr qstr, int local_num) {
+static void emit_bc_load_name(emit_t *emit, qstr qstr) {
emit_pre(emit, 1);
- assert(0);
+ emit_write_byte_1_qstr(emit, PYBC_LOAD_NAME, qstr);
}
-static void emit_bc_load_closure(emit_t *emit, qstr qstr, int local_num) {
+static void emit_bc_load_global(emit_t *emit, qstr qstr) {
emit_pre(emit, 1);
- assert(0);
+ emit_write_byte_1_qstr(emit, PYBC_LOAD_GLOBAL, qstr);
}
static void emit_bc_load_attr(emit_t *emit, qstr qstr) {
@@ -348,6 +348,11 @@ static void emit_bc_store_fast(emit_t *emit, qstr qstr, int local_num) {
}
}
+static void emit_bc_store_deref(emit_t *emit, qstr qstr, int local_num) {
+ emit_pre(emit, -1);
+ emit_write_byte_1_uint(emit, PYBC_STORE_DEREF, local_num);
+}
+
static void emit_bc_store_name(emit_t *emit, qstr qstr) {
emit_pre(emit, -1);
emit_write_byte_1_qstr(emit, PYBC_STORE_NAME, qstr);
@@ -358,11 +363,6 @@ static void emit_bc_store_global(emit_t *emit, qstr qstr) {
emit_write_byte_1_qstr(emit, PYBC_STORE_GLOBAL, qstr);
}
-static void emit_bc_store_deref(emit_t *emit, qstr qstr, int local_num) {
- emit_pre(emit, -1);
- assert(0);
-}
-
static void emit_bc_store_attr(emit_t *emit, qstr qstr) {
emit_pre(emit, -2);
emit_write_byte_1_qstr(emit, PYBC_STORE_ATTR, qstr);
@@ -385,6 +385,11 @@ static void emit_bc_delete_fast(emit_t *emit, qstr qstr, int local_num) {
emit_write_byte_1_uint(emit, PYBC_DELETE_FAST_N, local_num);
}
+static void emit_bc_delete_deref(emit_t *emit, qstr qstr, int local_num) {
+ emit_pre(emit, 0);
+ emit_write_byte_1_qstr(emit, PYBC_DELETE_DEREF, local_num);
+}
+
static void emit_bc_delete_name(emit_t *emit, qstr qstr) {
emit_pre(emit, 0);
emit_write_byte_1_qstr(emit, PYBC_DELETE_NAME, qstr);
@@ -395,12 +400,6 @@ static void emit_bc_delete_global(emit_t *emit, qstr qstr) {
emit_write_byte_1_qstr(emit, PYBC_DELETE_GLOBAL, qstr);
}
-static void emit_bc_delete_deref(emit_t *emit, qstr qstr, int local_num) {
- emit_pre(emit, 0);
- assert(0);
- //emit_write_byte_1_qstr(emit, PYBC_DELETE_DEREF, qstr);
-}
-
static void emit_bc_delete_attr(emit_t *emit, qstr qstr) {
emit_pre(emit, -1);
emit_write_byte_1_qstr(emit, PYBC_DELETE_ATTR, qstr);
@@ -612,11 +611,9 @@ static void emit_bc_make_function(emit_t *emit, scope_t *scope, int n_dict_param
}
static void emit_bc_make_closure(emit_t *emit, scope_t *scope, int n_dict_params, int n_default_params) {
- assert(0);
- emit_pre(emit, -2 - n_default_params - 2 * n_dict_params);
- if (emit->pass == PASS_3) {
- printf("MAKE_CLOSURE %d\n", (n_dict_params << 8) | n_default_params);
- }
+ assert(n_default_params == 0 && n_dict_params == 0);
+ emit_pre(emit, 0);
+ emit_write_byte_1_uint(emit, PYBC_MAKE_CLOSURE, scope->unique_code_id);
}
static void emit_bc_call_function(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) {
@@ -728,24 +725,24 @@ const emit_method_table_t emit_bc_method_table = {
emit_bc_load_const_verbatim_quoted_str,
emit_bc_load_const_verbatim_end,
emit_bc_load_fast,
- emit_bc_load_name,
- emit_bc_load_global,
emit_bc_load_deref,
emit_bc_load_closure,
+ emit_bc_load_name,
+ emit_bc_load_global,
emit_bc_load_attr,
emit_bc_load_method,
emit_bc_load_build_class,
emit_bc_store_fast,
+ emit_bc_store_deref,
emit_bc_store_name,
emit_bc_store_global,
- emit_bc_store_deref,
emit_bc_store_attr,
emit_bc_store_subscr,
emit_bc_store_locals,
emit_bc_delete_fast,
+ emit_bc_delete_deref,
emit_bc_delete_name,
emit_bc_delete_global,
- emit_bc_delete_deref,
emit_bc_delete_attr,
emit_bc_delete_subscr,
emit_bc_dup_top,