runestick 0.9.1

Runescript, a generic stack-based virtual machine for Rust.
Documentation
use runestick::{Any, AnyObj, Shared};

#[global_allocator]
static ALLOCATOR: checkers::Allocator = checkers::Allocator::system();

#[derive(Any, Debug, PartialEq, Eq)]
struct Foo(isize);

#[checkers::test]
fn test_take() {
    let thing = Shared::new(AnyObj::new(Foo(0)));
    let _ = thing.take().unwrap();
}

#[checkers::test]
fn test_clone_take() {
    let thing = Shared::new(AnyObj::new(Foo(0)));
    let thing2 = thing.clone();
    assert_eq!(Foo(0), thing2.take_downcast::<Foo>().unwrap());
    assert!(thing.take().is_err());
}

#[checkers::test]
fn test_from_ref() {
    #[derive(Any)]
    struct Thing(u32);

    let value = Thing(10u32);

    unsafe {
        let (shared, guard) = Shared::from_ref(&value);
        assert!(shared.downcast_borrow_mut::<Thing>().is_err());
        assert_eq!(10u32, shared.downcast_borrow_ref::<Thing>().unwrap().0);

        drop(guard);

        assert!(shared.downcast_borrow_mut::<Thing>().is_err());
        assert!(shared.downcast_borrow_ref::<Thing>().is_err());
    }
}

#[checkers::test]
fn test_from_mut() {
    #[derive(Any)]
    struct Thing(u32);

    let mut value = Thing(10u32);

    unsafe {
        let (shared, guard) = Shared::from_mut(&mut value);
        shared.downcast_borrow_mut::<Thing>().unwrap().0 = 20;

        assert_eq!(20u32, shared.downcast_borrow_mut::<Thing>().unwrap().0);
        assert_eq!(20u32, shared.downcast_borrow_ref::<Thing>().unwrap().0);

        drop(guard);

        assert!(shared.downcast_borrow_mut::<Thing>().is_err());
        assert!(shared.downcast_borrow_ref::<Thing>().is_err());
    }
}