rlua 0.20.1

High level bindings to Lua 5.x
Documentation
use std::sync::Arc;

use rlua::{Error, Lua, Nil, RluaCompat, UserData};

#[cfg(not(rlua_luajit))] // Custom allocators for LuaJIT not available
#[test]
fn test_memory_limit() {
    let lua = Lua::new();
    let initial_memory = lua.used_memory();
    assert!(
        initial_memory > 0,
        "used_memory reporting is wrong, lua uses memory for stdlib"
    );

    lua.context(|ctx| {
        let f = ctx
            .load("local t = {}; for i = 1,10000 do t[i] = i end")
            .into_function()
            .unwrap();
        f.call::<_, ()>(()).expect("should trigger no memory limit");

        // It's not clear this is needed.  On Lua 5.1, we fail to allocate
        // memory in the following `f.call` before actually running the
        // function otherwise.
        lua.gc_collect().expect("should collect garbage");

        lua.set_memory_limit(initial_memory + 10000).unwrap();
        match f.call::<_, ()>(()) {
            Err(Error::MemoryError(_)) => {}
            something_else => panic!("did not trigger memory error: {:?}", something_else),
        }

        lua.set_memory_limit(usize::MAX).unwrap();
        f.call::<_, ()>(()).expect("should trigger no memory limit");
    });
}

#[test]
fn test_gc_control() {
    let lua = Lua::new();
    #[cfg(any(rlua_lua53, rlua_lua54))]
    assert!(lua.gc_is_running());
    lua.gc_stop();
    #[cfg(any(rlua_lua53, rlua_lua54))]
    assert!(!lua.gc_is_running());
    lua.gc_restart();
    #[cfg(any(rlua_lua53, rlua_lua54))]
    assert!(lua.gc_is_running());

    struct MyUserdata(Arc<()>);
    impl UserData for MyUserdata {}

    lua.context(|ctx| {
        let rc = Arc::new(());
        ctx.globals()
            .set(
                "userdata",
                ctx.create_userdata(MyUserdata(rc.clone())).unwrap(),
            )
            .unwrap();
        ctx.globals().set("userdata", Nil).unwrap();

        assert_eq!(Arc::strong_count(&rc), 2);
        lua.gc_collect().unwrap();
        lua.gc_collect().unwrap();
        assert_eq!(Arc::strong_count(&rc), 1);
    });
}