diff options
author | chai <chaifix@163.com> | 2021-10-23 18:19:18 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-10-23 18:19:18 +0800 |
commit | 7bf672fd0c6211909d94078b448032b1bd0916ef (patch) | |
tree | 655b875b81ec8d0559ca905fb7d37a1d88e6a80d /Runtime/Lua/LuaBind/LuaBindClass.hpp | |
parent | df0444f85f9bf623cc886e1632e624ef20cb0f1b (diff) |
*misc
Diffstat (limited to 'Runtime/Lua/LuaBind/LuaBindClass.hpp')
-rw-r--r-- | Runtime/Lua/LuaBind/LuaBindClass.hpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/Runtime/Lua/LuaBind/LuaBindClass.hpp b/Runtime/Lua/LuaBind/LuaBindClass.hpp index c112c03..eb028c2 100644 --- a/Runtime/Lua/LuaBind/LuaBindClass.hpp +++ b/Runtime/Lua/LuaBind/LuaBindClass.hpp @@ -44,11 +44,6 @@ namespace LuaBind }; - // TODO: 将公共部分提取出来,不要重复生成代码 - //class NativeClassBase - //{ - //} - // 需要暴露给lua的native class需要继承此类。通过lua管理的实例要确保引用计数的正确性,在多个线程中需要确 // 定不会误释放。 template<class TYPE, class BASE = Object> @@ -90,11 +85,16 @@ namespace LuaBind NativeClass(LuaBind::VM* vm); virtual ~NativeClass(); + VM* GetVM() { return mOwner; } + // 成员引用管理,在实例的ref table里。设置、取、清除 void SetMemberRef(State& state, MemberRef& memRef, int idx); bool PushMemberRef(State& state, MemberRef& memRef); void ClearMemberRef(State& state, MemberRef& memRef); + // 调用回调函数 + void InvokeLuaCallback(LuaBind::MemberRef script, cc8* method); + private: friend class State; @@ -348,7 +348,6 @@ namespace LuaBind state.PushPtrUserdata(p);
lua_newtable(state); // ref table,无法在lua处访问,用来管理C对象的生命周期
- //lua_newtable(state); // member table,lua中创建的对象成员都保存在这里
PushClassTable(state); // class table
// stack:
@@ -405,6 +404,20 @@ namespace LuaBind } } + template<class TYPE, class BASE> + void NativeClass<TYPE, BASE>::InvokeLuaCallback(LuaBind::MemberRef script, cc8* method) + { + if (!script) + return; + LuaBind::State state = GetVM()->GetCurThread(); + int top = state.GetTop(); + PushMemberRef(state, script); + state.GetField(-1, method); + PushMemberRef(state, script); + state.Call(1, 0); + state.SetTop(top); + } + template<class TYPE, class BASE> bool NativeClass<TYPE, BASE>::PushMemberRef(State& state, MemberRef& memRef) { |