Very minor channel / variant performance improvements and cleanup.

This commit is contained in:
Alex Szpakowski
2016-03-12 19:11:03 -04:00
parent a0bbcce8ee
commit d0c0240e09
6 changed files with 48 additions and 57 deletions
+21 -27
View File
@@ -160,7 +160,7 @@ Variant &Variant::operator = (const Variant &v)
return *this; return *this;
} }
bool Variant::fromLua(lua_State *L, int n, Variant *v, bool allowTables) Variant Variant::fromLua(lua_State *L, int n, bool allowTables)
{ {
size_t len; size_t len;
const char *str; const char *str;
@@ -171,30 +171,23 @@ bool Variant::fromLua(lua_State *L, int n, Variant *v, bool allowTables)
switch (lua_type(L, n)) switch (lua_type(L, n))
{ {
case LUA_TBOOLEAN: case LUA_TBOOLEAN:
*v = Variant(luax_toboolean(L, n)); return Variant(luax_toboolean(L, n));
return true;
case LUA_TNUMBER: case LUA_TNUMBER:
*v = Variant(lua_tonumber(L, n)); return Variant(lua_tonumber(L, n));
return true;
case LUA_TSTRING: case LUA_TSTRING:
str = lua_tolstring(L, n, &len); str = lua_tolstring(L, n, &len);
*v = Variant(str, len); return Variant(str, len);
return true;
case LUA_TLIGHTUSERDATA: case LUA_TLIGHTUSERDATA:
*v = Variant(lua_touserdata(L, n)); return Variant(lua_touserdata(L, n));
return true;
case LUA_TUSERDATA: case LUA_TUSERDATA:
*v = Variant(extractudatatype(L, n), lua_touserdata(L, n)); return Variant(extractudatatype(L, n), lua_touserdata(L, n));
return true;
case LUA_TNIL: case LUA_TNIL:
*v = Variant(); return Variant();
return true;
case LUA_TTABLE: case LUA_TTABLE:
if (allowTables) if (allowTables)
{ {
bool success = true; bool success = true;
std::vector<std::pair<Variant, Variant>> *table = new std::vector<std::pair<Variant, Variant>>(); std::vector<std::pair<Variant, Variant>> *table = new std::vector<std::pair<Variant, Variant>>();
std::pair<Variant, Variant> pair;
size_t len = luax_objlen(L, -1); size_t len = luax_objlen(L, -1);
if (len > 0) if (len > 0)
@@ -204,29 +197,28 @@ bool Variant::fromLua(lua_State *L, int n, Variant *v, bool allowTables)
while (lua_next(L, n)) while (lua_next(L, n))
{ {
if (!fromLua(L, -2, &pair.first, false) || !fromLua(L, -1, &pair.second, false)) table->emplace_back(fromLua(L, -2), fromLua(L, -1));
lua_pop(L, 1);
const auto &p = table->back();
if (p.first.getType() == UNKNOWN || p.second.getType() == UNKNOWN)
{ {
success = false; success = false;
lua_pop(L, 2);
break; break;
} }
table->push_back(pair);
lua_pop(L, 1);
} }
if (success) if (success)
{ return Variant(table);
*v = Variant(table);
return true;
}
else else
delete table; delete table;
} }
break; break;
} }
return false; Variant v;
v.type = UNKNOWN;
return v;
} }
void Variant::toLua(lua_State *L) const void Variant::toLua(lua_State *L) const
@@ -260,11 +252,13 @@ void Variant::toLua(lua_State *L) const
case TABLE: case TABLE:
{ {
std::vector<std::pair<Variant, Variant>> *table = data.table->table; std::vector<std::pair<Variant, Variant>> *table = data.table->table;
lua_createtable(L, 0, (int) table->size()); int tsize = (int) table->size();
for (size_t i = 0; i < table->size(); ++i) lua_createtable(L, 0, tsize);
for (int i = 0; i < tsize; ++i)
{ {
std::pair<Variant, Variant> &kv = table->at(i); std::pair<Variant, Variant> &kv = (*table)[i];
kv.first.toLua(L); kv.first.toLua(L);
kv.second.toLua(L); kv.second.toLua(L);
lua_settable(L, -3); lua_settable(L, -3);
+16 -14
View File
@@ -35,6 +35,19 @@ class Variant
{ {
public: public:
enum Type
{
UNKNOWN = 0,
BOOLEAN,
NUMBER,
STRING,
SMALLSTRING,
LUSERDATA,
FUSERDATA,
NIL,
TABLE
};
Variant(); Variant();
Variant(bool boolean); Variant(bool boolean);
Variant(double number); Variant(double number);
@@ -48,7 +61,9 @@ public:
Variant &operator = (const Variant &v); Variant &operator = (const Variant &v);
static bool fromLua(lua_State *L, int n, Variant *v, bool allowTables = true); Type getType() const { return type; }
static Variant fromLua(lua_State *L, int n, bool allowTables = true);
void toLua(lua_State *L) const; void toLua(lua_State *L) const;
private: private:
@@ -83,19 +98,6 @@ private:
std::vector<std::pair<Variant, Variant>> *table; std::vector<std::pair<Variant, Variant>> *table;
}; };
enum Type
{
UNKNOWN = 0,
BOOLEAN,
NUMBER,
STRING,
SMALLSTRING,
LUSERDATA,
FUSERDATA,
NIL,
TABLE
};
static const int MAX_SMALL_STRING_LENGTH = 15; static const int MAX_SMALL_STRING_LENGTH = 15;
Type type; Type type;
+3 -3
View File
@@ -63,14 +63,14 @@ Message *Message::fromLua(lua_State *L, int n)
if (lua_isnoneornil(L, n+i)) if (lua_isnoneornil(L, n+i))
break; break;
if (!Variant::fromLua(L, n+i, &varg)) vargs.push_back(Variant::fromLua(L, n+i));
if (vargs.back().getType() == Variant::UNKNOWN)
{ {
vargs.clear(); vargs.clear();
luaL_error(L, "Argument %d can't be stored safely\nExpected boolean, number, string or userdata.", n+i); luaL_error(L, "Argument %d can't be stored safely\nExpected boolean, number, string or userdata.", n+i);
return nullptr; return nullptr;
} }
vargs.push_back(varg);
} }
return new Message(name, vargs); return new Message(name, vargs);
+1 -5
View File
@@ -93,11 +93,7 @@ int w_clear(lua_State *)
int w_quit(lua_State *L) int w_quit(lua_State *L)
{ {
std::vector<Variant> args; std::vector<Variant> args = {Variant::fromLua(L, 1)};
Variant v;
if (Variant::fromLua(L, 1, &v))
args.push_back(v);
StrongRef<Message> m(new Message("quit", args), Acquire::NORETAIN); StrongRef<Message> m(new Message("quit", args), Acquire::NORETAIN);
instance()->push(m); instance()->push(m);
+4 -4
View File
@@ -33,8 +33,8 @@ 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 var = Variant::fromLua(L, 2);
if (!Variant::fromLua(L, 2, &var)) if (var.getType() == Variant::UNKNOWN)
return luaL_argerror(L, 2, "boolean, number, string, love type, or flat table expected"); return luaL_argerror(L, 2, "boolean, number, string, love type, or flat table expected");
c->push(var); c->push(var);
return 0; return 0;
@@ -43,8 +43,8 @@ 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 var = Variant::fromLua(L, 2);
if (!Variant::fromLua(L, 2, &var)) if (var.getType() == Variant::UNKNOWN)
return luaL_argerror(L, 2, "boolean, number, string, love type, or flat table expected"); return luaL_argerror(L, 2, "boolean, number, string, love type, or flat table expected");
c->supply(var); c->supply(var);
return 0; return 0;
+3 -4
View File
@@ -36,16 +36,15 @@ int w_Thread_start(lua_State *L)
std::vector<Variant> args; std::vector<Variant> args;
int nargs = lua_gettop(L) - 1; int nargs = lua_gettop(L) - 1;
Variant v;
for (int i = 0; i < nargs; ++i) for (int i = 0; i < nargs; ++i)
{ {
if (!Variant::fromLua(L, i+2, &v)) args.push_back(Variant::fromLua(L, i+2));
if (args.back().getType() == Variant::UNKNOWN)
{ {
args.clear(); args.clear();
return luaL_argerror(L, i+2, "boolean, number, string, love type, or flat table expected"); return luaL_argerror(L, i+2, "boolean, number, string, love type, or flat table expected");
} }
args.push_back(v);
} }
luax_pushboolean(L, t->start(args)); luax_pushboolean(L, t->start(args));