summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/emitnative.c19
-rw-r--r--tests/micropython/viper_error.py5
-rw-r--r--tests/micropython/viper_error.py.exp3
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',)