summaryrefslogtreecommitdiff
path: root/Runtime/Lua/LuaBind/LuaBindClass.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Lua/LuaBind/LuaBindClass.hpp')
-rw-r--r--Runtime/Lua/LuaBind/LuaBindClass.hpp25
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)
{