diff options
-rw-r--r-- | py/emitnative.c | 19 | ||||
-rw-r--r-- | tests/micropython/viper_error.py | 5 | ||||
-rw-r--r-- | tests/micropython/viper_error.py.exp | 3 |
3 files changed, 20 insertions, 7 deletions
diff --git a/py/emitnative.c b/py/emitnative.c index 43dbcf06cb..7c87b03899 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) { diff --git a/tests/micropython/viper_error.py b/tests/micropython/viper_error.py index 0762f50797..116bd4ea03 100644 --- a/tests/micropython/viper_error.py +++ b/tests/micropython/viper_error.py @@ -52,3 +52,8 @@ test("@micropython.viper\ndef f(): 1[x] = 1") # must raise an object test("@micropython.viper\ndef f(): raise 1") + +# unary ops not implemented +test("@micropython.viper\ndef f(x:int): +x") +test("@micropython.viper\ndef f(x:int): -x") +test("@micropython.viper\ndef f(x:int): ~x") diff --git a/tests/micropython/viper_error.py.exp b/tests/micropython/viper_error.py.exp index ad1ba34c60..1afcd4bdbe 100644 --- a/tests/micropython/viper_error.py.exp +++ b/tests/micropython/viper_error.py.exp @@ -10,3 +10,6 @@ ViperTypeError("can't load from 'int'",) ViperTypeError("can't store to 'int'",) ViperTypeError("can't store to 'int'",) ViperTypeError('must raise an object',) +ViperTypeError('unary op __pos__ not implemented',) +ViperTypeError('unary op __neg__ not implemented',) +ViperTypeError('unary op __invert__ not implemented',) |