Optimize async calls:

Rewrite "unpack" function using C api rather than high level abstraction.
This commit is contained in:
Alex Orlenko 2022-01-29 12:39:30 +00:00
parent 6e4033abba
commit f9fe869b76
No known key found for this signature in database
GPG key ID: 4C150C250863B96D
2 changed files with 12 additions and 9 deletions

View file

@ -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)
})?;

View file

@ -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>,