py: Allow viper to use ints as direct conditionals in jumps.

Allows things like: if 1: ...
This commit is contained in:
Damien George 2014-09-29 16:41:37 +01:00
parent a7329615eb
commit 6f81348fa2
3 changed files with 36 additions and 14 deletions

View File

@ -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);

View File

@ -0,0 +1,15 @@
# using a bool as a conditional
@micropython.viper
def f():
x = True
if x:
print("x", x)
f()
# using an int as a conditional
@micropython.viper
def g():
y = 1
if y:
print("y", y)
g()

View File

@ -0,0 +1,2 @@
x True
y 1