diff --git a/src/common/Variant.cpp b/src/common/Variant.cpp index 15e55d59d..ee0a2ba5c 100644 --- a/src/common/Variant.cpp +++ b/src/common/Variant.cpp @@ -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; diff --git a/src/common/Variant.h b/src/common/Variant.h index 3bc792852..8f5dfa4e7 100644 --- a/src/common/Variant.h +++ b/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 { diff --git a/src/modules/thread/wrap_Channel.cpp b/src/modules/thread/wrap_Channel.cpp index 9cf5f6f8f..e55318c18 100644 --- a/src/modules/thread/wrap_Channel.cpp +++ b/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;