From d2e4b2839bc7ce874370ff4c52dcfdadf666ff52 Mon Sep 17 00:00:00 2001 From: chai Date: Sun, 15 Nov 2020 09:59:32 +0800 Subject: +lua binding --- Runtime/Scripting/LuaBindRefTable.cpp | 120 ++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 Runtime/Scripting/LuaBindRefTable.cpp (limited to 'Runtime/Scripting/LuaBindRefTable.cpp') diff --git a/Runtime/Scripting/LuaBindRefTable.cpp b/Runtime/Scripting/LuaBindRefTable.cpp new file mode 100644 index 0000000..13b9c2c --- /dev/null +++ b/Runtime/Scripting/LuaBindRefTable.cpp @@ -0,0 +1,120 @@ +#include "LuaBindRefTable.h" +#include "LuaBindState.h" + +namespace LuaBind +{ + + LuaBindRefTable::LuaBindRefTable() + : mState(nullptr) + { + } + + LuaBindRefTable::~LuaBindRefTable() + { + } + + void LuaBindRefTable::Init(LuaBindState& state, cc8* name, cc8* mode) + { + assert(!mState); + assert(name); + + mName = name; + mMode = 0; + for (int i = 0; mode && mode[i]; ++i) + { + if (mode[i] == 'k') mMode |= WEAK_KEY; + else if (mode[i] == 'v') mMode |= WEAK_VALUE; + } + mState = state.GetHandle(); + + state.GetField(LUA_REGISTRYINDEX, name); // register[mName] + if (state.IsNil(-1)) + { + state.Pop(); + + lua_newtable(state); // ref table + int ridx = state.AbsIndex(-1); + lua_newtable(state); // metatable of ref table + int idx = state.AbsIndex(-1); + + // __mode + if (mode) + { + state.Push(mode); + state.SetField(idx, "__mode"); + } + + state.Settop(idx); + lua_setmetatable(state, ridx); + + state.Settop(ridx); + state.SetField(LUA_REGISTRYINDEX, name); + } + else + { + state.Pop(); + } + } + + bool LuaBindRefTable::IsKeyWeak() + { + assert(mState); + + return mMode & WEAK_KEY; + } + + bool LuaBindRefTable::IsValueWeak() + { + assert(mState); + + return mMode & WEAK_VALUE; + } + + int LuaBindRefTable::Ref(LuaBindState& state, int idx) + { + assert(mState); + + idx = state.AbsIndex(idx); + state.GetField(LUA_REGISTRYINDEX, mName); // ref table + lua_pushvalue(state, idx); // stuff + int refID = luaL_ref(state, -2); + assert(refID != LUA_NOREF); + state.Pop(); + return refID; + } + + void LuaBindRefTable::Unref(LuaBindState& state, int refID) + { + assert(mState); + + state.GetField(LUA_REGISTRYINDEX, mName); // ref table + luaL_unref(state, -1, refID); + state.Pop(); + return; + } + + void LuaBindRefTable::PushRefTable(LuaBindState& state) + { + assert(mState); + + lua_getfield(state, LUA_REGISTRYINDEX, mName); + } + + void LuaBindRefTable::PushRef(LuaBindState& state, int refID) + { + assert(mState); + + lua_getfield(state, LUA_REGISTRYINDEX, mName); + lua_rawgeti(state, -1, refID); + lua_replace(state, -2); + } + + void LuaBindRefTable::Clear(LuaBindState& state) + { + assert(mState); + + lua_newtable(state); + state.SetField(LUA_REGISTRYINDEX, mName); + } + +} \ No newline at end of file -- cgit v1.1-26-g67d0