py/emitnative: Raise ViperTypeError for unsupported unary ops.
This commit is contained in:
parent
7e12a601b8
commit
9f5f156b9d
|
@ -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) {
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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',)
|
||||
|
|
Loading…
Reference in New Issue