Debugger: Lua - Fixed crash when calling emu.reset() outside callbacks

This commit is contained in:
Sour 2020-04-21 20:04:04 -04:00
parent 4869051117
commit 73ef5f21e9
4 changed files with 15 additions and 0 deletions

View file

@ -36,6 +36,7 @@
#define errorCond(cond, text) if(cond) { luaL_error(lua, text); return 0; } #define errorCond(cond, text) if(cond) { luaL_error(lua, text); return 0; }
#define checkparams() if(!l.CheckParamCount()) { return 0; } #define checkparams() if(!l.CheckParamCount()) { return 0; }
#define checkminparams(x) if(!l.CheckParamCount(x)) { return 0; } #define checkminparams(x) if(!l.CheckParamCount(x)) { return 0; }
#define checkinitdone() if(!_context->CheckInitDone()) { error("This function cannot be called outside a callback"); return 0; }
#define checksavestateconditions() if(!_context->CheckInStartFrameEvent() && !_context->CheckInExecOpEvent()) { error("This function must be called inside a StartFrame event callback or a CpuExec memory operation callback"); return 0; } #define checksavestateconditions() if(!_context->CheckInStartFrameEvent() && !_context->CheckInExecOpEvent()) { error("This function must be called inside a StartFrame event callback or a CpuExec memory operation callback"); return 0; }
enum class ExecuteCountType enum class ExecuteCountType
@ -532,6 +533,7 @@ int LuaApi::Reset(lua_State *lua)
{ {
LuaCallHelper l(lua); LuaCallHelper l(lua);
checkparams(); checkparams();
checkinitdone();
_console->Reset(true); _console->Reset(true);
return l.ReturnCount(); return l.ReturnCount();
} }
@ -541,6 +543,7 @@ int LuaApi::Stop(lua_State *lua)
LuaCallHelper l(lua); LuaCallHelper l(lua);
int32_t stopCode = l.ReadInteger(0); int32_t stopCode = l.ReadInteger(0);
checkminparams(0); checkminparams(0);
checkinitdone();
_console->Stop(stopCode); _console->Stop(stopCode);
return l.ReturnCount(); return l.ReturnCount();
} }
@ -549,6 +552,7 @@ int LuaApi::Break(lua_State *lua)
{ {
LuaCallHelper l(lua); LuaCallHelper l(lua);
checkparams(); checkparams();
checkinitdone();
_debugger->Step(1); _debugger->Step(1);
return l.ReturnCount(); return l.ReturnCount();
} }
@ -557,6 +561,7 @@ int LuaApi::Resume(lua_State *lua)
{ {
LuaCallHelper l(lua); LuaCallHelper l(lua);
checkparams(); checkparams();
checkinitdone();
_debugger->Run(); _debugger->Run();
return l.ReturnCount(); return l.ReturnCount();
} }
@ -567,6 +572,7 @@ int LuaApi::Execute(lua_State *lua)
ExecuteCountType type = (ExecuteCountType)l.ReadInteger(); ExecuteCountType type = (ExecuteCountType)l.ReadInteger();
int count = l.ReadInteger(); int count = l.ReadInteger();
checkparams(); checkparams();
checkinitdone();
errorCond(count <= 0, "count must be >= 1"); errorCond(count <= 0, "count must be >= 1");
errorCond(type < ExecuteCountType::CpuCycles || type > ExecuteCountType::CpuInstructions, "type is invalid"); errorCond(type < ExecuteCountType::CpuCycles || type > ExecuteCountType::CpuInstructions, "type is invalid");

View file

@ -83,6 +83,7 @@ bool LuaScriptingContext::LoadScript(string scriptName, string scriptContent, De
if((iErr = lua_pcall(_lua, 0, LUA_MULTRET, 0)) == 0) { if((iErr = lua_pcall(_lua, 0, LUA_MULTRET, 0)) == 0) {
//Script loaded properly //Script loaded properly
Log("Script loaded successfully."); Log("Script loaded successfully.");
_initDone = true;
return true; return true;
} }
} }
@ -90,6 +91,7 @@ bool LuaScriptingContext::LoadScript(string scriptName, string scriptContent, De
if(lua_isstring(_lua, -1)) { if(lua_isstring(_lua, -1)) {
Log(lua_tostring(_lua, -1)); Log(lua_tostring(_lua, -1));
} }
return false; return false;
} }

View file

@ -59,6 +59,11 @@ int ScriptingContext::CallEventCallback(EventType type)
return returnValue; return returnValue;
} }
bool ScriptingContext::CheckInitDone()
{
return _initDone;
}
bool ScriptingContext::CheckInStartFrameEvent() bool ScriptingContext::CheckInStartFrameEvent()
{ {
return _inStartFrameEvent; return _inStartFrameEvent;

View file

@ -36,6 +36,7 @@ private:
protected: protected:
string _scriptName; string _scriptName;
bool _initDone = false;
vector<int> _callbacks[5][0x10000]; vector<int> _callbacks[5][0x10000];
vector<int> _eventCallbacks[(int)EventType::EventTypeSize]; vector<int> _eventCallbacks[(int)EventType::EventTypeSize];
@ -65,6 +66,7 @@ public:
void CallMemoryCallback(uint16_t addr, uint8_t &value, CallbackType type); void CallMemoryCallback(uint16_t addr, uint8_t &value, CallbackType type);
int CallEventCallback(EventType type); int CallEventCallback(EventType type);
bool CheckInitDone();
bool CheckInStartFrameEvent(); bool CheckInStartFrameEvent();
bool CheckInExecOpEvent(); bool CheckInExecOpEvent();
bool CheckStateLoadedFlag(); bool CheckStateLoadedFlag();