Catch errors in love.font.newRasterizer, add luax_pconvobj which pcalls, allowing love.graphics.newFont to clean up before re-erroring

This commit is contained in:
Bart van Strien
2012-12-15 14:26:46 +01:00
parent 82ea98aa65
commit 68a895e7c6
4 changed files with 50 additions and 10 deletions
+24
View File
@@ -343,6 +343,30 @@ int luax_convobj(lua_State *L, int idxs[], int n, const char *mod, const char *f
return 0; return 0;
} }
int luax_pconvobj(lua_State *L, int idx, const char *mod, const char *fn)
{
// Convert string to a file.
luax_getfunction(L, mod, fn);
lua_pushvalue(L, idx); // The initial argument.
int ret = lua_pcall(L, 1, 1, 0); // Call the function, one arg, one return value.
if (ret == 0)
lua_replace(L, idx); // Replace the initial argument with the new object.
return ret;
}
int luax_pconvobj(lua_State *L, int idxs[], int n, const char *mod, const char *fn)
{
luax_getfunction(L, mod, fn);
for (int i = 0; i < n; i++)
{
lua_pushvalue(L, idxs[i]); // The arguments.
}
int ret = lua_pcall(L, n, 1, 0); // Call the function, n args, one return value.
if (ret == 0)
lua_replace(L, idxs[0]); // Replace the initial argument with the new object.
return ret;
}
int luax_strtofile(lua_State *L, int idx) int luax_strtofile(lua_State *L, int idx)
{ {
return luax_convobj(L, idx, "filesystem", "newFile"); return luax_convobj(L, idx, "filesystem", "newFile");
+4
View File
@@ -267,6 +267,10 @@ int luax_convobj(lua_State *L, int idx, const char *module, const char *function
**/ **/
int luax_convobj(lua_State *L, int idxs[], int n, const char *module, const char *function); int luax_convobj(lua_State *L, int idxs[], int n, const char *module, const char *function);
// pcall versions of the above
int luax_pconvobj(lua_State *L, int idx, const char *module, const char *function);
int luax_pconvobj(lua_State *L, int idxs[], int n, const char *module, const char *function);
/** /**
* 'Insist' that a table 'k' exists in the table at idx. Insistence involves that the * 'Insist' that a table 'k' exists in the table at idx. Insistence involves that the
* table (k) is created if it does not exist in the table at idx. The table at idx must * table (k) is created if it does not exist in the table at idx. The table at idx must
+16 -9
View File
@@ -39,18 +39,25 @@ static Font *instance = 0;
int w_newRasterizer(lua_State *L) int w_newRasterizer(lua_State *L)
{ {
Rasterizer *t = NULL; Rasterizer *t = NULL;
if (luax_istype(L, 1, IMAGE_IMAGE_DATA_T)) try
{ {
love::image::ImageData *d = luax_checktype<love::image::ImageData>(L, 1, "ImageData", IMAGE_IMAGE_DATA_T); if (luax_istype(L, 1, IMAGE_IMAGE_DATA_T))
const char *g = luaL_checkstring(L, 2); {
std::string glyphs(g); love::image::ImageData *d = luax_checktype<love::image::ImageData>(L, 1, "ImageData", IMAGE_IMAGE_DATA_T);
t = instance->newRasterizer(d, glyphs); const char *g = luaL_checkstring(L, 2);
std::string glyphs(g);
t = instance->newRasterizer(d, glyphs);
}
else if (luax_istype(L, 1, DATA_T))
{
Data *d = luax_checkdata(L, 1);
int size = luaL_checkint(L, 2);
t = instance->newRasterizer(d, size);
}
} }
else if (luax_istype(L, 1, DATA_T)) catch (love::Exception &e)
{ {
Data *d = luax_checkdata(L, 1); return luaL_error(L, "%s", e.what());
int size = luaL_checkint(L, 2);
t = instance->newRasterizer(d, size);
} }
luax_newtype(L, "Rasterizer", FONT_RASTERIZER_T, t); luax_newtype(L, "Rasterizer", FONT_RASTERIZER_T, t);
@@ -277,7 +277,12 @@ int w_newFont(lua_State *L)
if (luax_istype(L, 1, DATA_T)) if (luax_istype(L, 1, DATA_T))
{ {
int idxs[] = {1, 2}; int idxs[] = {1, 2};
luax_convobj(L, idxs, 2, "font", "newRasterizer"); int ret = luax_pconvobj(L, idxs, 2, "font", "newRasterizer");
if (ret != 0)
{
font_data->release();
return lua_error(L);
}
} }
if (font_data) if (font_data)