From e6ce10a3e74d477b301ffd90c2e2e07b55ad13d4 Mon Sep 17 00:00:00 2001 From: Damien George Date: Sat, 6 Sep 2014 18:38:20 +0100 Subject: [PATCH] py: Native emitter now supports delete name & global, and end finally. --- py/emitnative.c | 44 +++++++++++++++++++++----------------------- py/nativeglue.c | 2 ++ py/runtime0.h | 2 ++ 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/py/emitnative.c b/py/emitnative.c index 1e1596ccc4..c24f380696 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -531,7 +531,7 @@ STATIC void emit_access_stack(emit_t *emit, int pos, vtype_kind_t *vtype, int re } } -STATIC void emit_pre_pop_discard(emit_t *emit, vtype_kind_t *vtype) { +STATIC void emit_pre_pop_discard(emit_t *emit) { emit->last_emit_was_return_value = false; adjust_stack(emit, -1); } @@ -1040,34 +1040,32 @@ STATIC void emit_native_store_subscr(emit_t *emit) { emit_call(emit, MP_F_OBJ_SUBSCR); } -STATIC void emit_native_delete_fast(emit_t *emit, qstr qstr, int local_num) { - // not implemented +STATIC void emit_native_delete_fast(emit_t *emit, qstr qst, int local_num) { + // TODO implement me! // could support for Python types, just set to None (so GC can reclaim it) - assert(0); } -STATIC void emit_native_delete_deref(emit_t *emit, qstr qstr, int local_num) { - // not supported - assert(0); +STATIC void emit_native_delete_deref(emit_t *emit, qstr qst, int local_num) { + // TODO implement me! } -STATIC void emit_native_delete_name(emit_t *emit, qstr qstr) { - // not implemented - // use mp_delete_name - assert(0); +STATIC void emit_native_delete_name(emit_t *emit, qstr qst) { + emit_native_pre(emit); + emit_call_with_imm_arg(emit, MP_F_DELETE_NAME, qst, REG_ARG_1); + emit_post(emit); } -STATIC void emit_native_delete_global(emit_t *emit, qstr qstr) { - // not implemented - // use mp_delete_global - assert(0); +STATIC void emit_native_delete_global(emit_t *emit, qstr qst) { + emit_native_pre(emit); + emit_call_with_imm_arg(emit, MP_F_DELETE_GLOBAL, qst, REG_ARG_1); + emit_post(emit); } -STATIC void emit_native_delete_attr(emit_t *emit, qstr qstr) { +STATIC void emit_native_delete_attr(emit_t *emit, qstr qst) { vtype_kind_t vtype_base; emit_pre_pop_reg(emit, &vtype_base, REG_ARG_1); // arg1 = base assert(vtype_base == VTYPE_PYOBJ); - emit_call_with_2_imm_args(emit, MP_F_STORE_ATTR, qstr, REG_ARG_2, (mp_uint_t)MP_OBJ_NULL, REG_ARG_3); // arg2 = attribute name, arg3 = value (null for delete) + emit_call_with_2_imm_args(emit, MP_F_STORE_ATTR, qst, REG_ARG_2, (mp_uint_t)MP_OBJ_NULL, REG_ARG_3); // arg2 = attribute name, arg3 = value (null for delete) emit_post(emit); } @@ -1092,8 +1090,7 @@ STATIC void emit_native_dup_top_two(emit_t *emit) { } STATIC void emit_native_pop_top(emit_t *emit) { - vtype_kind_t vtype; - emit_pre_pop_discard(emit, &vtype); + emit_pre_pop_discard(emit); emit_post(emit); } @@ -1243,11 +1240,12 @@ STATIC void emit_native_setup_except(emit_t *emit, uint label) { } STATIC void emit_native_setup_finally(emit_t *emit, uint label) { - assert(0); + emit_native_setup_except(emit, label); } STATIC void emit_native_end_finally(emit_t *emit) { - //assert(0); + emit_pre_pop_discard(emit); + emit_post(emit); } STATIC void emit_native_get_iter(emit_t *emit) { @@ -1608,12 +1606,12 @@ STATIC void emit_native_start_except_handler(emit_t *emit) { adjust_stack(emit, 2); vtype_kind_t vtype_nlr; emit_pre_pop_reg(emit, &vtype_nlr, REG_ARG_1); // get the thrown value - emit_pre_pop_discard(emit, &vtype_nlr); // discard the linked-list pointer in the nlr_buf + emit_pre_pop_discard(emit); // discard the linked-list pointer in the nlr_buf emit_post_push_reg_reg_reg(emit, VTYPE_PYOBJ, REG_ARG_1, VTYPE_PYOBJ, REG_ARG_1, VTYPE_PYOBJ, REG_ARG_1); // push the 3 exception items } STATIC void emit_native_end_except_handler(emit_t *emit) { - adjust_stack(emit, -3); // stack adjust (not sure why it's this much...) + adjust_stack(emit, -2); } const emit_method_table_t EXPORT_FUN(method_table) = { diff --git a/py/nativeglue.c b/py/nativeglue.c index d269650adb..235c4a4dbe 100644 --- a/py/nativeglue.c +++ b/py/nativeglue.c @@ -125,6 +125,8 @@ void *const mp_fun_table[MP_F_NUMBER_OF] = { #endif mp_unpack_sequence, mp_unpack_ex, + mp_delete_name, + mp_delete_global, }; /* diff --git a/py/runtime0.h b/py/runtime0.h index 7bb16545f7..d309d7b8c7 100644 --- a/py/runtime0.h +++ b/py/runtime0.h @@ -145,6 +145,8 @@ typedef enum { #endif MP_F_UNPACK_SEQUENCE, MP_F_UNPACK_EX, + MP_F_DELETE_NAME, + MP_F_DELETE_GLOBAL, MP_F_NUMBER_OF, } mp_fun_kind_t;