diff --git a/src/multi.rs b/src/multi.rs index ef46c39..f67b711 100644 --- a/src/multi.rs +++ b/src/multi.rs @@ -204,6 +204,23 @@ impl IntoLuaMulti for MultiValue { } } +impl IntoLuaMulti for &MultiValue { + #[inline] + fn into_lua_multi(self, _: &Lua) -> Result { + Ok(self.clone()) + } + + #[inline] + unsafe fn push_into_stack_multi(self, lua: &RawLua) -> Result { + let nresults = self.len() as i32; + check_stack(lua.state(), nresults + 1)?; + for value in &self.0 { + lua.push_value(value)?; + } + Ok(nresults) + } +} + impl FromLuaMulti for MultiValue { #[inline] fn from_lua_multi(values: MultiValue, _: &Lua) -> Result { diff --git a/tests/multi.rs b/tests/multi.rs index 3208555..7468c49 100644 --- a/tests/multi.rs +++ b/tests/multi.rs @@ -72,6 +72,26 @@ fn test_multivalue() { let _multi2 = MultiValue::from_vec(vec); } +#[test] +fn test_multivalue_by_ref() -> Result<()> { + let lua = Lua::new(); + let multi = MultiValue::from_vec(vec![ + Value::Integer(3), + Value::String(lua.create_string("hello")?), + Value::Boolean(true), + ]); + + let f = lua.create_function(|_, (i, s, b): (i32, String, bool)| { + assert_eq!(i, 3); + assert_eq!(s.to_str()?, "hello"); + assert_eq!(b, true); + Ok(()) + })?; + f.call::<()>(&multi)?; + + Ok(()) +} + #[test] fn test_variadic() { let mut var = Variadic::with_capacity(3);