mirror of
https://github.com/love2d/love.git
synced 2026-08-17 19:23:38 +02:00
Slightly improve performance of Channel:push(table).
--HG-- branch : minor
This commit is contained in:
+10
-10
@@ -95,10 +95,10 @@ Variant::Variant(love::Type *lovetype, love::Object *object)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Variant gets ownership of the vector.
|
// Variant gets ownership of the vector.
|
||||||
Variant::Variant(std::vector<std::pair<Variant, Variant>> *table)
|
Variant::Variant(SharedTable *table)
|
||||||
: type(TABLE)
|
: type(TABLE)
|
||||||
{
|
{
|
||||||
data.table = new SharedTable(table);
|
data.table = table;
|
||||||
}
|
}
|
||||||
|
|
||||||
Variant::Variant(const Variant &v)
|
Variant::Variant(const Variant &v)
|
||||||
@@ -187,7 +187,7 @@ Variant Variant::fromLua(lua_State *L, int n, std::set<const void*> *tableSet)
|
|||||||
{
|
{
|
||||||
bool success = true;
|
bool success = true;
|
||||||
std::set<const void *> topTableSet;
|
std::set<const void *> topTableSet;
|
||||||
std::vector<std::pair<Variant, Variant>> *table = new std::vector<std::pair<Variant, Variant>>();
|
SharedTable *table = new SharedTable();
|
||||||
|
|
||||||
// We can use a pointer to a stack-allocated variable because it's
|
// We can use a pointer to a stack-allocated variable because it's
|
||||||
// never used after the stack-allocated variable is destroyed.
|
// never used after the stack-allocated variable is destroyed.
|
||||||
@@ -204,16 +204,16 @@ Variant Variant::fromLua(lua_State *L, int n, std::set<const void*> *tableSet)
|
|||||||
|
|
||||||
size_t len = luax_objlen(L, -1);
|
size_t len = luax_objlen(L, -1);
|
||||||
if (len > 0)
|
if (len > 0)
|
||||||
table->reserve(len);
|
table->pairs.reserve(len);
|
||||||
|
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
|
|
||||||
while (lua_next(L, n))
|
while (lua_next(L, n))
|
||||||
{
|
{
|
||||||
table->emplace_back(fromLua(L, -2, tableSet), fromLua(L, -1, tableSet));
|
table->pairs.emplace_back(fromLua(L, -2, tableSet), fromLua(L, -1, tableSet));
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
const auto &p = table->back();
|
const auto &p = table->pairs.back();
|
||||||
if (p.first.getType() == UNKNOWN || p.second.getType() == UNKNOWN)
|
if (p.first.getType() == UNKNOWN || p.second.getType() == UNKNOWN)
|
||||||
{
|
{
|
||||||
success = false;
|
success = false;
|
||||||
@@ -227,7 +227,7 @@ Variant Variant::fromLua(lua_State *L, int n, std::set<const void*> *tableSet)
|
|||||||
if (success)
|
if (success)
|
||||||
return Variant(table);
|
return Variant(table);
|
||||||
else
|
else
|
||||||
delete table;
|
table->release();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -261,14 +261,14 @@ void Variant::toLua(lua_State *L) const
|
|||||||
break;
|
break;
|
||||||
case TABLE:
|
case TABLE:
|
||||||
{
|
{
|
||||||
std::vector<std::pair<Variant, Variant>> *table = data.table->table;
|
std::vector<std::pair<Variant, Variant>> &table = data.table->pairs;
|
||||||
int tsize = (int) table->size();
|
int tsize = (int) table.size();
|
||||||
|
|
||||||
lua_createtable(L, 0, tsize);
|
lua_createtable(L, 0, tsize);
|
||||||
|
|
||||||
for (int i = 0; i < tsize; ++i)
|
for (int i = 0; i < tsize; ++i)
|
||||||
{
|
{
|
||||||
std::pair<Variant, Variant> &kv = (*table)[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);
|
||||||
|
|||||||
@@ -73,14 +73,10 @@ public:
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SharedTable(std::vector<std::pair<Variant, Variant>> *table)
|
SharedTable() {}
|
||||||
: table(table)
|
virtual ~SharedTable() {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~SharedTable() { delete table; }
|
std::vector<std::pair<Variant, Variant>> pairs;
|
||||||
|
|
||||||
std::vector<std::pair<Variant, Variant>> *table;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
union Data
|
union Data
|
||||||
@@ -105,7 +101,7 @@ public:
|
|||||||
Variant(const std::string &str);
|
Variant(const std::string &str);
|
||||||
Variant(void *lightuserdata);
|
Variant(void *lightuserdata);
|
||||||
Variant(love::Type *type, love::Object *object);
|
Variant(love::Type *type, love::Object *object);
|
||||||
Variant(std::vector<std::pair<Variant, Variant>> *table);
|
Variant(SharedTable *table);
|
||||||
Variant(const Variant &v);
|
Variant(const Variant &v);
|
||||||
Variant(Variant &&v);
|
Variant(Variant &&v);
|
||||||
~Variant();
|
~Variant();
|
||||||
|
|||||||
Reference in New Issue
Block a user