Debugger: Lua - Added getScriptDataFolder function
This commit is contained in:
parent
4245561034
commit
11a06926ff
13 changed files with 63 additions and 36 deletions
|
@ -1048,28 +1048,23 @@ void Debugger::SetInputOverride(uint8_t port, uint32_t state)
|
|||
_inputOverride[port] = state;
|
||||
}
|
||||
|
||||
int Debugger::LoadScript(string content, int32_t scriptId)
|
||||
int Debugger::LoadScript(string name, string content, int32_t scriptId)
|
||||
{
|
||||
DebugBreakHelper helper(this);
|
||||
|
||||
if(scriptId < 0) {
|
||||
shared_ptr<ScriptHost> script(new ScriptHost(_nextScriptId++));
|
||||
script->LoadScript(content, this);
|
||||
script->LoadScript(name, content, this);
|
||||
_scripts.push_back(script);
|
||||
_hasScript = true;
|
||||
return script->GetScriptId();
|
||||
} else {
|
||||
if(content.empty()) {
|
||||
RemoveScript(scriptId);
|
||||
return 0;
|
||||
} else {
|
||||
auto result = std::find_if(_scripts.begin(), _scripts.end(), [=](shared_ptr<ScriptHost> &script) {
|
||||
return script->GetScriptId() == scriptId;
|
||||
});
|
||||
if(result != _scripts.end()) {
|
||||
(*result)->LoadScript(content, this);
|
||||
return scriptId;
|
||||
}
|
||||
auto result = std::find_if(_scripts.begin(), _scripts.end(), [=](shared_ptr<ScriptHost> &script) {
|
||||
return script->GetScriptId() == scriptId;
|
||||
});
|
||||
if(result != _scripts.end()) {
|
||||
(*result)->LoadScript(name, content, this);
|
||||
return scriptId;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -225,7 +225,7 @@ public:
|
|||
static uint32_t GetInputOverride(uint8_t port);
|
||||
void SetInputOverride(uint8_t port, uint32_t state);
|
||||
|
||||
int32_t LoadScript(string content, int32_t scriptId);
|
||||
int32_t LoadScript(string name, string content, int32_t scriptId);
|
||||
void RemoveScript(int32_t scriptId);
|
||||
const char* GetScriptLog(int32_t scriptId);
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "stdafx.h"
|
||||
#include "LuaApi.h"
|
||||
#include "../Utilities/HexUtilities.h"
|
||||
#include "../Utilities/FolderUtilities.h"
|
||||
#include "../Lua/lua.hpp"
|
||||
#include "LuaCallHelper.h"
|
||||
#include "Debugger.h"
|
||||
|
@ -92,6 +93,7 @@ int LuaApi::GetLibrary(lua_State *lua)
|
|||
{ "clearCheats", LuaApi::ClearCheats },
|
||||
{ "setState", LuaApi::SetState },
|
||||
{ "getState", LuaApi::GetState },
|
||||
{ "getScriptDataFolder", LuaApi::GetScriptDataFolder },
|
||||
{ NULL,NULL }
|
||||
};
|
||||
|
||||
|
@ -599,6 +601,18 @@ int LuaApi::ClearCheats(lua_State *lua)
|
|||
return l.ReturnCount();
|
||||
}
|
||||
|
||||
int LuaApi::GetScriptDataFolder(lua_State *lua)
|
||||
{
|
||||
LuaCallHelper l(lua);
|
||||
checkparams();
|
||||
string baseFolder = FolderUtilities::CombinePath(FolderUtilities::GetHomeFolder(), "LuaScriptData");
|
||||
FolderUtilities::CreateFolder(baseFolder);
|
||||
string scriptFolder = FolderUtilities::CombinePath(baseFolder, FolderUtilities::GetFilename(_context->GetScriptName(), false));
|
||||
FolderUtilities::CreateFolder(scriptFolder);
|
||||
l.Return(scriptFolder);
|
||||
return l.ReturnCount();
|
||||
}
|
||||
|
||||
int LuaApi::SetState(lua_State *lua)
|
||||
{
|
||||
LuaCallHelper l(lua);
|
||||
|
|
|
@ -65,6 +65,8 @@ public:
|
|||
static int AddCheat(lua_State *lua);
|
||||
static int ClearCheats(lua_State *lua);
|
||||
|
||||
static int GetScriptDataFolder(lua_State * lua);
|
||||
|
||||
static int SetState(lua_State *lua);
|
||||
static int GetState(lua_State *lua);
|
||||
|
||||
|
|
|
@ -16,8 +16,10 @@ LuaScriptingContext::~LuaScriptingContext()
|
|||
}
|
||||
}
|
||||
|
||||
bool LuaScriptingContext::LoadScript(string scriptContent, Debugger* debugger)
|
||||
bool LuaScriptingContext::LoadScript(string scriptName, string scriptContent, Debugger* debugger)
|
||||
{
|
||||
_scriptName = scriptName;
|
||||
|
||||
int iErr = 0;
|
||||
_lua = luaL_newstate();
|
||||
LuaApi::RegisterDebugger(debugger);
|
||||
|
@ -26,7 +28,7 @@ bool LuaScriptingContext::LoadScript(string scriptContent, Debugger* debugger)
|
|||
luaL_openlibs(_lua);
|
||||
luaL_requiref(_lua, "emu", LuaApi::GetLibrary, 1);
|
||||
Log("Loading script...");
|
||||
if((iErr = luaL_loadstring(_lua, scriptContent.c_str())) == 0) {
|
||||
if((iErr = luaL_loadbufferx(_lua, scriptContent.c_str(), scriptContent.size(), ("@" + scriptName).c_str(), nullptr)) == 0) {
|
||||
if((iErr = lua_pcall(_lua, 0, LUA_MULTRET, 0)) == 0) {
|
||||
//Script loaded properly
|
||||
Log("Script loaded successfully.");
|
||||
|
|
|
@ -18,5 +18,5 @@ public:
|
|||
LuaScriptingContext();
|
||||
~LuaScriptingContext();
|
||||
|
||||
bool LoadScript(string scriptContent, Debugger* debugger);
|
||||
bool LoadScript(string scriptName, string scriptContent, Debugger* debugger);
|
||||
};
|
||||
|
|
|
@ -18,15 +18,11 @@ const char* ScriptHost::GetLog()
|
|||
return _context ? _context->GetLog() : "";
|
||||
}
|
||||
|
||||
bool ScriptHost::LoadScript(string scriptContent, Debugger* debugger)
|
||||
bool ScriptHost::LoadScript(string scriptName, string scriptContent, Debugger* debugger)
|
||||
{
|
||||
_context.reset();
|
||||
if(scriptContent.size() > 0) {
|
||||
_context.reset(new LuaScriptingContext());
|
||||
|
||||
if(!_context->LoadScript(scriptContent, debugger)) {
|
||||
return false;
|
||||
}
|
||||
_context.reset(new LuaScriptingContext());
|
||||
if(!_context->LoadScript(scriptName, scriptContent, debugger)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ public:
|
|||
int GetScriptId();
|
||||
const char* GetLog();
|
||||
|
||||
bool LoadScript(string scriptContent, Debugger* debugger);
|
||||
bool LoadScript(string scriptName, string scriptContent, Debugger* debugger);
|
||||
|
||||
void ProcessCpuOperation(uint16_t addr, uint8_t &value, MemoryOperationType type);
|
||||
void ProcessPpuOperation(uint16_t addr, uint8_t &value, MemoryOperationType type);
|
||||
|
|
|
@ -26,6 +26,11 @@ const char* ScriptingContext::GetLog()
|
|||
return _log.c_str();
|
||||
}
|
||||
|
||||
string ScriptingContext::GetScriptName()
|
||||
{
|
||||
return _scriptName;
|
||||
}
|
||||
|
||||
void ScriptingContext::CallMemoryCallback(uint16_t addr, uint8_t &value, CallbackType type)
|
||||
{
|
||||
_inExecOpEvent = type == CallbackType::CpuExec;
|
||||
|
|
|
@ -32,6 +32,8 @@ private:
|
|||
int32_t _loadSlot = -1;
|
||||
|
||||
protected:
|
||||
string _scriptName;
|
||||
|
||||
vector<int> _callbacks[5][0x10000];
|
||||
vector<int> _eventCallbacks[7];
|
||||
|
||||
|
@ -39,11 +41,13 @@ protected:
|
|||
virtual int InternalCallEventCallback(EventType type) = 0;
|
||||
|
||||
public:
|
||||
virtual bool LoadScript(string scriptContent, Debugger* debugger) = 0;
|
||||
virtual bool LoadScript(string scriptName, string scriptContent, Debugger* debugger) = 0;
|
||||
|
||||
void Log(string message);
|
||||
const char* GetLog();
|
||||
|
||||
string GetScriptName();
|
||||
|
||||
void RequestSaveState(int slot);
|
||||
bool RequestLoadState(int slot);
|
||||
void SaveState();
|
||||
|
|
|
@ -216,13 +216,25 @@ namespace Mesen.GUI.Debugger
|
|||
mnuRecentScripts.Enabled = mnuRecentScripts.DropDownItems.Count > 0;
|
||||
}
|
||||
|
||||
private string ScriptName
|
||||
{
|
||||
get
|
||||
{
|
||||
if(_filePath != null) {
|
||||
return Path.GetFileName(_filePath);
|
||||
} else {
|
||||
return "unnamed.lua";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void RunScript()
|
||||
{
|
||||
if(_filePath != null && mnuSaveBeforeRun.Checked && txtScriptContent.UndoEnabled) {
|
||||
txtScriptContent.SaveToFile(_filePath, Encoding.UTF8);
|
||||
}
|
||||
|
||||
_scriptId = InteropEmu.DebugLoadScript(txtScriptContent.Text, _scriptId);
|
||||
_scriptId = InteropEmu.DebugLoadScript(ScriptName, txtScriptContent.Text, _scriptId);
|
||||
if(_scriptId < 0) {
|
||||
MessageBox.Show("Error while loading script.");
|
||||
} else {
|
||||
|
@ -233,12 +245,9 @@ namespace Mesen.GUI.Debugger
|
|||
private void StopScript()
|
||||
{
|
||||
if(_scriptId >= 0) {
|
||||
if(InteropEmu.DebugLoadScript(string.Empty, _scriptId) == 0) {
|
||||
lblScriptActive.Visible = false;
|
||||
_scriptId = -1;
|
||||
} else {
|
||||
MessageBox.Show("Error while stopping script.");
|
||||
}
|
||||
InteropEmu.DebugRemoveScript(_scriptId);
|
||||
lblScriptActive.Visible = false;
|
||||
_scriptId = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -207,7 +207,7 @@ namespace Mesen.GUI
|
|||
[DllImport(DLLPath)] public static extern void DebugSetMemoryValue(DebugMemoryType type, UInt32 address, byte value);
|
||||
[DllImport(DLLPath)] public static extern void DebugSetInputOverride(Int32 port, Int32 state);
|
||||
|
||||
[DllImport(DLLPath)] public static extern Int32 DebugLoadScript([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]string content, Int32 scriptId = -1);
|
||||
[DllImport(DLLPath)] public static extern Int32 DebugLoadScript([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]string name, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]string content, Int32 scriptId = -1);
|
||||
[DllImport(DLLPath)] public static extern void DebugRemoveScript(Int32 scriptId);
|
||||
[DllImport(DLLPath, EntryPoint = "DebugGetScriptLog")] private static extern IntPtr DebugGetScriptLogWrapper(Int32 scriptId);
|
||||
public static string DebugGetScriptLog(Int32 scriptId) { return PtrToStringUtf8(InteropEmu.DebugGetScriptLogWrapper(scriptId)).Replace("\n", Environment.NewLine); }
|
||||
|
|
|
@ -111,7 +111,7 @@ extern "C"
|
|||
|
||||
DllExport void __stdcall DebugSetInputOverride(uint32_t port, uint32_t state) { GetDebugger()->SetInputOverride(port, state); }
|
||||
|
||||
DllExport int32_t __stdcall DebugLoadScript(char* content, int32_t scriptId) { return GetDebugger()->LoadScript(content, scriptId); }
|
||||
DllExport int32_t __stdcall DebugLoadScript(char* name, char* content, int32_t scriptId) { return GetDebugger()->LoadScript(name, content, scriptId); }
|
||||
DllExport void __stdcall DebugRemoveScript(int32_t scriptId) { GetDebugger()->RemoveScript(scriptId); }
|
||||
DllExport const char* __stdcall DebugGetScriptLog(int32_t scriptId) { return GetDebugger()->GetScriptLog(scriptId); }
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue