Fixed thread:start crashing with nil arguments

This commit is contained in:
Alex Szpakowski
2013-07-10 17:41:54 -03:00
parent 454ba9d968
commit 35b4f03411
3 changed files with 24 additions and 12 deletions
+17 -7
View File
@@ -42,21 +42,27 @@ love::Type extractudatatype(lua_State *L, int idx)
return t;
}
Variant::Variant(bool boolean)
Variant::Variant()
: type(NIL)
, data()
{
}
Variant::Variant(bool boolean)
: type(BOOLEAN)
{
type = BOOLEAN;
data.boolean = boolean;
}
Variant::Variant(double number)
: type(NUMBER)
{
type = NUMBER;
data.number = number;
}
Variant::Variant(const char *string, size_t len)
: type(STRING)
{
type = STRING;
char *buf = new char[len+1];
memset(buf, 0, len+1);
memcpy(buf, string, len);
@@ -65,20 +71,20 @@ Variant::Variant(const char *string, size_t len)
}
Variant::Variant(char c)
: type(CHARACTER)
{
type = CHARACTER;
data.character = c;
}
Variant::Variant(void *userdata)
: type(LUSERDATA)
{
type = LUSERDATA;
data.userdata = userdata;
}
Variant::Variant(love::Type udatatype, void *userdata)
: type(FUSERDATA)
{
type = FUSERDATA;
this->udatatype = udatatype;
if (udatatype != INVALID_ID)
{
@@ -129,6 +135,9 @@ Variant *Variant::fromLua(lua_State *L, int n)
case LUA_TUSERDATA:
v = new Variant(extractudatatype(L, n), lua_touserdata(L, n));
break;
case LUA_TNIL:
v = new Variant();
break;
}
return v;
}
@@ -166,6 +175,7 @@ void Variant::toLua(lua_State *L)
// sadly, however, it's the most
// I can do (at the moment).
break;
case NIL:
default:
lua_pushnil(L);
break;
+3 -1
View File
@@ -33,6 +33,7 @@ class Variant : public love::Object
{
public:
Variant();
Variant(bool boolean);
Variant(double number);
Variant(const char *string, size_t len);
@@ -53,7 +54,8 @@ private:
CHARACTER,
STRING,
LUSERDATA,
FUSERDATA
FUSERDATA,
NIL
} type;
union
{
+4 -4
View File
@@ -46,9 +46,9 @@ Channel *luax_checkchannel(lua_State *L, int idx)
int w_Channel_push(lua_State *L)
{
Channel *c = luax_checkchannel(L, 1);
Variant *var = Variant::fromLua(L, 2);
Variant *var = lua_isnoneornil(L, 2) ? 0 : Variant::fromLua(L, 2);
if (!var)
return luaL_argerror(L, 2, "boolean, number, string, or love userdata expected");
return luaL_argerror(L, 2, "boolean, number, string, or love type expected");
c->push(var);
releaseVariant(c, var);
return 0;
@@ -57,9 +57,9 @@ int w_Channel_push(lua_State *L)
int w_Channel_supply(lua_State *L)
{
Channel *c = luax_checkchannel(L, 1);
Variant *var = Variant::fromLua(L, 2);
Variant *var = lua_isnoneornil(L, 2) ? 0 : Variant::fromLua(L, 2);
if (!var)
return luaL_argerror(L, 2, "boolean, number, string, or love userdata expected");
return luaL_argerror(L, 2, "boolean, number, string, or love type expected");
c->supply(var);
releaseVariant(c, var);
return 0;