diff options
author | aunsane <aunsane@gmail.com> | 2018-07-13 23:57:25 +0300 |
---|---|---|
committer | aunsane <aunsane@gmail.com> | 2018-07-15 15:03:47 +0300 |
commit | ce719a1725988bded5566a5d7f596b1ba42cfa91 (patch) | |
tree | ee5a96fa51444ed509edb111a0ed49eabda834f2 /plugins/MirLua/src/plugin.cpp | |
parent | 40198c29b0f5e7f14f73a3e0a62541ac918612a8 (diff) |
MirLua: add Evaluate option page to test scripts
Diffstat (limited to 'plugins/MirLua/src/plugin.cpp')
-rw-r--r-- | plugins/MirLua/src/plugin.cpp | 123 |
1 files changed, 72 insertions, 51 deletions
diff --git a/plugins/MirLua/src/plugin.cpp b/plugins/MirLua/src/plugin.cpp index d8f1864c94..a5451d173b 100644 --- a/plugins/MirLua/src/plugin.cpp +++ b/plugins/MirLua/src/plugin.cpp @@ -24,8 +24,8 @@ static int ScriptsCompare(const CMLuaScript* p1, const CMLuaScript* p2) CMPlugin::CMPlugin() : PLUGIN(MODULENAME, pluginInfoEx), - lua(nullptr), - Scripts(1, ScriptsCompare) + L(nullptr), + m_scripts(1, ScriptsCompare) { MUUID muidLast = MIID_LAST; g_hMLuaLangpack = GetPluginLangId(muidLast, 0); @@ -37,47 +37,85 @@ CMPlugin::CMPlugin() CreatePluginService(MS_LUA_EVAL, &CMPlugin::Eval); } +void CMPlugin::LoadLuaScripts() +{ + CMLuaScriptLoader::Load(L, m_scripts); +} + +void CMPlugin::UnloadLuaScripts() +{ + for (auto &script : m_scripts.rev_iter()) { + script->Unload(); + delete m_scripts.removeItem(&script); + } +} + void CMPlugin::LoadLua() { - lua = new CMLua(); - lua->Load(); - CMLuaFunctionLoader::Load(lua->L); - CMLuaModuleLoader::Load(lua->L); - CMLuaScriptLoader::Load(lua->L); + Log("Loading lua engine"); + L = luaL_newstate(); + Log("Loading standard modules"); + luaL_openlibs(L); + + lua_atpanic(L, luaM_atpanic); + + CMLuaFunctionLoader::Load(L); + CMLuaModuleLoader::Load(L); + LoadLuaScripts(); } void CMPlugin::UnloadLua() { - Scripts.destroy(); + UnloadLuaScripts(); + + if (L != nullptr) { + KillObjectEventHooks(L); + KillObjectServices(L); + + Log("Unloading lua engine"); + + lua_close(L); + } KillModuleIcons(this); KillModuleSounds(this); KillModuleMenus(this); KillModuleHotkeys(this); - - KillObjectEventHooks(lua->L); - KillObjectServices(lua->L); - - if (lua != nullptr) { - delete lua; - lua = nullptr; - } } -void CMPlugin::Reload() +void CMPlugin::ReloadLuaScripts() { - Unload(); - Load(); + UnloadLuaScripts(); + LoadLuaScripts(); } /***********************************************/ -static int OnModulesLoaded(WPARAM, LPARAM) +int CMPlugin::OnOptionsInit(WPARAM wParam, LPARAM) +{ + OPTIONSDIALOGPAGE odp = {}; + odp.flags = ODPF_BOLDGROUPS | ODPF_UNICODE | ODPF_DONTTRANSLATE; + odp.szGroup.w = LPGENW("Services"); + odp.szTitle.w = L"Lua"; + + odp.szTab.w = LPGENW("Scripts"); + odp.pDialog = new CMLuaOptionsMain(*this); + g_plugin.addOptions(wParam, &odp); + + odp.szTab.w = LPGENW("Evaluate"); + odp.pDialog = new CMLuaEvaluateOptions(*this); + g_plugin.addOptions(wParam, &odp); + + return 0; +} + +int CMPlugin::OnModulesLoaded(WPARAM, LPARAM) { g_hCLibsFolder = FoldersRegisterCustomPathT(MODULENAME, "CLibsFolder", MIRLUA_PATHT, TranslateT("C libs folder")); g_hScriptsFolder = FoldersRegisterCustomPathT(MODULENAME, "ScriptsFolder", MIRLUA_PATHT, TranslateT("Scripts folder")); - HookEvent(ME_OPT_INITIALISE, OnOptionsInit); + HookPluginEvent(ME_OPT_INITIALISE, &CMPlugin::OnOptionsInit); + return 0; } @@ -87,7 +125,7 @@ int CMPlugin::Load() LoadNetlib(); LoadLua(); - HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded); + HookPluginEvent(ME_SYSTEM_MODULESLOADED, &CMPlugin::OnModulesLoaded); return 0; } @@ -127,17 +165,14 @@ INT_PTR CMPlugin::Call(WPARAM wParam, LPARAM lParam) const wchar_t *module = (const wchar_t*)wParam; const wchar_t *function = (const wchar_t*)lParam; - lua_pushstring(lua->L, ptrA(mir_utf8encodeW(module))); - lua_pushstring(lua->L, ptrA(mir_utf8encodeW(function))); + lua_pushstring(L, T2Utf(module)); + lua_pushstring(L, T2Utf(function)); - lua_newtable(lua->L); - lua_pushcclosure(lua->L, mlua_call, 1); + lua_pushcfunction(L, mlua_call); - CMLuaEnvironment env(lua->L); - env.Load(); - - wchar_t *result = mir_utf8decodeW(lua_tostring(lua->L, -1)); - lua_pop(lua->L, 1); + CMLuaEnvironment env(L); + wchar_t *result = env.Call(); + env.Unload(); return (INT_PTR)result; } @@ -146,16 +181,9 @@ INT_PTR CMPlugin::Eval(WPARAM, LPARAM lParam) { const wchar_t *script = (const wchar_t*)lParam; - if (luaL_loadstring(lua->L, ptrA(mir_utf8encodeW(script)))) { - ReportError(lua->L); - return NULL; - } - - CMLuaEnvironment env(lua->L); - env.Load(); - - wchar_t *result = mir_utf8decodeW(lua_tostring(lua->L, -1)); - lua_pop(lua->L, 1); + CMLuaEnvironment env(L); + wchar_t *result = env.Eval(script); + env.Unload(); return (INT_PTR)result; } @@ -164,16 +192,9 @@ INT_PTR CMPlugin::Exec(WPARAM, LPARAM lParam) { const wchar_t *path = (const wchar_t*)lParam; - if (luaL_loadfile(lua->L, ptrA(mir_utf8encodeW(path)))) { - ReportError(lua->L); - return NULL; - } - - CMLuaEnvironment env(lua->L); - env.Load(); - - wchar_t *result = mir_utf8decodeW(lua_tostring(lua->L, -1)); - lua_pop(lua->L, 1); + CMLuaEnvironment env(L); + wchar_t *result = env.Exec(path); + env.Unload(); return (INT_PTR)result; } |