Improve performance of create_table / create_array_table

This commit is contained in:
kyren 2017-06-05 01:46:45 -04:00
parent 9aed99e3e3
commit 1c0b1014ee
3 changed files with 21 additions and 12 deletions

View file

@ -1,6 +1,6 @@
[package]
name = "rlua"
version = "0.4.5"
version = "0.4.6"
authors = ["kyren <catherine@chucklefish.org>"]
description = "High level bindings to Lua 5.3"
repository = "https://github.com/chucklefish/rlua"

View file

@ -822,24 +822,26 @@ impl Lua {
V: ToLua<'lua>,
I: IntoIterator<Item = (K, V)>
{
let table = self.create_empty_table()?;
for (k, v) in cont {
table.set(k, v)?;
unsafe {
stack_guard(self.state, 0, || {
check_stack(self.state, 3)?;
ffi::lua_newtable(self.state);
for (k, v) in cont.into_iter() {
self.push_value(self.state, k.to_lua(self)?)?;
self.push_value(self.state, v.to_lua(self)?)?;
ffi::lua_rawset(self.state, -3);
}
Ok(LuaTable(self.pop_ref(self.state)))
})
}
Ok(table)
}
pub fn create_array_table<'lua, T, I>(&'lua self, cont: I) -> LuaResult<LuaTable>
where T: ToLua<'lua>,
I: IntoIterator<Item = T>
{
let table = self.create_empty_table()?;
let mut index = 1;
for elem in cont {
table.set(index, elem)?;
index += 1;
}
Ok(table)
self.create_table(cont.into_iter().enumerate().map(|(k, v)| (k + 1, v)))
}
pub fn create_function<F>(&self, func: F) -> LuaResult<LuaFunction>

View file

@ -77,6 +77,13 @@ fn test_table() {
assert_eq!(table3.length().unwrap(), 5);
assert_eq!(table3.array_values::<Option<i64>>().unwrap(),
vec![Some(1), Some(2), None, Some(4), Some(5)]);
lua.set("table4",
lua.create_array_table(vec![1, 2, 3, 4, 5]).unwrap())
.unwrap();
let table4 = lua.get::<_, LuaTable>("table4").unwrap();
assert_eq!(table4.pairs::<i64, i64>().unwrap(),
vec![(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]);
}
#[test]