summaryrefslogtreecommitdiff
path: root/Runner/Scripting/luax_vm.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-09-10 20:30:31 +0800
committerchai <chaifix@163.com>2020-09-10 20:30:31 +0800
commit639b34294ffc20721c66db46e59e07d9100ac4b8 (patch)
tree7e1d45b536fa35e9f1559e468ea66fca99524573 /Runner/Scripting/luax_vm.cpp
*init
Diffstat (limited to 'Runner/Scripting/luax_vm.cpp')
-rw-r--r--Runner/Scripting/luax_vm.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/Runner/Scripting/luax_vm.cpp b/Runner/Scripting/luax_vm.cpp
new file mode 100644
index 0000000..4dc7e0c
--- /dev/null
+++ b/Runner/Scripting/luax_vm.cpp
@@ -0,0 +1,76 @@
+#include "luax_internal.h"
+#include "luax_vm.h"
+
+namespace Luax
+{
+
+ LuaxVM::VMap LuaxVM::VMs; // 通过线程查找虚拟机,为了方便
+
+ LuaxVM* LuaxVM::TryGetVM(global_State* gState)
+ {
+ auto it = VMs.find(gState);
+ if (it != VMs.end())
+ return it->second;
+ else
+ return nullptr;
+ }
+
+ LuaxVM* LuaxVM::TryGetVM(lua_State* state)
+ {
+ return TryGetVM(G(state));
+ }
+
+ LuaxVM::LuaxVM()
+ : mStrongRefTable()
+ , mWeakRefTable()
+ {
+ mMainThread = luaL_newstate();
+ assert(mMainThread);
+ mGlobalState = G(mMainThread);
+
+ VMs.insert(std::pair<global_State*, LuaxVM*>(mGlobalState, this));
+ }
+
+ LuaxVM::~LuaxVM()
+ {
+ VMs.erase(mGlobalState);
+ lua_close(mMainThread);
+ }
+
+ // 初始化context
+ void LuaxVM::Setup()
+ {
+ LUAX_STATE(mMainThread);
+
+ mStrongRefTable.Init(state, "_LUAX_STRONGREF_TABLE");
+ mWeakRefTable.Init(state, "_LUAX_WEAKREF_TABLE", "v");
+ }
+
+ lua_State* LuaxVM::CreateThread()
+ {
+ lua_State* thread = lua_newthread(mMainThread);
+ assert(thread);
+ return thread;
+ }
+
+ lua_State* LuaxVM::GetMainThread()
+ {
+ return mMainThread;
+ }
+
+ LuaxState LuaxVM::GetMainState()
+ {
+ return mMainThread;
+ }
+
+ LuaxRefTable& LuaxVM::GetStrongRefTable()
+ {
+ return mStrongRefTable;
+ }
+
+ LuaxRefTable& LuaxVM::GetWeakRefTable()
+ {
+ return mWeakRefTable;
+ }
+
+} \ No newline at end of file