Optimize async calls:
Rewrite "unpack" function using C api rather than high level abstraction.
This commit is contained in:
parent
6e4033abba
commit
f9fe869b76
19
src/lua.rs
19
src/lua.rs
|
@ -2400,19 +2400,22 @@ impl Lua {
|
|||
Function(self.pop_ref())
|
||||
};
|
||||
|
||||
unsafe extern "C" fn unpack(state: *mut ffi::lua_State) -> c_int {
|
||||
let len = ffi::lua_tointeger(state, 2);
|
||||
for i in 1..=len {
|
||||
ffi::lua_rawgeti(state, 1, i);
|
||||
}
|
||||
len as c_int
|
||||
}
|
||||
|
||||
let coroutine = self.globals().get::<_, Table>("coroutine")?;
|
||||
|
||||
let env = self.create_table_with_capacity(0, 4)?;
|
||||
env.set("get_poll", get_poll)?;
|
||||
env.set("yield", coroutine.get::<_, Function>("yield")?)?;
|
||||
env.set(
|
||||
"unpack",
|
||||
self.create_function(|lua, (tbl, len): (Table, Integer)| {
|
||||
let mut values = MultiValue::new_or_cached(lua);
|
||||
values.refill(tbl.raw_sequence_values_by_len(Some(len)))?;
|
||||
Ok(values)
|
||||
})?,
|
||||
)?;
|
||||
unsafe {
|
||||
env.set("unpack", self.create_c_function(unpack)?)?;
|
||||
}
|
||||
env.set("pending", {
|
||||
LightUserData(&ASYNC_POLL_PENDING as *const u8 as *mut c_void)
|
||||
})?;
|
||||
|
|
|
@ -455,7 +455,7 @@ impl<'lua> Table<'lua> {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "async", feature = "serialize"))]
|
||||
#[cfg(any(feature = "serialize"))]
|
||||
pub(crate) fn raw_sequence_values_by_len<V: FromLua<'lua>>(
|
||||
self,
|
||||
len: Option<Integer>,
|
||||
|
|
Loading…
Reference in a new issue