Browse Source

Fixed thread:start crashing with nil arguments

Alex Szpakowski 12 years ago
parent
commit
35b4f03411
3 changed files with 23 additions and 11 deletions
  1. 16 6
      src/common/Variant.cpp
  2. 3 1
      src/common/Variant.h
  3. 4 4
      src/modules/thread/wrap_Channel.cpp

+ 16 - 6
src/common/Variant.cpp

@@ -42,21 +42,27 @@ love::Type extractudatatype(lua_State *L, int idx)
 	return t;
 }
 
+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
src/common/Variant.h

@@ -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
src/modules/thread/wrap_Channel.cpp

@@ -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;