summaryrefslogtreecommitdiff
path: root/src/script/lua_api/l_craft.cpp
diff options
context:
space:
mode:
authorShadowNinja <shadowninja@minetest.net>2013-11-30 12:11:07 -0500
committerShadowNinja <shadowninja@minetest.net>2013-11-30 13:05:13 -0500
commit4594ba652293e776ccba2184c16502a346f4147a (patch)
tree19713fac8de559ba86cd9d08d9c07cb1c7241e37 /src/script/lua_api/l_craft.cpp
parent06baf05c641355ead97e9428c4455af9e8b11cef (diff)
downloadminetest-4594ba652293e776ccba2184c16502a346f4147a.tar.gz
minetest-4594ba652293e776ccba2184c16502a346f4147a.tar.bz2
minetest-4594ba652293e776ccba2184c16502a346f4147a.zip
Optimize table creation
Diffstat (limited to 'src/script/lua_api/l_craft.cpp')
-rw-r--r--src/script/lua_api/l_craft.cpp59
1 files changed, 22 insertions, 37 deletions
diff --git a/src/script/lua_api/l_craft.cpp b/src/script/lua_api/l_craft.cpp
index c5732bad2..035abb78d 100644
--- a/src/script/lua_api/l_craft.cpp
+++ b/src/script/lua_api/l_craft.cpp
@@ -389,67 +389,52 @@ int ModApiCraft::l_get_all_craft_recipes(lua_State *L)
ICraftDefManager *cdef = gdef->cdef();
CraftInput input;
CraftOutput output(o_item,0);
- std::vector<CraftDefinition*> recipes_list = cdef->getCraftRecipes(output, gdef);
- if (recipes_list.empty())
- {
+ std::vector<CraftDefinition*> recipes_list;
+ recipes_list = cdef->getCraftRecipes(output, gdef);
+ if (recipes_list.empty()) {
lua_pushnil(L);
return 1;
}
- // Get the table insert function
- lua_getglobal(L, "table");
- lua_getfield(L, -1, "insert");
- int table_insert = lua_gettop(L);
- lua_newtable(L);
- int table = lua_gettop(L);
- for (std::vector<CraftDefinition*>::const_iterator
- i = recipes_list.begin();
- i != recipes_list.end(); i++)
- {
+
+ lua_createtable(L, recipes_list.size(), 0);
+ std::vector<CraftDefinition*>::const_iterator iter = recipes_list.begin();
+ for (u16 i = 0; iter != recipes_list.end(); iter++) {
CraftOutput tmpout;
tmpout.item = "";
tmpout.time = 0;
- CraftDefinition *def = *i;
- tmpout = def->getOutput(input, gdef);
+ tmpout = (*iter)->getOutput(input, gdef);
std::string query = tmpout.item;
char *fmtpos, *fmt = &query[0];
- if (strtok_r(fmt, " ", &fmtpos) == output.item)
- {
- input = def->getInput(output, gdef);
- lua_pushvalue(L, table_insert);
- lua_pushvalue(L, table);
+ if (strtok_r(fmt, " ", &fmtpos) == output.item) {
+ input = (*iter)->getInput(output, gdef);
lua_newtable(L);
- int k = 1;
- lua_newtable(L);
- for(std::vector<ItemStack>::const_iterator
- i = input.items.begin();
- i != input.items.end(); i++, k++)
- {
- if (i->empty())
+ lua_newtable(L); // items
+ std::vector<ItemStack>::const_iterator iter = input.items.begin();
+ for (u16 j = 0; iter != input.items.end(); iter++) {
+ if (iter->empty())
continue;
- lua_pushinteger(L,k);
- lua_pushstring(L,i->name.c_str());
- lua_settable(L, -3);
+ lua_pushstring(L, iter->name.c_str());
+ lua_rawseti(L, -2, ++j);
}
lua_setfield(L, -2, "items");
setintfield(L, -1, "width", input.width);
switch (input.method) {
case CRAFT_METHOD_NORMAL:
- lua_pushstring(L,"normal");
+ lua_pushstring(L, "normal");
break;
case CRAFT_METHOD_COOKING:
- lua_pushstring(L,"cooking");
+ lua_pushstring(L, "cooking");
break;
case CRAFT_METHOD_FUEL:
- lua_pushstring(L,"fuel");
+ lua_pushstring(L, "fuel");
break;
default:
- lua_pushstring(L,"unknown");
- }
+ lua_pushstring(L, "unknown");
+ }
lua_setfield(L, -2, "type");
lua_pushstring(L, &tmpout.item[0]);
lua_setfield(L, -2, "output");
- if (lua_pcall(L, 2, 0, 0))
- script_error(L);
+ lua_rawseti(L, -2, ++i);
}
}
return 1;