read/write byte range functions - range check, and log warnings if user attempts to access outside the domain range, rather than throw a vague lua exception and crash
This commit is contained in:
parent
e1a5123dcf
commit
4ee4088c4c
|
@ -9,18 +9,26 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
private readonly LuaFunctionList _luaFunctions = new LuaFunctionList();
|
private readonly LuaFunctionList _luaFunctions = new LuaFunctionList();
|
||||||
|
|
||||||
public EventLuaLibrary(Action<string> logOutputCallback)
|
public EventLuaLibrary(Action<object> logOutputCallback)
|
||||||
{
|
{
|
||||||
LogOutputCallback = logOutputCallback;
|
LogOutputCallback = logOutputCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string Name { get { return "event"; } }
|
public override string Name { get { return "event"; } }
|
||||||
|
|
||||||
public Action<string> LogOutputCallback { get; set; }
|
public Action<object> LogOutputCallback { get; set; }
|
||||||
public Lua CurrentThread { get; set; }
|
public Lua CurrentThread { get; set; }
|
||||||
|
|
||||||
#region Events Library Helpers
|
#region Events Library Helpers
|
||||||
|
|
||||||
|
private void Log(string message)
|
||||||
|
{
|
||||||
|
if (LogOutputCallback != null)
|
||||||
|
{
|
||||||
|
LogOutputCallback(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public LuaFunctionList RegisteredFunctions { get { return _luaFunctions; } }
|
public LuaFunctionList RegisteredFunctions { get { return _luaFunctions; } }
|
||||||
|
|
||||||
public void CallSaveStateEvent(string name)
|
public void CallSaveStateEvent(string name)
|
||||||
|
@ -37,7 +45,7 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
catch (SystemException e)
|
catch (SystemException e)
|
||||||
{
|
{
|
||||||
LogOutputCallback(
|
Log(
|
||||||
"error running function attached by lua function event.onsavestate" +
|
"error running function attached by lua function event.onsavestate" +
|
||||||
"\nError message: " +
|
"\nError message: " +
|
||||||
e.Message);
|
e.Message);
|
||||||
|
@ -59,7 +67,7 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
catch (SystemException e)
|
catch (SystemException e)
|
||||||
{
|
{
|
||||||
LogOutputCallback(
|
Log(
|
||||||
"error running function attached by lua function event.onloadstate" +
|
"error running function attached by lua function event.onloadstate" +
|
||||||
"\nError message: " +
|
"\nError message: " +
|
||||||
e.Message);
|
e.Message);
|
||||||
|
@ -81,7 +89,7 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
catch (SystemException e)
|
catch (SystemException e)
|
||||||
{
|
{
|
||||||
LogOutputCallback(
|
Log(
|
||||||
"error running function attached by lua function event.onframestart" +
|
"error running function attached by lua function event.onframestart" +
|
||||||
"\nError message: " +
|
"\nError message: " +
|
||||||
e.Message);
|
e.Message);
|
||||||
|
@ -103,7 +111,7 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
catch (SystemException e)
|
catch (SystemException e)
|
||||||
{
|
{
|
||||||
LogOutputCallback(
|
Log(
|
||||||
"error running function attached by lua function event.onframeend" +
|
"error running function attached by lua function event.onframeend" +
|
||||||
"\nError message: " +
|
"\nError message: " +
|
||||||
e.Message);
|
e.Message);
|
||||||
|
|
|
@ -15,9 +15,18 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string Name { get { return "mainmemory"; } }
|
public override string Name { get { return "mainmemory"; } }
|
||||||
|
public Action<string> LogOutputCallback { get; set; }
|
||||||
|
|
||||||
#region Main Memory Library Helpers
|
#region Main Memory Library Helpers
|
||||||
|
|
||||||
|
private void Log(object message)
|
||||||
|
{
|
||||||
|
if (LogOutputCallback != null)
|
||||||
|
{
|
||||||
|
LogOutputCallback(message.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static int U2S(uint u, int size)
|
private static int U2S(uint u, int size)
|
||||||
{
|
{
|
||||||
var s = (int)u;
|
var s = (int)u;
|
||||||
|
@ -121,12 +130,21 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
var lastAddr = length + addr;
|
var lastAddr = length + addr;
|
||||||
var table = _lua.NewTable();
|
var table = _lua.NewTable();
|
||||||
for (var i = addr; i <= lastAddr; i++)
|
if (lastAddr < Global.Emulator.MemoryDomains.MainMemory.Size)
|
||||||
{
|
{
|
||||||
var a = string.Format("{0:X2}", i);
|
for (var i = addr; i <= lastAddr; i++)
|
||||||
var v = Global.Emulator.MemoryDomains.MainMemory.PeekByte(i);
|
{
|
||||||
var vs = string.Format("{0:X2}", (int)v);
|
var a = string.Format("{0:X2}", i);
|
||||||
table[a] = vs;
|
var v = Global.Emulator.MemoryDomains.MainMemory.PeekByte(i);
|
||||||
|
var vs = string.Format("{0:X2}", (int)v);
|
||||||
|
table[a] = vs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log("Warning: Attempted read " + lastAddr + " outside memory domain size of " +
|
||||||
|
Global.Emulator.MemoryDomains.MainMemory.Size +
|
||||||
|
" in mainmemory.readbyterange()");
|
||||||
}
|
}
|
||||||
|
|
||||||
return table;
|
return table;
|
||||||
|
@ -160,9 +178,19 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
foreach (var address in memoryblock.Keys)
|
foreach (var address in memoryblock.Keys)
|
||||||
{
|
{
|
||||||
Global.Emulator.MemoryDomains.MainMemory.PokeByte(
|
var addr = LuaInt(address);
|
||||||
LuaInt(address),
|
if (addr < Global.Emulator.MemoryDomains.MainMemory.Size)
|
||||||
(byte)LuaInt(memoryblock[address]));
|
{
|
||||||
|
Global.Emulator.MemoryDomains.MainMemory.PokeByte(
|
||||||
|
addr,
|
||||||
|
(byte)LuaInt(memoryblock[address]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log("Warning: Attempted read " + addr + " outside memory domain size of " +
|
||||||
|
Global.Emulator.MemoryDomains.MainMemory.Size +
|
||||||
|
" in mainmemory.writebyterange()");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,18 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string Name { get { return "memory"; } }
|
public override string Name { get { return "memory"; } }
|
||||||
|
public Action<string> LogOutputCallback { get; set; }
|
||||||
|
|
||||||
#region Memory Library Helpers
|
#region Memory Library Helpers
|
||||||
|
|
||||||
|
private void Log(object message)
|
||||||
|
{
|
||||||
|
if (LogOutputCallback != null)
|
||||||
|
{
|
||||||
|
LogOutputCallback(message.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static int U2S(uint u, int size)
|
private static int U2S(uint u, int size)
|
||||||
{
|
{
|
||||||
var s = (int)u;
|
var s = (int)u;
|
||||||
|
@ -120,12 +129,22 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
var lastAddr = length + addr;
|
var lastAddr = length + addr;
|
||||||
var table = _lua.NewTable();
|
var table = _lua.NewTable();
|
||||||
for (var i = addr; i <= lastAddr; i++)
|
|
||||||
|
if (lastAddr < Global.Emulator.MemoryDomains[_currentMemoryDomain].Size)
|
||||||
{
|
{
|
||||||
var a = string.Format("{0:X2}", i);
|
for (var i = addr; i <= lastAddr; i++)
|
||||||
var v = Global.Emulator.MemoryDomains[_currentMemoryDomain].PeekByte(i);
|
{
|
||||||
var vs = string.Format("{0:X2}", (int)v);
|
var a = string.Format("{0:X2}", i);
|
||||||
table[a] = vs;
|
var v = Global.Emulator.MemoryDomains[_currentMemoryDomain].PeekByte(i);
|
||||||
|
var vs = string.Format("{0:X2}", (int)v);
|
||||||
|
table[a] = vs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log("Warning: Attempted read " + lastAddr + " outside memory domain size of " +
|
||||||
|
Global.Emulator.MemoryDomains[_currentMemoryDomain].Size +
|
||||||
|
" in memory.readbyterange()");
|
||||||
}
|
}
|
||||||
|
|
||||||
return table;
|
return table;
|
||||||
|
@ -139,9 +158,19 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
foreach (var address in memoryblock.Keys)
|
foreach (var address in memoryblock.Keys)
|
||||||
{
|
{
|
||||||
Global.Emulator.MemoryDomains[_currentMemoryDomain].PokeByte(
|
var addr = LuaInt(address);
|
||||||
LuaInt(address),
|
if (addr < Global.Emulator.MemoryDomains[_currentMemoryDomain].Size)
|
||||||
(byte)LuaInt(memoryblock[address]));
|
{
|
||||||
|
Global.Emulator.MemoryDomains[_currentMemoryDomain].PokeByte(
|
||||||
|
addr,
|
||||||
|
(byte)LuaInt(memoryblock[address]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log("Warning: Attempted read " + addr + " outside memory domain size of " +
|
||||||
|
Global.Emulator.MemoryDomains[_currentMemoryDomain].Size +
|
||||||
|
" in memory.writebyterange()");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
{ 4, "Scanlines" },
|
{ 4, "Scanlines" },
|
||||||
};
|
};
|
||||||
|
|
||||||
public EmuHawkLuaLibrary(Action<string> logOutputCallback)
|
public EmuHawkLuaLibrary(Action<object> logOutputCallback)
|
||||||
: this()
|
: this()
|
||||||
{
|
{
|
||||||
LogOutputCallback = logOutputCallback;
|
LogOutputCallback = logOutputCallback;
|
||||||
|
@ -24,7 +24,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
public EmuHawkLuaLibrary() { }
|
public EmuHawkLuaLibrary() { }
|
||||||
|
|
||||||
public override string Name { get { return "client"; } }
|
public override string Name { get { return "client"; } }
|
||||||
public Action<string> LogOutputCallback { get; set; }
|
public Action<object> LogOutputCallback { get; set; }
|
||||||
|
|
||||||
private void Log(string message)
|
private void Log(string message)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,10 +44,10 @@ namespace BizHawk.Client.EmuHawk
|
||||||
LogWithSeparator("\t", "\n", outputs);
|
LogWithSeparator("\t", "\n", outputs);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Single param version is used by logOutputCallback of some libraries.
|
//// Single param version is used by logOutputCallback of some libraries.
|
||||||
public static void Log(string output)
|
public static void LogOutput(object output)
|
||||||
{
|
{
|
||||||
Log((object)output);
|
Log(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
[LuaMethodAttributes(
|
[LuaMethodAttributes(
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
public class EmuLuaLibrary
|
public class EmuLuaLibrary
|
||||||
{
|
{
|
||||||
private readonly FormsLuaLibrary _formsLibrary = new FormsLuaLibrary();
|
private readonly FormsLuaLibrary _formsLibrary = new FormsLuaLibrary();
|
||||||
private readonly EventLuaLibrary _eventLibrary = new EventLuaLibrary(ConsoleLuaLibrary.Log);
|
private readonly EventLuaLibrary _eventLibrary = new EventLuaLibrary(ConsoleLuaLibrary.LogOutput);
|
||||||
private readonly GuiLuaLibrary _guiLibrary = new GuiLuaLibrary();
|
private readonly GuiLuaLibrary _guiLibrary = new GuiLuaLibrary();
|
||||||
private readonly LuaConsole _caller;
|
private readonly LuaConsole _caller;
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
lua.RegisterFunction("print", this, GetType().GetMethod("Print"));
|
lua.RegisterFunction("print", this, GetType().GetMethod("Print"));
|
||||||
|
|
||||||
new BitLuaLibrary().LuaRegister(lua, Docs);
|
new BitLuaLibrary().LuaRegister(lua, Docs);
|
||||||
new EmuHawkLuaLibrary(ConsoleLuaLibrary.Log).LuaRegister(lua, Docs);
|
new EmuHawkLuaLibrary(ConsoleLuaLibrary.LogOutput).LuaRegister(lua, Docs);
|
||||||
new ConsoleLuaLibrary().LuaRegister(lua, Docs);
|
new ConsoleLuaLibrary().LuaRegister(lua, Docs);
|
||||||
|
|
||||||
new EmulatorLuaLibrary(
|
new EmulatorLuaLibrary(
|
||||||
|
@ -95,14 +95,26 @@ namespace BizHawk.Client.EmuHawk
|
||||||
_guiLibrary.LuaRegister(lua, Docs);
|
_guiLibrary.LuaRegister(lua, Docs);
|
||||||
new InputLuaLibrary(_lua).LuaRegister(lua, Docs);
|
new InputLuaLibrary(_lua).LuaRegister(lua, Docs);
|
||||||
new JoypadLuaLibrary(_lua).LuaRegister(lua, Docs);
|
new JoypadLuaLibrary(_lua).LuaRegister(lua, Docs);
|
||||||
new MemoryLuaLibrary(_lua).LuaRegister(lua, Docs);
|
|
||||||
new MainMemoryLuaLibrary(_lua).LuaRegister(lua, Docs);
|
var memory = new MemoryLuaLibrary(_lua)
|
||||||
|
{
|
||||||
|
LogOutputCallback = ConsoleLuaLibrary.LogOutput
|
||||||
|
};
|
||||||
|
memory.LuaRegister(lua, Docs);
|
||||||
|
|
||||||
|
var mainmemory = new MainMemoryLuaLibrary(_lua)
|
||||||
|
{
|
||||||
|
LogOutputCallback = ConsoleLuaLibrary.LogOutput
|
||||||
|
};
|
||||||
|
mainmemory.LuaRegister(lua, Docs);
|
||||||
|
|
||||||
new MovieLuaLibrary(_lua).LuaRegister(lua, Docs);
|
new MovieLuaLibrary(_lua).LuaRegister(lua, Docs);
|
||||||
new NesLuaLibrary().LuaRegister(lua, Docs);
|
new NesLuaLibrary().LuaRegister(lua, Docs);
|
||||||
new SavestateLuaLibrary().LuaRegister(lua, Docs);
|
new SavestateLuaLibrary().LuaRegister(lua, Docs);
|
||||||
new SnesLuaLibrary().LuaRegister(lua, Docs);
|
new SnesLuaLibrary().LuaRegister(lua, Docs);
|
||||||
new StringLuaLibrary(_lua).LuaRegister(lua, Docs);
|
new StringLuaLibrary(_lua).LuaRegister(lua, Docs);
|
||||||
new GameInfoLuaLibrary(_lua).LuaRegister(lua, Docs);
|
new GameInfoLuaLibrary(_lua).LuaRegister(lua, Docs);
|
||||||
|
|
||||||
Docs.Sort();
|
Docs.Sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue