Optimize lua object pushing
This commit is contained in:
		
							parent
							
								
									3b345cf868
								
							
						
					
					
						commit
						773d58da01
					
				| 
						 | 
					@ -23,11 +23,11 @@
 | 
				
			||||||
#include "luaobject.h"
 | 
					#include "luaobject.h"
 | 
				
			||||||
#include "luainterface.h"
 | 
					#include "luainterface.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <typeinfo>
 | 
				
			||||||
#include <framework/core/application.h>
 | 
					#include <framework/core/application.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LuaObject::LuaObject() :
 | 
					LuaObject::LuaObject() :
 | 
				
			||||||
    m_fieldsTableRef(-1),
 | 
					    m_fieldsTableRef(-1)
 | 
				
			||||||
    m_metatableRef(-1)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,11 +37,6 @@ LuaObject::~LuaObject()
 | 
				
			||||||
    assert(!g_app.isTerminated());
 | 
					    assert(!g_app.isTerminated());
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    releaseLuaFieldsTable();
 | 
					    releaseLuaFieldsTable();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(m_metatableRef != -1) {
 | 
					 | 
				
			||||||
        g_lua.unref(m_metatableRef);
 | 
					 | 
				
			||||||
        m_metatableRef = -1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool LuaObject::hasLuaField(const std::string& field)
 | 
					bool LuaObject::hasLuaField(const std::string& field)
 | 
				
			||||||
| 
						 | 
					@ -91,13 +86,19 @@ void LuaObject::luaGetField(const std::string& key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LuaObject::luaGetMetatable()
 | 
					void LuaObject::luaGetMetatable()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if(m_metatableRef == -1) {
 | 
					    static std::unordered_map<const std::type_info*, int> metatableMap;
 | 
				
			||||||
        // set the userdata metatable
 | 
					    const std::type_info& tinfo = typeid(*this);
 | 
				
			||||||
        g_lua.getGlobal(stdext::format("%s_mt", getClassName()));
 | 
					    auto it = metatableMap.find(&tinfo);
 | 
				
			||||||
        m_metatableRef = g_lua.ref();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_lua.getRef(m_metatableRef);
 | 
					    int metatableRef;
 | 
				
			||||||
 | 
					    if(it == metatableMap.end()) {
 | 
				
			||||||
 | 
					        g_lua.getGlobal(getClassName() + "_mt");
 | 
				
			||||||
 | 
					        metatableRef = g_lua.ref();
 | 
				
			||||||
 | 
					        metatableMap[&tinfo] = metatableRef;
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
 | 
					        metatableRef = it->second;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_lua.getRef(metatableRef);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LuaObject::luaGetFieldsTable()
 | 
					void LuaObject::luaGetFieldsTable()
 | 
				
			||||||
| 
						 | 
					@ -112,3 +113,9 @@ int LuaObject::getUseCount()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return ref_count();
 | 
					    return ref_count();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string LuaObject::getClassName()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // TODO: this could be cached for more performance
 | 
				
			||||||
 | 
					    return stdext::demangle_name(typeid(*this).name());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,6 @@
 | 
				
			||||||
#define LUAOBJECT_H
 | 
					#define LUAOBJECT_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "declarations.h"
 | 
					#include "declarations.h"
 | 
				
			||||||
#include <typeinfo>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// LuaObject, all script-able classes have it as base
 | 
					/// LuaObject, all script-able classes have it as base
 | 
				
			||||||
// @bindclass
 | 
					// @bindclass
 | 
				
			||||||
| 
						 | 
					@ -76,10 +75,7 @@ public:
 | 
				
			||||||
    int getUseCount();
 | 
					    int getUseCount();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Returns the derived class name, its the same name used in Lua
 | 
					    /// Returns the derived class name, its the same name used in Lua
 | 
				
			||||||
    std::string getClassName() {
 | 
					    std::string getClassName();
 | 
				
			||||||
        // TODO: this could be cached for more performance
 | 
					 | 
				
			||||||
        return stdext::demangle_name(typeid(*this).name());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LuaObjectPtr asLuaObject() { return static_self_cast<LuaObject>(); }
 | 
					    LuaObjectPtr asLuaObject() { return static_self_cast<LuaObject>(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -87,7 +83,6 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    int m_fieldsTableRef;
 | 
					    int m_fieldsTableRef;
 | 
				
			||||||
    int m_metatableRef;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "luainterface.h"
 | 
					#include "luainterface.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,9 @@
 | 
				
			||||||
#include <framework/luaengine/luainterface.h>
 | 
					#include <framework/luaengine/luainterface.h>
 | 
				
			||||||
#include <otclient/otclient.h>
 | 
					#include <otclient/otclient.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "otclient/item.h"
 | 
				
			||||||
 | 
					#include "otclient/tile.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, const char* argv[])
 | 
					int main(int argc, const char* argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    std::vector<std::string> args(argv, argv + argc);
 | 
					    std::vector<std::string> args(argv, argv + argc);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,7 +127,7 @@ private:
 | 
				
			||||||
    uint8 m_countOrSubType;
 | 
					    uint8 m_countOrSubType;
 | 
				
			||||||
    stdext::packed_storage<uint8> m_attribs;
 | 
					    stdext::packed_storage<uint8> m_attribs;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack(pop)
 | 
					#pragma pack(pop)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue