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
///Value

#[derive(Clone, Debug, Copy)]
pub enum Value
{
    /// Integer or i32 in Rust
    Int(i32),
    /// Long or i64 in Rust
    Long(i64),
    /// Float or f32 in Rust
    Float(f32),
    /// Double or f64 in Rust
    Double(f64),
    /// Pointer to object in pool
    Object(usize),
    /// Null reference
    Null,
    /// Boolean
    Bool(bool),
}

use crate::{machine::Machine, object::ObjectAddon};

impl ObjectAddon for Value
{
    fn to_double(&self, m: &mut Machine) -> f64
    {
        match self {
            Value::Double(d) => d.clone(),
            Value::Float(f) => f.clone() as f64,
            Value::Bool(b) => {
                if *b {
                    return 1.0;
                } else {
                    return 0.0;
                }
            }
            Value::Int(i) => *i as f64,
            Value::Long(i) => *i as f64,
            Value::Null => 0.0,
            Value::Object(id) => {
                let obj = m.pool.get(*id);
                obj.to_double(m)
            }
        }
    }
}