1use executor::{ExecuteResult, ExecuteError};
2use module::ValType;
3use fp_ops;
4
5#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
6pub enum Value {
7 Undef,
8 I32(i32),
9 I64(i64),
10 F32(f32),
11 F64(f64)
12}
13
14impl Default for Value {
15 fn default() -> Value {
16 Value::Undef
17 }
18}
19
20impl Value {
21 pub fn get_i32(&self) -> ExecuteResult<i32> {
22 match *self {
23 Value::Undef => Ok(0),
24 Value::I32(v) => Ok(v),
25 _ => {
26 Err(ExecuteError::ValueTypeMismatch)
28 }
29 }
30 }
31
32 pub fn get_i64(&self) -> ExecuteResult<i64> {
33 match *self {
34 Value::Undef => Ok(0),
35 Value::I64(v) => Ok(v),
36 _ => {
37 Err(ExecuteError::ValueTypeMismatch)
39 }
40 }
41 }
42
43 pub fn cast_to_i64(&self) -> i64 {
44 match *self {
45 Value::Undef => 0,
46 Value::I32(v) => v as i64,
47 Value::I64(v) => v,
48 Value::F32(v) => v as i64,
49 Value::F64(v) => v as i64
50 }
51 }
52
53 pub fn reinterpret_as_i64(&self) -> i64 {
54 unsafe {
55 match *self {
56 Value::Undef => 0,
57 Value::I32(v) => v as u32 as u64 as i64,
58 Value::I64(v) => v,
59 Value::F32(v) => ::prelude::mem::transmute::<f32, u32>(v) as u64 as i64,
60 Value::F64(v) => ::prelude::mem::transmute(v)
61 }
62 }
63 }
64
65 pub fn reinterpret_from_i64(v: i64, ty: ValType) -> Value {
66 unsafe {
67 match ty {
68 ValType::I32 => Value::I32(v as i32),
69 ValType::I64 => Value::I64(v),
70 ValType::F32 => Value::F32(::std::mem::transmute(v as u64 as u32)),
71 ValType::F64 => Value::F64(::std::mem::transmute(v))
72 }
73 }
74 }
75}