Browse Source

love get* APIs which return tables with fields can optionally accept a table argument to fill in, instead of creating a new table.

--HG--
branch : minor
Alex Szpakowski 8 years ago
parent
commit
4ee85e1793

+ 4 - 1
src/modules/audio/wrap_Audio.cpp

@@ -443,7 +443,10 @@ int w_getEffect(lua_State *L)
 	const char *keystr, *valstr;
 	const char *keystr, *valstr;
 	Effect::Type type = static_cast<Effect::Type>((int)params[Effect::EFFECT_TYPE]);
 	Effect::Type type = static_cast<Effect::Type>((int)params[Effect::EFFECT_TYPE]);
 
 
-	lua_createtable(L, 0, params.size());
+	if (lua_istable(L, 2))
+		lua_pushvalue(L, 2);
+	else
+		lua_createtable(L, 0, params.size());
 
 
 	for (auto p : params)
 	for (auto p : params)
 	{
 	{

+ 7 - 4
src/modules/audio/wrap_Source.cpp

@@ -400,12 +400,15 @@ int setFilterReadFilter(lua_State *L, int idx, std::map<Filter::Parameter, float
 	return 1;
 	return 1;
 }
 }
 
 
-void getFilterWriteFilter(lua_State *L, std::map<Filter::Parameter, float> &params)
+void getFilterWriteFilter(lua_State *L, int idx, std::map<Filter::Parameter, float> &params)
 {
 {
 	const char *keystr, *valstr;
 	const char *keystr, *valstr;
 	Filter::Type type = static_cast<Filter::Type>((int)params[Filter::FILTER_TYPE]);
 	Filter::Type type = static_cast<Filter::Type>((int)params[Filter::FILTER_TYPE]);
 
 
-	lua_createtable(L, 0, params.size());
+	if (lua_istable(L, idx))
+		lua_pushvalue(L, idx);
+	else
+		lua_createtable(L, 0, params.size());
 
 
 	for (auto p : params)
 	for (auto p : params)
 	{
 	{
@@ -452,7 +455,7 @@ int w_Source_getFilter(lua_State *L)
 	if (!t->getFilter(params))
 	if (!t->getFilter(params))
 		return 0;
 		return 0;
 
 
-	getFilterWriteFilter(L, params);
+	getFilterWriteFilter(L, 2, params);
 	return 1;
 	return 1;
 }
 }
 
 
@@ -489,7 +492,7 @@ int w_Source_getEffect(lua_State *L)
 	if (params.size() == 0)
 	if (params.size() == 0)
 		return 0;
 		return 0;
 
 
-	getFilterWriteFilter(L, params);
+	getFilterWriteFilter(L, 3, params);
 	return 1;
 	return 1;
 }
 }
 
 

+ 4 - 1
src/modules/filesystem/wrap_Filesystem.cpp

@@ -371,7 +371,10 @@ int w_getInfo(lua_State *L)
 		if (!Filesystem::getConstant(info.type, typestr))
 		if (!Filesystem::getConstant(info.type, typestr))
 			return luaL_error(L, "Unknown file type.");
 			return luaL_error(L, "Unknown file type.");
 
 
-		lua_createtable(L, 0, 3);
+		if (lua_istable(L, 2))
+			lua_pushvalue(L, 2);
+		else
+			lua_createtable(L, 0, 3);
 
 
 		lua_pushstring(L, typestr);
 		lua_pushstring(L, typestr);
 		lua_setfield(L, -2, "type");
 		lua_setfield(L, -2, "type");

+ 29 - 9
src/modules/graphics/wrap_Graphics.cpp

@@ -1992,7 +1992,11 @@ int w_setDefaultShaderCode(lua_State *L)
 int w_getSupported(lua_State *L)
 int w_getSupported(lua_State *L)
 {
 {
 	const Graphics::Capabilities &caps = instance()->getCapabilities();
 	const Graphics::Capabilities &caps = instance()->getCapabilities();
-	lua_createtable(L, 0, (int) Graphics::FEATURE_MAX_ENUM);
+
+	if (lua_istable(L, 1))
+		lua_pushvalue(L, 1);
+	else
+		lua_createtable(L, 0, (int) Graphics::FEATURE_MAX_ENUM);
 
 
 	for (int i = 0; i < (int) Graphics::FEATURE_MAX_ENUM; i++)
 	for (int i = 0; i < (int) Graphics::FEATURE_MAX_ENUM; i++)
 	{
 	{
@@ -2009,9 +2013,12 @@ int w_getSupported(lua_State *L)
 	return 1;
 	return 1;
 }
 }
 
 
-static int w__getFormats(lua_State *L, bool (*isFormatSupported)(PixelFormat), bool (*ignore)(PixelFormat))
+static int w__getFormats(lua_State *L, int idx, bool (*isFormatSupported)(PixelFormat), bool (*ignore)(PixelFormat))
 {
 {
-	lua_createtable(L, 0, (int) PIXELFORMAT_MAX_ENUM);
+	if (lua_istable(L, idx))
+		lua_pushvalue(L, idx);
+	else
+		lua_createtable(L, 0, (int) PIXELFORMAT_MAX_ENUM);
 
 
 	for (int i = 0; i < (int) PIXELFORMAT_MAX_ENUM; i++)
 	for (int i = 0; i < (int) PIXELFORMAT_MAX_ENUM; i++)
 	{
 	{
@@ -2032,8 +2039,10 @@ int w_getCanvasFormats(lua_State *L)
 {
 {
 	bool (*supported)(PixelFormat);
 	bool (*supported)(PixelFormat);
 
 
-	if (!lua_isnoneornil(L, 1))
+	int idx = 1;
+	if (lua_type(L, 1) == LUA_TBOOLEAN)
 	{
 	{
+		idx = 2;
 		if (luax_checkboolean(L, 1))
 		if (luax_checkboolean(L, 1))
 		{
 		{
 			supported = [](PixelFormat format) -> bool
 			supported = [](PixelFormat format) -> bool
@@ -2057,7 +2066,7 @@ int w_getCanvasFormats(lua_State *L)
 		};
 		};
 	}
 	}
 
 
-	return w__getFormats(L, supported, isPixelFormatCompressed);
+	return w__getFormats(L, idx, supported, isPixelFormatCompressed);
 }
 }
 
 
 int w_getImageFormats(lua_State *L)
 int w_getImageFormats(lua_State *L)
@@ -2072,13 +2081,17 @@ int w_getImageFormats(lua_State *L)
 		return !(image::ImageData::validPixelFormat(format) || isPixelFormatCompressed(format));
 		return !(image::ImageData::validPixelFormat(format) || isPixelFormatCompressed(format));
 	};
 	};
 
 
-	return w__getFormats(L, supported, ignore);
+	return w__getFormats(L, 1, supported, ignore);
 }
 }
 
 
 int w_getTextureTypes(lua_State *L)
 int w_getTextureTypes(lua_State *L)
 {
 {
 	const Graphics::Capabilities &caps = instance()->getCapabilities();
 	const Graphics::Capabilities &caps = instance()->getCapabilities();
-	lua_createtable(L, 0, (int) TEXTURE_MAX_ENUM);
+
+	if (lua_istable(L, 1))
+		lua_pushvalue(L, 1);
+	else
+		lua_createtable(L, 0, (int) TEXTURE_MAX_ENUM);
 
 
 	for (int i = 0; i < (int) TEXTURE_MAX_ENUM; i++)
 	for (int i = 0; i < (int) TEXTURE_MAX_ENUM; i++)
 	{
 	{
@@ -2110,7 +2123,11 @@ int w_getRendererInfo(lua_State *L)
 int w_getSystemLimits(lua_State *L)
 int w_getSystemLimits(lua_State *L)
 {
 {
 	const Graphics::Capabilities &caps = instance()->getCapabilities();
 	const Graphics::Capabilities &caps = instance()->getCapabilities();
-	lua_createtable(L, 0, (int) Graphics::LIMIT_MAX_ENUM);
+
+	if (lua_istable(L, 1))
+		lua_pushvalue(L, 1);
+	else
+		lua_createtable(L, 0, (int) Graphics::LIMIT_MAX_ENUM);
 
 
 	for (int i = 0; i < (int) Graphics::LIMIT_MAX_ENUM; i++)
 	for (int i = 0; i < (int) Graphics::LIMIT_MAX_ENUM; i++)
 	{
 	{
@@ -2131,7 +2148,10 @@ int w_getStats(lua_State *L)
 {
 {
 	Graphics::Stats stats = instance()->getStats();
 	Graphics::Stats stats = instance()->getStats();
 
 
-	lua_createtable(L, 0, 7);
+	if (lua_istable(L, 1))
+		lua_pushvalue(L, 1);
+	else
+		lua_createtable(L, 0, 7);
 
 
 	lua_pushinteger(L, stats.drawCalls);
 	lua_pushinteger(L, stats.drawCalls);
 	lua_setfield(L, -2, "drawcalls");
 	lua_setfield(L, -2, "drawcalls");

+ 4 - 1
src/modules/window/wrap_Window.cpp

@@ -171,7 +171,10 @@ int w_getMode(lua_State *L)
 	lua_pushnumber(L, w);
 	lua_pushnumber(L, w);
 	lua_pushnumber(L, h);
 	lua_pushnumber(L, h);
 
 
-	lua_newtable(L);
+	if (lua_istable(L, 1))
+		lua_pushvalue(L, 1);
+	else
+		lua_newtable(L);
 
 
 	const char *fstypestr = "desktop";
 	const char *fstypestr = "desktop";
 	Window::getConstant(settings.fstype, fstypestr);
 	Window::getConstant(settings.fstype, fstypestr);