summaryrefslogtreecommitdiff
path: root/Runtime/Lua/LuaBind/LuaBindRef.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-10-18 19:56:41 +0800
committerchai <chaifix@163.com>2021-10-18 19:56:41 +0800
commit45328cbadd8a946c19a77301f218efbf650e2f28 (patch)
tree8ec4f3a9737b2cbb9744f8347a56783743be2a4c /Runtime/Lua/LuaBind/LuaBindRef.cpp
parentb5702ece4c2cf751c252e76fb885a7ec41ccabe8 (diff)
*misc
Diffstat (limited to 'Runtime/Lua/LuaBind/LuaBindRef.cpp')
-rw-r--r--Runtime/Lua/LuaBind/LuaBindRef.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/Runtime/Lua/LuaBind/LuaBindRef.cpp b/Runtime/Lua/LuaBind/LuaBindRef.cpp
new file mode 100644
index 0000000..00a65d0
--- /dev/null
+++ b/Runtime/Lua/LuaBind/LuaBindRef.cpp
@@ -0,0 +1,72 @@
+#include "LuaBindVM.h"
+#include "LuaBindRef.h"
+
+namespace LuaBind
+{
+
+ Ref::Ref(int mode)
+ : mRefID(LUA_NOREF)
+ , mMode(mode)
+ {
+ }
+
+ Ref::~Ref()
+ {
+ }
+
+ Ref::operator bool()
+ {
+ return (mRefID != LUA_NOREF);
+ }
+
+ bool Ref::PushRef(State& state)
+ {
+ assert(mRefID != LUA_NOREF);
+
+ VM* vm = state.GetVM();
+ if (!vm) return false;
+ if (mMode == STRONG_REF)
+ {
+ RefTable& table = vm->GetStrongRefTable();
+ table.PushRef(state, mRefID);
+ }
+ else if (mMode == WEAK_REF)
+ {
+ RefTable& table = vm->GetWeakRefTable();
+ table.PushRef(state, mRefID);
+ }
+ else
+ {
+ state.PushNil();
+ return false;
+ }
+ return true;
+ }
+
+ void Ref::SetRef(State& state, int idx)
+ {
+ VM* vm = state.GetVM();
+ if (!vm) return;
+ if (mMode == STRONG_REF)
+ {
+ RefTable& table = vm->GetStrongRefTable();
+ mRefID = table.Ref(state, idx);
+ }
+ else if (mMode == WEAK_REF)
+ {
+ RefTable& table = vm->GetWeakRefTable();
+ mRefID = table.Ref(state, idx);
+ }
+ }
+
+ StrongRef::StrongRef()
+ : Ref(STRONG_REF)
+ {
+ }
+
+ WeakRef::WeakRef()
+ : Ref(WEAK_REF)
+ {
+ }
+
+}