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; return t;
} }
Variant::Variant(bool boolean) Variant::Variant()
: type(NIL)
, data()
{
}
Variant::Variant(bool boolean)
: type(BOOLEAN)
{ {
type = BOOLEAN;
data.boolean = boolean; data.boolean = boolean;
} }
Variant::Variant(double number) Variant::Variant(double number)
: type(NUMBER)
{ {
type = NUMBER;
data.number = number; data.number = number;
} }
Variant::Variant(const char *string, size_t len) Variant::Variant(const char *string, size_t len)
: type(STRING)
{ {
type = STRING;
char *buf = new char[len+1]; char *buf = new char[len+1];
memset(buf, 0, len+1); memset(buf, 0, len+1);
memcpy(buf, string, len); memcpy(buf, string, len);
@@ -65,20 +71,20 @@ Variant::Variant(const char *string, size_t len)
} }
Variant::Variant(char c) Variant::Variant(char c)
: type(CHARACTER)
{ {
type = CHARACTER;
data.character = c; data.character = c;
} }
Variant::Variant(void *userdata) Variant::Variant(void *userdata)
: type(LUSERDATA)
{ {
type = LUSERDATA;
data.userdata = userdata; data.userdata = userdata;
} }
Variant::Variant(love::Type udatatype, void *userdata) Variant::Variant(love::Type udatatype, void *userdata)
: type(FUSERDATA)
{ {
type = FUSERDATA;
this->udatatype = udatatype; this->udatatype = udatatype;
if (udatatype != INVALID_ID) if (udatatype != INVALID_ID)
{ {
@@ -129,6 +135,9 @@ Variant *Variant::fromLua(lua_State *L, int n)
case LUA_TUSERDATA: case LUA_TUSERDATA:
v = new Variant(extractudatatype(L, n), lua_touserdata(L, n)); v = new Variant(extractudatatype(L, n), lua_touserdata(L, n));
break; break;
case LUA_TNIL:
v = new Variant();
break;
} }
return v; return v;
} }
@@ -166,6 +175,7 @@ void Variant::toLua(lua_State *L)
// sadly, however, it's the most // sadly, however, it's the most
// I can do (at the moment). // I can do (at the moment).
break; break;
case NIL:
default: default:
lua_pushnil(L); lua_pushnil(L);
break; break;
+3 -1
View File
@@ -33,6 +33,7 @@ class Variant : public love::Object
{ {
public: public:
Variant();
Variant(bool boolean); Variant(bool boolean);
Variant(double number); Variant(double number);
Variant(const char *string, size_t len); Variant(const char *string, size_t len);
@@ -53,7 +54,8 @@ private:
CHARACTER, CHARACTER,
STRING, STRING,
LUSERDATA, LUSERDATA,
FUSERDATA FUSERDATA,
NIL
} type; } type;
union union
{ {
+4 -4
View File
@@ -46,9 +46,9 @@ Channel *luax_checkchannel(lua_State *L, int idx)
int w_Channel_push(lua_State *L) int w_Channel_push(lua_State *L)
{ {
Channel *c = luax_checkchannel(L, 1); 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) 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); c->push(var);
releaseVariant(c, var); releaseVariant(c, var);
return 0; return 0;
@@ -57,9 +57,9 @@ int w_Channel_push(lua_State *L)
int w_Channel_supply(lua_State *L) int w_Channel_supply(lua_State *L)
{ {
Channel *c = luax_checkchannel(L, 1); 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) 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); c->supply(var);
releaseVariant(c, var); releaseVariant(c, var);
return 0; return 0;