mirror of
https://github.com/love2d/love.git
synced 2026-08-17 19:23:38 +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;
|
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;
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user