From c2cdaceed0d43317d8e8d431052854fe72d8fddf Mon Sep 17 00:00:00 2001
From: Kahrl <kahrl@gmx.net>
Date: Fri, 21 Jun 2013 00:04:18 +0200
Subject: [PATCH] Make minetest.debug accept multiple parameters; convert them
 to string

---
 src/script/lua_api/luaapi.cpp | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/script/lua_api/luaapi.cpp b/src/script/lua_api/luaapi.cpp
index 667a3afcf..e19c90952 100644
--- a/src/script/lua_api/luaapi.cpp
+++ b/src/script/lua_api/luaapi.cpp
@@ -105,13 +105,31 @@ bool ModApiBasic::Initialize(lua_State* L,int top) {
 	return retval;
 }
 
-// debug(text)
+// debug(...)
 // Writes a line to dstream
 int ModApiBasic::l_debug(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
-	std::string text = lua_tostring(L, 1);
-	dstream << text << std::endl;
+	// Handle multiple parameters to behave like standard lua print()
+	int n = lua_gettop(L);
+	lua_getglobal(L, "tostring");
+	for(int i = 1; i <= n; i++){
+		/*
+			Call tostring(i-th argument).
+			This is what print() does, and it behaves a bit
+			differently from directly calling lua_tostring.
+		*/
+		lua_pushvalue(L, -1);  /* function to be called */
+		lua_pushvalue(L, i);   /* value to print */
+		lua_call(L, 1, 1);
+		const char *s = lua_tostring(L, -1);
+		if(i>1)
+			dstream << "\t";
+		if(s)
+			dstream << s;
+		lua_pop(L, 1);
+	}
+	dstream << std::endl;
 	return 0;
 }
 
-- 
GitLab