piccolo 0.3.3

Stackless Lua VM implemented in pure Rust
Documentation
use piccolo::{Callback, CallbackReturn, Closure, Executor, ExecutorMode, Fuel, Lua, StaticError};

#[test]
fn test_interrupt() -> Result<(), StaticError> {
    let mut lua = Lua::core();

    lua.try_enter(|ctx| {
        let callback = Callback::from_fn(&ctx, |_, mut exec, _| {
            exec.fuel().interrupt();
            Ok(CallbackReturn::Return)
        });
        ctx.set_global("callback", callback)?;
        Ok(())
    })?;

    let executor = lua.try_enter(|ctx| {
        let closure = Closure::load(ctx, None, &b"callback(); abort()"[..])?;
        Ok(ctx.stash(Executor::start(ctx, closure.into(), ())))
    })?;

    lua.enter(|ctx| {
        let executor = ctx.fetch(&executor);
        let mut fuel = Fuel::with(i32::MAX);
        assert!(!executor.step(ctx, &mut fuel));
        assert!(fuel.is_interrupted());
        assert!(executor.mode() == ExecutorMode::Normal)
    });

    Ok(())
}