1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use crate::data::Value;
use crate::data::exception::UncheckedException;
use crate::data::value_typed::{BOOL_TYPE_TAG, INT_TYPE_TAG, VALUE_TYPE_TAG_MASK, FLOAT_TYPE_TAG};
#[inline(never)] pub unsafe fn checked_neg(
src: Value,
dest: &mut Value
) -> Result<(), UncheckedException> {
if !src.is_value() {
return Err(UncheckedException::InvalidUnaryOp { unary_op: '-', src });
}
let src_tag: usize = src.vt_data.tag & (VALUE_TYPE_TAG_MASK as usize);
if src_tag == INT_TYPE_TAG {
*dest = Value::new_int(-src.vt_data.inner.int_value);
Ok(())
} else if src_tag == FLOAT_TYPE_TAG {
*dest = Value::new_float(-src.vt_data.inner.float_value);
Ok(())
} else {
Err(UncheckedException::InvalidUnaryOp { unary_op: '-', src })
}
}
#[inline(never)] pub unsafe fn checked_not(
src: Value,
dest: &mut Value
) -> Result<(), UncheckedException> {
if !src.is_value() {
return Err(UncheckedException::InvalidUnaryOp { unary_op: '!', src });
}
let src_tag: usize = src.vt_data.tag & (VALUE_TYPE_TAG_MASK as usize);
if src_tag == BOOL_TYPE_TAG {
*dest = Value::new_bool(!src.vt_data.inner.bool_value);
Ok(())
} else {
Err(UncheckedException::InvalidUnaryOp { unary_op: '!', src })
}
}
#[inline(never)] pub unsafe fn checked_bit_not(
src: Value,
dest: &mut Value
) -> Result<(), UncheckedException> {
if !src.is_value() {
return Err(UncheckedException::InvalidUnaryOp { unary_op: '~', src });
}
let src_tag: usize = src.vt_data.tag & (VALUE_TYPE_TAG_MASK as usize);
if src_tag == INT_TYPE_TAG {
*dest = Value::new_raw_value(INT_TYPE_TAG, !src.vt_data.inner.repr);
Ok(())
} else {
Err(UncheckedException::InvalidUnaryOp { unary_op: '~', src })
}
}