mirror of
https://github.com/love2d/love.git
synced 2026-08-17 19:23:38 +02:00
Very minor channel / variant performance improvements and cleanup.
This commit is contained in:
+21
-27
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user