mirror of
https://github.com/love2d/love.git
synced 2026-08-15 15:51:12 +02:00
Fixed thread:start crashing with nil arguments
This commit is contained in:
+17
-7
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user