From 164885fd98d48703bd771f802d79557b7db97431 Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 29 Oct 2021 22:28:12 +0800 Subject: =?UTF-8?q?*=20!!!=20=E5=85=81=E8=AE=B8NativeClass=E5=BB=B6?= =?UTF-8?q?=E5=90=8E=E7=BB=91=E5=AE=9AVM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Lua/LuaBind/LuaBindClass.hpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'Runtime/Lua/LuaBind/LuaBindClass.hpp') diff --git a/Runtime/Lua/LuaBind/LuaBindClass.hpp b/Runtime/Lua/LuaBind/LuaBindClass.hpp index 1da8513..aed4741 100644 --- a/Runtime/Lua/LuaBind/LuaBindClass.hpp +++ b/Runtime/Lua/LuaBind/LuaBindClass.hpp @@ -81,6 +81,8 @@ namespace LuaBind protected: + // 延后绑定VM + NativeClass(); // 需要指明对象所属的虚拟机 NativeClass(LuaBind::VM* vm); virtual ~NativeClass(); @@ -108,6 +110,9 @@ namespace LuaBind // 创建userdata,绑定实例到state。 void BindToLua(State& state); + // 延后绑定VM,在BindToLua中设置 + void LateBindVM(VM* vm); + //------------------------------------------------------------------------------// // 公共内容 @@ -195,6 +200,12 @@ namespace LuaBind vm->RegisterClassI(state, sClassID, idx); } + template + void NativeClass::LateBindVM(VM* vm) + { + mOwner = vm; + } + template void NativeClass::PushClassTable(State& state) { @@ -202,6 +213,17 @@ namespace LuaBind vm->PushClassTable(state, sClassID); } + template + NativeClass::NativeClass() + : mWatchDog() + , mUserdata(NULL) + , mOwner(NULL) +#if LUA_BIND_PROFILER + , mSafer(false) +#endif + { + } + template NativeClass::NativeClass(LuaBind::VM* vm) : mWatchDog() @@ -341,6 +363,11 @@ namespace LuaBind { assert(!mUserdata); + if (mOwner == NULL) + { + LateBindVM(state.GetVM()); + } + // 创建userdata并留在栈顶,注意地址要转换为TYPE*,直接用this可能会导致多重继承的类丧失多态。 // 如果直接传this进去,在多重继承情况下,是拿不到另一头的虚函数表的。所以这里需要将this // 转换为整个对象的低地址,这样可以拿到另一个基类的虚函数表,通过另一个基类实现多态。 -- cgit v1.1-26-g67d0