diff --git a/src/scheduler.rs b/src/scheduler.rs index 05b4d8a..81611f2 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -57,27 +57,33 @@ impl Scheduler{ } } -fn coerce_float64(value:&mlua::Value)->Option<f64>{ - match value{ - &mlua::Value::Integer(i)=>Some(i as f64), - &mlua::Value::Number(f)=>Some(f), - _=>None, - } -} pub fn scheduler_mut<T>(lua:&mlua::Lua,mut f:impl FnMut(&mut crate::scheduler::Scheduler)->mlua::Result<T>)->mlua::Result<T>{ let mut scheduler=lua.app_data_mut::<crate::scheduler::Scheduler>().ok_or(mlua::Error::runtime("Scheduler missing"))?; f(&mut *scheduler) } pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{ - let schedule_thread=lua.create_function(move|lua,dt:mlua::Value|{ - let delay=coerce_float64(&dt).ok_or(mlua::Error::runtime("Expected float"))?.max(0.0)*60.0; - if delay<u64::MAX as f64{ - scheduler_mut(lua,|scheduler|{ - scheduler.schedule_thread((delay as u64).max(2),lua.current_thread()); - Ok(()) - }).unwrap(); - } - Ok(()) + let schedule_thread=lua.create_function(|lua,dt:mlua::Value|{ + let delay=match dt{ + mlua::Value::Integer(i)=>i.max(0) as u64*60, + mlua::Value::Number(f)=>{ + let delay=f.max(0.0)*60.0; + match delay.classify(){ + std::num::FpCategory::Nan=>Err(mlua::Error::runtime("NaN"))?, + std::num::FpCategory::Infinite=>return Ok(()), + std::num::FpCategory::Normal=>if (u64::MAX as f64)<delay{ + return Ok(()); + }, + _=>(), + } + delay as u64 + }, + mlua::Value::Nil=>0, + _=>Err(mlua::Error::runtime("Expected float"))?, + }; + scheduler_mut(lua,|scheduler|{ + scheduler.schedule_thread(delay.max(2),lua.current_thread()); + Ok(()) + }) })?; let wait_env=lua.create_table()?; wait_env.raw_set("coroutine",globals.get::<mlua::Table>("coroutine")?)?;