summaryrefslogtreecommitdiff
path: root/src/lua.rs
diff options
context:
space:
mode:
authorAlex Orlenko <zxteam@protonmail.com>2022-01-29 12:39:30 +0000
committerAlex Orlenko <zxteam@protonmail.com>2022-01-29 12:39:30 +0000
commitf9fe869b76da2f71f88655f4b9d44871f6a28ed2 (patch)
tree16f4d7f650db3f4c52b6d8444e559c8edebec38e /src/lua.rs
parent6e4033abba37b7a9bbeb1c58daafb9649cc93c8c (diff)
downloadmlua-f9fe869b76da2f71f88655f4b9d44871f6a28ed2.zip
Optimize async calls:
Rewrite "unpack" function using C api rather than high level abstraction.
Diffstat (limited to 'src/lua.rs')
-rw-r--r--src/lua.rs19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/lua.rs b/src/lua.rs
index 9e95b25..dd8b448 100644
--- a/src/lua.rs
+++ b/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)
})?;