diff options
author | Damien George <damien.p.george@gmail.com> | 2014-09-29 16:41:37 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-09-29 19:42:06 +0100 |
commit | 6f81348fa25216f03686b342765f337ab57e2e5f (patch) | |
tree | f0fc55b32521dde22764875deffd9cd92db60636 /py | |
parent | a7329615eb5b55869ae8a460f9b9be5be04a5bee (diff) | |
download | micropython-6f81348fa25216f03686b342765f337ab57e2e5f.tar.gz micropython-6f81348fa25216f03686b342765f337ab57e2e5f.zip |
py: Allow viper to use ints as direct conditionals in jumps.
Allows things like: if 1: ...
Diffstat (limited to 'py')
-rw-r--r-- | py/emitnative.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/py/emitnative.c b/py/emitnative.c index c2aa7a76bc..cfcba27a13 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -1365,20 +1365,25 @@ STATIC void emit_native_jump(emit_t *emit, mp_uint_t label) { STATIC void emit_native_jump_helper(emit_t *emit, mp_uint_t label, bool pop) { vtype_kind_t vtype = peek_vtype(emit); - if (vtype == VTYPE_BOOL) { - emit_pre_pop_reg(emit, &vtype, REG_RET); - if (!pop) { - adjust_stack(emit, 1); - } - } else if (vtype == VTYPE_PYOBJ) { - emit_pre_pop_reg(emit, &vtype, REG_ARG_1); - if (!pop) { - adjust_stack(emit, 1); - } - emit_call(emit, MP_F_OBJ_IS_TRUE); - } else { - printf("ViperTypeError: expecting a bool or pyobj, got %d\n", vtype); - assert(0); + switch (vtype) { + case VTYPE_PYOBJ: + emit_pre_pop_reg(emit, &vtype, REG_ARG_1); + if (!pop) { + adjust_stack(emit, 1); + } + emit_call(emit, MP_F_OBJ_IS_TRUE); + break; + case VTYPE_BOOL: + case VTYPE_INT: + case VTYPE_UINT: + emit_pre_pop_reg(emit, &vtype, REG_RET); + if (!pop) { + adjust_stack(emit, 1); + } + break; + default: + printf("ViperTypeError: expecting a bool or pyobj, got %d\n", vtype); + assert(0); } // need to commit stack because we may jump elsewhere need_stack_settled(emit); |