ttvm 0.2.7

Runtime and compiler infrastructure API for Rust
Documentation
pub mod env;
pub mod routine;
pub mod arch;

pub use env::*;
pub use routine::*;
pub use arch::*;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_env() {
        let mut env = Env::new();
        
        let block1 = match env.alloc(10) {
            Ok(ok) => ok,
            Err(err) => panic!("{}", err.to_string())
        };

        let block2 = match env.alloc(10) {
            Ok(ok) => ok,
            Err(err) => panic!("{}", err.to_string())
        };

        assert_eq!(block1, 1);
        assert_eq!(block2, 2);
        
        assert_eq!(match env.dealloc(block1) {
            Ok(ok) => ok,
            Err(err) => panic!("{}", err.to_string())
        }, 10);

        assert_eq!(match env.dealloc(block2) {
            Ok(ok) => ok,
            Err(err) => panic!("{}", err.to_string())
        }, 10);

        assert_eq!(*env.get_mem(), vec![Some(vec![0x0; 0]), None, None]);
        assert_eq!(*env.get_mem_mut(), vec![Some(vec![0x0; 0]), None, None]);
    
        let routine1 = match env.def(vec![RETURN, 10]) {
            Ok(ok) => ok,
            Err(err) => panic!("{}", err.to_string())
        };

        let result1 = unsafe { env.call(routine1, vec![]) };
        
        match result1 {
            Ok(ok) => {
                match ok {
                    Ok(ok) => assert_eq!(ok, 10),
                    Err(_err) => panic!("unexpected result")
                }
            },
            Err(err) => panic!("{}", err.to_string())
        };

        let routine2 = match env.def(vec![THROW, 5]) {
            Ok(ok) => ok,
            Err(err) => panic!("{}", err.to_string())
        };

        let result2 = unsafe { env.call(routine2, vec![]) };
        
        match result2 {
            Ok(ok) => {
                match ok {
                    Ok(_ok) => panic!("unexpected result"),
                    Err(err) => assert_eq!(err, 5)
                }
            },
            Err(err) => panic!("{}", err.to_string())
        };
    }

    #[test]
    fn test_routine() {
        let mut env = Env::new();
        let mut routine = Routine::from(&mut env, vec![RETURN, 10]);

        match unsafe { routine.call(Vec::new()) } {
            Ok(ok) => {
                match ok {
                    Ok(ok) => assert_eq!(ok, 10),
                    Err(err) => panic!("unexpected result")
                }
            },
            Err(err) => panic!("{}", err.to_string())
        };

        routine.push(0x0);

        assert_eq!(match routine.get(2) {
            Some(some) => *some,
            None => panic!("could not get from address 2")
        }, 0x0);

        assert_eq!(match routine.pop() {
            Some(some) => some,
            None => panic!("failed to pop")
        }, 0x0);

        *match routine.get_mut(1) {
            Some(some) => some,
            None => panic!("could not get from address 1")
        } = 20;

        assert_eq!(match routine.pop() {
            Some(some) => some,
            None => panic!("failed to pop")
        }, 20);
    }
}