diff options
Diffstat (limited to 'py/emitnative.c')
| -rw-r--r-- | py/emitnative.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/py/emitnative.c b/py/emitnative.c index 43dbcf06c..7c87b0389 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -1974,14 +1974,19 @@ STATIC void emit_native_pop_except(emit_t *emit) { STATIC void emit_native_unary_op(emit_t *emit, mp_unary_op_t op) { vtype_kind_t vtype; emit_pre_pop_reg(emit, &vtype, REG_ARG_2); - assert(vtype == VTYPE_PYOBJ); - if (op == MP_UNARY_OP_NOT) { - // we need to synthesise this operation by converting to bool first - emit_call_with_imm_arg(emit, MP_F_UNARY_OP, MP_UNARY_OP_BOOL, REG_ARG_1); - ASM_MOV_REG_REG(emit->as, REG_ARG_2, REG_RET); + if (vtype == VTYPE_PYOBJ) { + if (op == MP_UNARY_OP_NOT) { + // we need to synthesise this operation by converting to bool first + emit_call_with_imm_arg(emit, MP_F_UNARY_OP, MP_UNARY_OP_BOOL, REG_ARG_1); + ASM_MOV_REG_REG(emit->as, REG_ARG_2, REG_RET); + } + emit_call_with_imm_arg(emit, MP_F_UNARY_OP, op, REG_ARG_1); + emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET); + } else { + adjust_stack(emit, 1); + EMIT_NATIVE_VIPER_TYPE_ERROR(emit, + "unary op %q not implemented", mp_unary_op_method_name[op]); } - emit_call_with_imm_arg(emit, MP_F_UNARY_OP, op, REG_ARG_1); - emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET); } STATIC void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) { |
