diff --git a/BizHawk.Client.Common/BizHawk.Client.Common.csproj b/BizHawk.Client.Common/BizHawk.Client.Common.csproj
index e4302a372d..bfecd134be 100644
--- a/BizHawk.Client.Common/BizHawk.Client.Common.csproj
+++ b/BizHawk.Client.Common/BizHawk.Client.Common.csproj
@@ -118,6 +118,7 @@
+
diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs
index 17170bb10e..698ce2c53e 100644
--- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs
+++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs
@@ -1,4 +1,5 @@
using System;
+
namespace BizHawk.Client.Common
{
public class BitLuaLibrary : LuaLibraryBase
@@ -28,74 +29,130 @@ namespace BizHawk.Client.Common
}
}
+ [LuaMethodAttributes(
+ "band",
+ "Bitwise AND of 'val' against 'amt'"
+ )]
public static uint Band(object val, object amt)
{
return (uint)(LuaInt(val) & LuaInt(amt));
}
+ [LuaMethodAttributes(
+ "bnot",
+ "Bitwise NOT of 'val' against 'amt'"
+ )]
public static uint Bnot(object val)
{
return (uint)(~LuaInt(val));
}
+ [LuaMethodAttributes(
+ "bor",
+ "Bitwise OR of 'val' against 'amt'"
+ )]
public static uint Bor(object val, object amt)
{
return (uint)(LuaInt(val) | LuaInt(amt));
}
+ [LuaMethodAttributes(
+ "bxor",
+ "Bitwise XOR of 'val' against 'amt'"
+ )]
public static uint Bxor(object val, object amt)
{
return (uint)(LuaInt(val) ^ LuaInt(amt));
}
+ [LuaMethodAttributes(
+ "lshift",
+ "Logical shift left of 'val' by 'amt' bits"
+ )]
public static uint Lshift(object val, object amt)
{
return (uint)(LuaInt(val) << LuaInt(amt));
}
+ [LuaMethodAttributes(
+ "rol",
+ "Left rotate 'val' by 'amt' bits"
+ )]
public static uint Rol(object val, object amt)
{
return (uint)((LuaInt(val) << LuaInt(amt))
| (LuaInt(val) >> (32 - LuaInt(amt))));
}
+ [LuaMethodAttributes(
+ "ror",
+ "Right rotate 'val' by 'amt' bits"
+ )]
public static uint Ror(object val, object amt)
{
return (uint)((LuaInt(val) >> LuaInt(amt))
| (LuaInt(val) << (32 - LuaInt(amt))));
}
+ [LuaMethodAttributes(
+ "rshift",
+ "Logical shift right of 'val' by 'amt' bits"
+ )]
public static uint Rshift(object val, object amt)
{
return (uint)(LuaInt(val) >> LuaInt(amt));
}
+ [LuaMethodAttributes(
+ "check",
+ "Returns result of bit 'pos' being set in 'num'"
+ )]
public static bool Check(object num, object pos)
{
return (LuaLong(num) & (1 << LuaInt(pos))) != 0;
}
-
+
+ [LuaMethodAttributes(
+ "set",
+ "TODO"
+ )]
public static uint Set(object num, object pos)
{
return (uint)(LuaInt(num) | 1 << LuaInt(pos));
}
+ [LuaMethodAttributes(
+ "clear",
+ "TODO"
+ )]
public static uint Clear(object num, object pos)
{
return (uint)(LuaInt(num) & ~(1 << LuaInt(pos)));
}
+ [LuaMethodAttributes(
+ "byteswap_16",
+ "Byte swaps 'short', i.e. bit.byteswap_16(0xFF00) would return 0x00FF"
+ )]
public static uint Byteswap_16(object _short)
{
return (UInt16)((LuaInt(_short) & 0xFFU) << 8 | (LuaInt(_short) & 0xFF00U) >> 8);
}
+ [LuaMethodAttributes(
+ "byteswap_32",
+ "Byte swaps 'dword'"
+ )]
public static uint Byteswap_32(object _dword)
{
return (LuaUInt(_dword) & 0x000000FFU) << 24 | (LuaUInt(_dword) & 0x0000FF00U) << 8 |
(LuaUInt(_dword) & 0x00FF0000U) >> 8 | (LuaUInt(_dword) & 0xFF000000U) >> 24;
}
+ [LuaMethodAttributes(
+ "byteswap_64",
+ "Byte swaps 'long'"
+ )]
public static UInt64 Byteswap_64(object _long)
{
UInt64 value = (UInt64)LuaLong(_long);
diff --git a/BizHawk.Client.Common/lua/LuaDocumentation.cs b/BizHawk.Client.Common/lua/LuaDocumentation.cs
index e6d7c3a206..71f77aaef3 100644
--- a/BizHawk.Client.Common/lua/LuaDocumentation.cs
+++ b/BizHawk.Client.Common/lua/LuaDocumentation.cs
@@ -7,17 +7,19 @@ namespace BizHawk.Client.Common
{
public interface ILuaDocumentation
{
- void Add(string method_lib, string method_name, System.Reflection.MethodInfo method);
+ void Add(string method_lib, string method_name, System.Reflection.MethodInfo method, string description);
}
public class LuaDocumentation : ILuaDocumentation
{
public List FunctionList = new List();
- public void Add(string method_lib, string method_name, System.Reflection.MethodInfo method)
+ public void Add(string method_lib, string method_name, System.Reflection.MethodInfo method, string description)
{
var f = new LibraryFunction(method_lib, method_name, method);
FunctionList.Add(f);
+
+ // TODO: use description;
}
public void Clear()
diff --git a/BizHawk.Client.Common/lua/LuaLibraryBase.cs b/BizHawk.Client.Common/lua/LuaLibraryBase.cs
index a56cc2bc52..91654caddf 100644
--- a/BizHawk.Client.Common/lua/LuaLibraryBase.cs
+++ b/BizHawk.Client.Common/lua/LuaLibraryBase.cs
@@ -1,4 +1,6 @@
using System;
+using System.Collections.Generic;
+using System.Linq;
using System.Reflection;
using BizHawk.Common;
@@ -22,7 +24,7 @@ namespace BizHawk.Client.Common
if (docs != null)
{
- docs.Add(Name, methodName, method);
+ docs.Add(Name, methodName, method, String.Empty);
}
}
}
@@ -32,15 +34,21 @@ namespace BizHawk.Client.Common
{
lua.NewTable(Name);
- foreach (var nameLookup in Functions)
+ var luaAttr = typeof(LuaMethodAttributes);
+
+ var methods = GetType()
+ .GetMethods()
+ .Where(m => m.GetCustomAttributes(luaAttr, false).Any());
+
+ foreach (var method in methods)
{
- var luaMethodName = Name + "." + nameLookup.ToLower();
- var actualMethodName = GetType().GetMethod(nameLookup);
- lua.RegisterFunction(luaMethodName, this, actualMethodName);
+ var luaMethodAttr = method.GetCustomAttributes(luaAttr, false).First() as LuaMethodAttributes;
+ var luaName = Name + "." + luaMethodAttr.Name;
+ lua.RegisterFunction(luaName, this, method);
if (docs != null)
{
- docs.Add(Name, nameLookup, actualMethodName);
+ docs.Add(Name, luaName, method, luaMethodAttr.Description);
}
}
}