From f3d83a4516eb9c6658a7c3e07bf1b7d4f4996bef Mon Sep 17 00:00:00 2001
From: ShadowNinja <shadowninja@minetest.net>
Date: Sat, 15 Mar 2014 17:20:52 -0400
Subject: [PATCH] Add more informative error messages for inventory and item
 method errors

---
 src/script/cpp_api/s_inventory.cpp |  6 ++--
 src/script/cpp_api/s_item.cpp      | 45 +++++++++++++++++++++++-------
 2 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/src/script/cpp_api/s_inventory.cpp b/src/script/cpp_api/s_inventory.cpp
index 835c0818f..dd7e26510 100644
--- a/src/script/cpp_api/s_inventory.cpp
+++ b/src/script/cpp_api/s_inventory.cpp
@@ -54,7 +54,7 @@ int ScriptApiDetached::detached_inventory_AllowMove(
 	if(lua_pcall(L, 7, 1, errorhandler))
 		scriptError();
 	if(!lua_isnumber(L, -1))
-		throw LuaError("allow_move should return a number");
+		throw LuaError("allow_move should return a number. name=" + name);
 	int ret = luaL_checkinteger(L, -1);
 	lua_pop(L, 2); // Pop integer and error handler
 	return ret;
@@ -86,7 +86,7 @@ int ScriptApiDetached::detached_inventory_AllowPut(
 	if(lua_pcall(L, 5, 1, errorhandler))
 		scriptError();
 	if(!lua_isnumber(L, -1))
-		throw LuaError("allow_put should return a number");
+		throw LuaError("allow_put should return a number. name=" + name);
 	int ret = luaL_checkinteger(L, -1);
 	lua_pop(L, 2); // Pop integer and error handler
 	return ret;
@@ -118,7 +118,7 @@ int ScriptApiDetached::detached_inventory_AllowTake(
 	if(lua_pcall(L, 5, 1, errorhandler))
 		scriptError();
 	if(!lua_isnumber(L, -1))
-		throw LuaError("allow_take should return a number");
+		throw LuaError("allow_take should return a number. name=" + name);
 	int ret = luaL_checkinteger(L, -1);
 	lua_pop(L, 2); // Pop integer and error handler
 	return ret;
diff --git a/src/script/cpp_api/s_item.cpp b/src/script/cpp_api/s_item.cpp
index 49729e57b..41413d61c 100644
--- a/src/script/cpp_api/s_item.cpp
+++ b/src/script/cpp_api/s_item.cpp
@@ -47,8 +47,13 @@ bool ScriptApiItem::item_OnDrop(ItemStack &item,
 	pushFloatPos(L, pos);
 	if(lua_pcall(L, 3, 1, errorhandler))
 		scriptError();
-	if(!lua_isnil(L, -1))
-		item = read_item(L,-1, getServer());
+	if(!lua_isnil(L, -1)) {
+		try {
+			item = read_item(L,-1, getServer());
+		} catch (LuaError &e) {
+			throw LuaError(std::string(e.what()) + ". item=" + item.name);
+		}
+	}
 	lua_pop(L, 2);  // Pop item and error handler
 	return true;
 }
@@ -71,8 +76,13 @@ bool ScriptApiItem::item_OnPlace(ItemStack &item,
 	pushPointedThing(pointed);
 	if(lua_pcall(L, 3, 1, errorhandler))
 		scriptError();
-	if(!lua_isnil(L, -1))
-		item = read_item(L,-1, getServer());
+	if(!lua_isnil(L, -1)) {
+		try {
+			item = read_item(L,-1, getServer());
+		} catch (LuaError &e) {
+			throw LuaError(std::string(e.what()) + ". item=" + item.name);
+		}
+	}
 	lua_pop(L, 2);  // Pop item and error handler
 	return true;
 }
@@ -95,8 +105,13 @@ bool ScriptApiItem::item_OnUse(ItemStack &item,
 	pushPointedThing(pointed);
 	if(lua_pcall(L, 3, 1, errorhandler))
 		scriptError();
-	if(!lua_isnil(L, -1))
-		item = read_item(L,-1, getServer());
+	if(!lua_isnil(L, -1)) {
+		try {
+			item = read_item(L,-1, getServer());
+		} catch (LuaError &e) {
+			throw LuaError(std::string(e.what()) + ". item=" + item.name);
+		}
+	}
 	lua_pop(L, 2);  // Pop item and error handler
 	return true;
 }
@@ -123,8 +138,13 @@ bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user,
 	InvRef::create(L, craft_inv);
 	if(lua_pcall(L, 4, 1, errorhandler))
 		scriptError();
-	if(!lua_isnil(L, -1))
-		item = read_item(L,-1, getServer());
+	if(!lua_isnil(L, -1)) {
+		try {
+			item = read_item(L,-1, getServer());
+		} catch (LuaError &e) {
+			throw LuaError(std::string(e.what()) + ". item=" + item.name);
+		}
+	}
 	lua_pop(L, 2);  // Pop item and error handler
 	return true;
 }
@@ -151,8 +171,13 @@ bool ScriptApiItem::item_CraftPredict(ItemStack &item, ServerActiveObject *user,
 	InvRef::create(L, craft_inv);
 	if(lua_pcall(L, 4, 1, errorhandler))
 		scriptError();
-	if(!lua_isnil(L, -1))
-		item = read_item(L,-1, getServer());
+	if(!lua_isnil(L, -1)) {
+		try {
+			item = read_item(L,-1, getServer());
+		} catch (LuaError &e) {
+			throw LuaError(std::string(e.what()) + ". item=" + item.name);
+		}
+	}
 	lua_pop(L, 2);  // Pop item and error handler
 	return true;
 }
-- 
2.25.1