From 6683f9f5eb90703c4242935b261dc2419fc6b276 Mon Sep 17 00:00:00 2001 From: Christopher Date: Fri, 7 Aug 2020 11:39:22 +0200 Subject: [PATCH] add lua dll --- KeraLua.dll | Bin 0 -> 30720 bytes NLua.dll | Bin 0 -> 84992 bytes lua54.dll | Bin 0 -> 443392 bytes prebuild.xml | 4 + src/LUA/CheckType.cs | 406 ---- src/LUA/Event/DebugHookEventArgs.cs | 21 - src/LUA/Event/HookExceptionEventArgs.cs | 14 - src/LUA/Exceptions/LuaException.cs | 20 - src/LUA/Exceptions/LuaScriptException.cs | 52 - src/LUA/Extensions/LuaExtensions.cs | 122 -- src/LUA/Extensions/StringExtensions.cs | 31 - src/LUA/Extensions/TypeExtensions.cs | 137 -- .../GenerateEventAssembly/ClassGenerator.cs | 22 - .../GenerateEventAssembly/CodeGeneration.cs | 752 -------- .../DelegateGenerator.cs | 22 - .../ILuaGeneratedType.cs | 11 - src/LUA/GenerateEventAssembly/LuaClassType.cs | 15 - src/LUA/Lua.cs | 1262 ------------- src/LUA/LuaBase.cs | 86 - src/LUA/LuaFunction.cs | 91 - src/LUA/LuaGlobalAttribute.cs | 23 - src/LUA/LuaHideAttribute.cs | 12 - src/LUA/LuaRegistrationHelper.cs | 98 - src/LUA/LuaTable.cs | 120 -- src/LUA/LuaUserData.cs | 74 - src/LUA/Metatables.cs | 1636 ----------------- src/LUA/Method/EventHandlerContainer.cs | 36 - src/LUA/Method/LuaClassHelper.cs | 55 - src/LUA/Method/LuaDelegate.cs | 47 - src/LUA/Method/LuaEventHandler.cs | 12 - src/LUA/Method/LuaMethodWrapper.cs | 355 ---- src/LUA/Method/MethodArgs.cs | 18 - src/LUA/Method/MethodCache.cs | 42 - src/LUA/Method/RegisterEventHandler.cs | 53 - src/LUA/ObjectTranslator.cs | 1171 ------------ src/LUA/ObjectTranslatorPool.cs | 44 - src/LUA/Properties/AssemblyInfo.cs | 39 - src/LUA/ProxyType.cs | 53 - src/LUAEngine.cs | 76 +- src/RunningScript.cs | 23 + 40 files changed, 83 insertions(+), 6972 deletions(-) create mode 100644 KeraLua.dll create mode 100644 NLua.dll create mode 100644 lua54.dll delete mode 100644 src/LUA/CheckType.cs delete mode 100644 src/LUA/Event/DebugHookEventArgs.cs delete mode 100644 src/LUA/Event/HookExceptionEventArgs.cs delete mode 100644 src/LUA/Exceptions/LuaException.cs delete mode 100644 src/LUA/Exceptions/LuaScriptException.cs delete mode 100644 src/LUA/Extensions/LuaExtensions.cs delete mode 100644 src/LUA/Extensions/StringExtensions.cs delete mode 100644 src/LUA/Extensions/TypeExtensions.cs delete mode 100644 src/LUA/GenerateEventAssembly/ClassGenerator.cs delete mode 100644 src/LUA/GenerateEventAssembly/CodeGeneration.cs delete mode 100644 src/LUA/GenerateEventAssembly/DelegateGenerator.cs delete mode 100644 src/LUA/GenerateEventAssembly/ILuaGeneratedType.cs delete mode 100644 src/LUA/GenerateEventAssembly/LuaClassType.cs delete mode 100644 src/LUA/Lua.cs delete mode 100644 src/LUA/LuaBase.cs delete mode 100644 src/LUA/LuaFunction.cs delete mode 100644 src/LUA/LuaGlobalAttribute.cs delete mode 100644 src/LUA/LuaHideAttribute.cs delete mode 100644 src/LUA/LuaRegistrationHelper.cs delete mode 100644 src/LUA/LuaTable.cs delete mode 100644 src/LUA/LuaUserData.cs delete mode 100644 src/LUA/Metatables.cs delete mode 100644 src/LUA/Method/EventHandlerContainer.cs delete mode 100644 src/LUA/Method/LuaClassHelper.cs delete mode 100644 src/LUA/Method/LuaDelegate.cs delete mode 100644 src/LUA/Method/LuaEventHandler.cs delete mode 100644 src/LUA/Method/LuaMethodWrapper.cs delete mode 100644 src/LUA/Method/MethodArgs.cs delete mode 100644 src/LUA/Method/MethodCache.cs delete mode 100644 src/LUA/Method/RegisterEventHandler.cs delete mode 100644 src/LUA/ObjectTranslator.cs delete mode 100644 src/LUA/ObjectTranslatorPool.cs delete mode 100644 src/LUA/Properties/AssemblyInfo.cs delete mode 100644 src/LUA/ProxyType.cs create mode 100644 src/RunningScript.cs diff --git a/KeraLua.dll b/KeraLua.dll new file mode 100644 index 0000000000000000000000000000000000000000..32095484492fe549ae9f47fc7519791220ff5274 GIT binary patch literal 30720 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�_HKJ6?KJ2xbu-Xz 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

&Sp* zX8!%}$|DKoA2R>`C-%q3i6l8N;jmLs?T?SzW0Dl{|B5|!muTLh{_>ap2lnaVMbe7k z$J4@yBa-GoA%2e6m$lxh%v9 zWFa1x%R)Rt641XX>9X22Sq;1CDnHM-rD)%G_jeJakiN=3PLM9Q&=kC^h zAB1vdl55s)MFKSuNy;t7xJ!FB6eQ(Nl@!DtP0IbO)q^|h-?&r01OAOW+<&Zjd{udR z28p<5ccvDn6q5T8I z%m2)^f8*Mnx3ZwRppuCBU0jjdXjWn#c^M-oKn$A$h1|L|gJlH&bM>afq&%`>lzE;7 zoCSnTNOU1~{Be2FaBjcxaL-E2?cN=bu<=Inp?w;-;r(4>a)v_CN8pCF%mw}FnMJZZ za!3kv@#2$YFv@!urG_hUh3dQqbh)?nEcTD-#;8h(2#t}1Jo`UKJAe(;p?QPHk`zeR zUq0#Ymr7YA!DbVBy*DJ zHb2yQguDlB8Rrj>!8nNOd>!Z6>;W6(yVkP#ru40U(%W)!$y>!b{0#Se7T<(7jv7)Y zSyPI&BT_C=Nju+F;URm^>iPA36-O9&rHM+$y)FN+nO|$nL-1r~M8e6g39ROQPJzq5 z9U&9)UO+fK;Q=LNUqyq`%BMD$2_f)i9Q49t)IyeA2gtU zYf)}XQGI?(5%h$Rq1F?Gj-MU^kV>uN<@OcN<_WeDbh#f1x1JicE%v9HZAj9ch@H`4 z;E>7qL>Z=0xnaVMH-NS)pd7*m&S_D*eh3`0KYN0Eh33wNsDHsfAone`h&2tM8cs~l z<{e9Yl6HHRRV1R&zRxeKcY3Hx@2WrxRo+uE@1tl&PA9yRq2iheD?S+S#NxFhdlB*+ z{$gLOU6S1;$?*Ij|%@%ba4HQzwY@$qoK>6@;= zXAyf>^ZC;)oCClITT0fES;Uu&daswH`r+k9zv+1n=r}o_VZ;ldFNw*lKDzxku7Oiz zo5***MK(b1g`8rU?DDZu>slRbSk&Kf2}P**>`v*HH@!kvUs;Wob>;Y}R;g}u-#0>r zkNsFCYnt*?RD82hjcZ#eEfuX&=$okE`~xabdYbGg8qm162*nVnwemWvGeF@A1~r8w zuQWMY))@F^Fn=03SaEQ+k%RS>Vf!a$Gk~)RM7C+oo;W|ewVot|^+O(6Wiv_USV1C2 z`@?iv6bN7DtfEZVB;;jggLD|5l@4bv;QAC53EJ~9EFy>PQiHxGOwXPosGB6b>ahI_ zBe?Q8YEX)|28Y6=B&6nX4iTXNcG|IDl?(X9!FaWQd>_g8aeU6?b26W6 z_%O!0)5v+frdx6}ME|nQhy+`+&B(pbq}c9U?QAq^3v@1$jYh@IzC~;^BG)pXYdlE-}`b?rVI&Y!yZ$Qc`weekWg6^elOdQ}QOW zRb~>1lADW3ttni;k6C51em`$Ydv|ds+L@hTvTsP%OI8|QMqZeV?~Lp+UCzv4yv;6C zO=Bge{}tUyU!a^vIH=?@<@4kuwczp}nS4^Rbs$Wrr&f(`dzReJ|1yABhp_Xv#T+YKVEg#&{xoC^i9LX6R=bcZHoaHS@kt~)BPqp;~qJbwEM*(F_ zS5{Al%T~Rzld$7m>G?(7uUD4uNF9|tFgkt~nO#$4dssG$Ey~(tnRR|X;X)UiY z?Q35b%hkQPyWh+E>Rhh&>%4Q_*jUc~k>Q-*tJ-dSrr!T(J?}oE7P-3qOjY5}QJHatKSyUq6#itM+@ohy zR1BJui@k-WBr0j)mMg#O3asPv7d}t&xr5KI`8>iWH@?ljh^*ty5O#5qupuGs(bh#b z59kJi-1>)`r9`4o?eEtoj~fdILDL;wo#8kGWa{=g3~qc3?d8;?thID?Y*-N#r+j<4k@ zDnKjYDeupeq*oWY*#KNY@b5AyC2vKAc`*^(SeRAM4N0?`s4l#MbN9-M_kJhME>*

sI9SQ4fw*JhzL3bv=Qa@+? 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

9H) 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

  • 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 l%{+TN9L9}o{${b8m + + + + diff --git a/src/LUA/CheckType.cs b/src/LUA/CheckType.cs deleted file mode 100644 index 67d3234..0000000 --- a/src/LUA/CheckType.cs +++ /dev/null @@ -1,406 +0,0 @@ -using System; -using System.Collections.Generic; -using KeraLua; -using NLua.Method; -using NLua.Extensions; - -namespace NLua -{ - using LuaState = KeraLua.Lua; - sealed class CheckType - { - readonly Dictionary _extractValues = new Dictionary(); - readonly ExtractValue _extractNetObject; - readonly ObjectTranslator _translator; - - public CheckType(ObjectTranslator translator) - { - _translator = translator; - _extractValues.Add(typeof(object), GetAsObject); - _extractValues.Add(typeof(sbyte), GetAsSbyte); - _extractValues.Add(typeof(byte), GetAsByte); - _extractValues.Add(typeof(short), GetAsShort); - _extractValues.Add(typeof(ushort), GetAsUshort); - _extractValues.Add(typeof(int), GetAsInt); - _extractValues.Add(typeof(uint), GetAsUint); - _extractValues.Add(typeof(long), GetAsLong); - _extractValues.Add(typeof(ulong), GetAsUlong); - _extractValues.Add(typeof(double), GetAsDouble); - _extractValues.Add(typeof(char), GetAsChar); - _extractValues.Add(typeof(float), GetAsFloat); - _extractValues.Add(typeof(decimal), GetAsDecimal); - _extractValues.Add(typeof(bool), GetAsBoolean); - _extractValues.Add(typeof(string), GetAsString); - _extractValues.Add(typeof(char[]), GetAsCharArray); - _extractValues.Add(typeof(byte[]), GetAsByteArray); - _extractValues.Add(typeof(LuaFunction), GetAsFunction); - _extractValues.Add(typeof(LuaTable), GetAsTable); - _extractValues.Add(typeof(LuaUserData), GetAsUserdata); - _extractNetObject = GetAsNetObject; - } - - /* - * Checks if the value at Lua stack index stackPos matches paramType, - * returning a conversion function if it does and null otherwise. - */ - internal ExtractValue GetExtractor(ProxyType paramType) - { - return GetExtractor(paramType.UnderlyingSystemType); - } - - internal ExtractValue GetExtractor(Type paramType) - { - if (paramType.IsByRef) - paramType = paramType.GetElementType(); - - return _extractValues.ContainsKey(paramType) ? _extractValues[paramType] : _extractNetObject; - } - - internal ExtractValue CheckLuaType(LuaState luaState, int stackPos, Type paramType) - { - LuaType luatype = luaState.Type(stackPos); - - if (paramType.IsByRef) - paramType = paramType.GetElementType(); - - var underlyingType = Nullable.GetUnderlyingType(paramType); - - if (underlyingType != null) - { - paramType = underlyingType; // Silently convert nullable types to their non null requics - } - - - bool netParamIsNumeric = paramType == typeof(int) || - paramType == typeof(uint) || - paramType == typeof(long) || - paramType == typeof(ulong) || - paramType == typeof(short) || - paramType == typeof(ushort) || - paramType == typeof(float) || - paramType == typeof(double) || - paramType == typeof(decimal) || - paramType == typeof(byte); - - // If it is a nullable - if (underlyingType != null) - { - // null can always be assigned to nullable - if (luatype == LuaType.Nil) - { - // Return the correct extractor anyways - if (netParamIsNumeric || paramType == typeof(bool)) - return _extractValues[paramType]; - return _extractNetObject; - } - } - - if (paramType == typeof(object)) - return _extractValues[paramType]; - - //CP: Added support for generic parameters - if (paramType.IsGenericParameter) - { - if (luatype == LuaType.Boolean) - return _extractValues[typeof(bool)]; - if (luatype == LuaType.String) - return _extractValues[typeof(string)]; - if (luatype == LuaType.Table) - return _extractValues[typeof(LuaTable)]; - if (luatype == LuaType.UserData) - return _extractValues[typeof(object)]; - if (luatype == LuaType.Function) - return _extractValues[typeof(LuaFunction)]; - if (luatype == LuaType.Number) - return _extractValues[typeof(double)]; - } - bool netParamIsString = paramType == typeof(string) || paramType == typeof(char[]) || paramType == typeof(byte[]); - - if (netParamIsNumeric) - { - if (luaState.IsNumber(stackPos) && !netParamIsString) - return _extractValues[paramType]; - } - else if (paramType == typeof(bool)) - { - if (luaState.IsBoolean(stackPos)) - return _extractValues[paramType]; - } - else if (netParamIsString) - { - if (luaState.IsString(stackPos)) - return _extractValues[paramType]; - if (luatype == LuaType.Nil) - return _extractNetObject; // kevinh - silently convert nil to a null string pointer - } - else if (paramType == typeof(LuaTable)) - { - if (luatype == LuaType.Table || luatype == LuaType.Nil) - return _extractValues[paramType]; - } - else if (paramType == typeof(LuaUserData)) - { - if (luatype == LuaType.UserData || luatype == LuaType.Nil) - return _extractValues[paramType]; - } - else if (paramType == typeof(LuaFunction)) - { - if (luatype == LuaType.Function || luatype == LuaType.Nil) - return _extractValues[paramType]; - } - else if (typeof(Delegate).IsAssignableFrom(paramType) && luatype == LuaType.Function && paramType.GetMethod("Invoke") != null) - return new DelegateGenerator(_translator, paramType).ExtractGenerated; - else if (paramType.IsInterface && luatype == LuaType.Table) - return new ClassGenerator(_translator, paramType).ExtractGenerated; - else if ((paramType.IsInterface || paramType.IsClass) && luatype == LuaType.Nil) - { - // kevinh - allow nil to be silently converted to null - extractNetObject will return null when the item ain't found - return _extractNetObject; - } - else if (luaState.Type(stackPos) == LuaType.Table) - { - if (luaState.GetMetaField(stackPos, "__index") != LuaType.Nil) - { - object obj = _translator.GetNetObject(luaState, -1); - luaState.SetTop(-2); - if (obj != null && paramType.IsInstanceOfType(obj)) - return _extractNetObject; - } - else - return null; - } - else - { - object obj = _translator.GetNetObject(luaState, stackPos); - if (obj != null && paramType.IsInstanceOfType(obj)) - return _extractNetObject; - } - - return null; - } - - - /* - * The following functions return the value in the Lua stack - * index stackPos as the desired type if it can, or null - * otherwise. - */ - private object GetAsSbyte(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (sbyte)luaState.ToInteger(stackPos); - - return (sbyte)luaState.ToNumber(stackPos); - } - - private object GetAsByte(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (byte)luaState.ToInteger(stackPos); - - return (byte)luaState.ToNumber(stackPos); - } - - private object GetAsShort(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (short)luaState.ToInteger(stackPos); - - return (short)luaState.ToNumber(stackPos); - } - - private object GetAsUshort(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (ushort)luaState.ToInteger(stackPos); - - return (ushort)luaState.ToNumber(stackPos); - } - - private object GetAsInt(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (int)luaState.ToInteger(stackPos); - - return (int)luaState.ToNumber(stackPos); - } - - private object GetAsUint(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (uint)luaState.ToInteger(stackPos); - - return (uint)luaState.ToNumber(stackPos); - } - - private object GetAsLong(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return luaState.ToInteger(stackPos); - - return (long)luaState.ToNumber(stackPos); - } - - private object GetAsUlong(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (ulong)luaState.ToInteger(stackPos); - - return (ulong)luaState.ToNumber(stackPos); - } - - private object GetAsDouble(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (double)luaState.ToInteger(stackPos); - - return luaState.ToNumber(stackPos); - } - - private object GetAsChar(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (char)luaState.ToInteger(stackPos); - - return (char)luaState.ToNumber(stackPos); - } - - private object GetAsFloat(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (float)luaState.ToInteger(stackPos); - - return (float)luaState.ToNumber(stackPos); - } - - private object GetAsDecimal(LuaState luaState, int stackPos) - { - if (!luaState.IsNumericType(stackPos)) - return null; - - if (luaState.IsInteger(stackPos)) - return (decimal)luaState.ToInteger(stackPos); - - return (decimal)luaState.ToNumber(stackPos); - } - - private object GetAsBoolean(LuaState luaState, int stackPos) - { - return luaState.ToBoolean(stackPos); - } - - private object GetAsCharArray(LuaState luaState, int stackPos) - { - if (!luaState.IsString(stackPos)) - return null; - string retVal = luaState.ToString(stackPos, false); - return retVal.ToCharArray(); - } - - private object GetAsByteArray(LuaState luaState, int stackPos) - { - if (!luaState.IsString(stackPos)) - return null; - - byte [] retVal = luaState.ToBuffer(stackPos, false); - return retVal; - } - - private object GetAsString(LuaState luaState, int stackPos) - { - if (!luaState.IsString(stackPos)) - return null; - return luaState.ToString(stackPos, false); - } - - private object GetAsTable(LuaState luaState, int stackPos) - { - return _translator.GetTable(luaState, stackPos); - } - - private object GetAsFunction(LuaState luaState, int stackPos) - { - return _translator.GetFunction(luaState, stackPos); - } - - private object GetAsUserdata(LuaState luaState, int stackPos) - { - return _translator.GetUserData(luaState, stackPos); - } - - public object GetAsObject(LuaState luaState, int stackPos) - { - if (luaState.Type(stackPos) == LuaType.Table) - { - if (luaState.GetMetaField(stackPos, "__index") != LuaType.Nil) - { - if (luaState.CheckMetaTable(-1, _translator.Tag)) - { - luaState.Insert(stackPos); - luaState.Remove(stackPos + 1); - } - else - luaState.SetTop(-2); - } - } - - object obj = _translator.GetObject(luaState, stackPos); - return obj; - } - - public object GetAsNetObject(LuaState luaState, int stackPos) - { - object obj = _translator.GetNetObject(luaState, stackPos); - - if (obj != null || luaState.Type(stackPos) != LuaType.Table) - return obj; - - if (luaState.GetMetaField(stackPos, "__index") == LuaType.Nil) - return null; - - if (luaState.CheckMetaTable(-1, _translator.Tag)) - { - luaState.Insert(stackPos); - luaState.Remove(stackPos + 1); - obj = _translator.GetNetObject(luaState, stackPos); - } - else - luaState.SetTop(-2); - - return obj; - } - } -} diff --git a/src/LUA/Event/DebugHookEventArgs.cs b/src/LUA/Event/DebugHookEventArgs.cs deleted file mode 100644 index 6c75583..0000000 --- a/src/LUA/Event/DebugHookEventArgs.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using KeraLua; - -namespace NLua.Event -{ - /// - /// Event args for hook callback event - /// - public class DebugHookEventArgs : EventArgs - { - public DebugHookEventArgs(LuaDebug luaDebug) - { - LuaDebug = luaDebug; - } - - /// - /// Lua Debug Information - /// - public LuaDebug LuaDebug { get; } - } -} \ No newline at end of file diff --git a/src/LUA/Event/HookExceptionEventArgs.cs b/src/LUA/Event/HookExceptionEventArgs.cs deleted file mode 100644 index a38b11a..0000000 --- a/src/LUA/Event/HookExceptionEventArgs.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace NLua.Event -{ - public class HookExceptionEventArgs : EventArgs - { - public Exception Exception { get; } - - public HookExceptionEventArgs(Exception ex) - { - Exception = ex; - } - } -} \ No newline at end of file diff --git a/src/LUA/Exceptions/LuaException.cs b/src/LUA/Exceptions/LuaException.cs deleted file mode 100644 index a157f68..0000000 --- a/src/LUA/Exceptions/LuaException.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace NLua.Exceptions -{ - /// - /// Exceptions thrown by the Lua runtime - /// - [Serializable] - public class LuaException : Exception - { - public LuaException (string message) : base(message) - { - } - - public LuaException (string message, Exception innerException) : base(message, innerException) - { - } - - } -} \ No newline at end of file diff --git a/src/LUA/Exceptions/LuaScriptException.cs b/src/LUA/Exceptions/LuaScriptException.cs deleted file mode 100644 index 1045ca6..0000000 --- a/src/LUA/Exceptions/LuaScriptException.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; - -namespace NLua.Exceptions -{ - /// - /// Exceptions thrown by the Lua runtime because of errors in the script - /// - /// - [Serializable] - public class LuaScriptException : LuaException - { - /// - /// Returns true if the exception has occured as the result of a .NET exception in user code - /// - public bool IsNetException { get; } - - private readonly string _source; - - /// - /// The position in the script where the exception was triggered. - /// - public override string Source => _source; - - /// - /// Creates a new Lua-only exception. - /// - /// The message that describes the error. - /// The position in the script where the exception was triggered. - public LuaScriptException(string message, string source) : base(message) - { - _source = source; - } - - /// - /// Creates a new .NET wrapping exception. - /// - /// The .NET exception triggered by user-code. - /// The position in the script where the exception was triggered. - public LuaScriptException(Exception innerException, string source) - : base("A .NET exception occured in user-code", innerException) - { - _source = source; - IsNetException = true; - } - - public override string ToString() - { - // Prepend the error source - return GetType().FullName + ": " + _source + Message; - } - } -} \ No newline at end of file diff --git a/src/LUA/Extensions/LuaExtensions.cs b/src/LUA/Extensions/LuaExtensions.cs deleted file mode 100644 index 92ae177..0000000 --- a/src/LUA/Extensions/LuaExtensions.cs +++ /dev/null @@ -1,122 +0,0 @@ - -using System; -using System.Runtime.InteropServices; -using KeraLua; -using LuaState=KeraLua.Lua; - -namespace NLua.Extensions -{ - static class LuaExtensions - { - public static bool CheckMetaTable(this LuaState state, int index, IntPtr tag) - { - if (!state.GetMetaTable(index)) - return false; - - state.PushLightUserData(tag); - state.RawGet(-2); - bool isNotNil = !state.IsNil(-1); - state.SetTop(-3); - return isNotNil; - } - - public static void PopGlobalTable(this LuaState luaState) - { - luaState.RawSetInteger(LuaRegistry.Index, (long) LuaRegistryIndex.Globals); - } - - public static void GetRef (this LuaState luaState, int reference) - { - luaState.RawGetInteger(LuaRegistry.Index, reference); - } - - // ReSharper disable once IdentifierTypo - public static void Unref (this LuaState luaState, int reference) - { - luaState.Unref(LuaRegistry.Index, reference); - } - - public static bool AreEqual(this LuaState luaState, int ref1, int ref2) - { - return luaState.Compare(ref1, ref2, LuaCompare.Equal); - } - - public static IntPtr CheckUData(this LuaState state, int ud, string name) - { - IntPtr p = state.ToUserData(ud); - if (p == IntPtr.Zero) - return IntPtr.Zero; - if (!state.GetMetaTable(ud)) - return IntPtr.Zero; - - state.GetField(LuaRegistry.Index, name); - - bool isEqual = state.RawEqual(-1, -2); - - state.Pop(2); - - if (isEqual) - return p; - - return IntPtr.Zero; - } - - public static int ToNetObject(this LuaState state, int index, IntPtr tag) - { - if (state.Type(index) != LuaType.UserData) - return -1; - - IntPtr userData; - - if (state.CheckMetaTable(index, tag)) - { - userData = state.ToUserData(index); - if (userData != IntPtr.Zero) - return Marshal.ReadInt32(userData); - } - - userData = state.CheckUData(index, "luaNet_class"); - if (userData != IntPtr.Zero) - return Marshal.ReadInt32(userData); - - userData = state.CheckUData(index, "luaNet_searchbase"); - if (userData != IntPtr.Zero) - return Marshal.ReadInt32(userData); - - userData = state.CheckUData(index, "luaNet_function"); - if (userData != IntPtr.Zero) - return Marshal.ReadInt32(userData); - - return -1; - } - - public static void NewUData(this LuaState state, int val) - { - IntPtr pointer = state.NewUserData(Marshal.SizeOf(typeof(int))); - Marshal.WriteInt32(pointer, val); - } - - public static int RawNetObj(this LuaState state, int index) - { - IntPtr pointer = state.ToUserData(index); - if (pointer == IntPtr.Zero) - return -1; - - return Marshal.ReadInt32(pointer); - } - - public static int CheckUObject(this LuaState state, int index, string name) - { - IntPtr udata = state.CheckUData(index, name); - if (udata == IntPtr.Zero) - return -1; - - return Marshal.ReadInt32(udata); - } - - public static bool IsNumericType(this LuaState state, int index) - { - return state.Type(index) == LuaType.Number; - } - } -} diff --git a/src/LUA/Extensions/StringExtensions.cs b/src/LUA/Extensions/StringExtensions.cs deleted file mode 100644 index 0f74189..0000000 --- a/src/LUA/Extensions/StringExtensions.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; - -namespace NLua.Extensions -{ - static class StringExtensions - { - public static IEnumerable SplitWithEscape(this string input, char separator, char escapeCharacter) - { - int start = 0; - int index = 0; - while (index < input.Length) - { - index = input.IndexOf(separator, index); - if (index == -1) - break; - - if (input[index - 1] == escapeCharacter) - { - input = input.Remove(index - 1, 1); - continue; - } - - - yield return input.Substring(start, index - start); - index++; - start = index; - } - yield return input.Substring(start); - } - } -} \ No newline at end of file diff --git a/src/LUA/Extensions/TypeExtensions.cs b/src/LUA/Extensions/TypeExtensions.cs deleted file mode 100644 index b88e5bf..0000000 --- a/src/LUA/Extensions/TypeExtensions.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; - -namespace NLua.Extensions -{ - static class TypeExtensions - { - public static bool HasMethod(this Type t, string name) - { - var op = t.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); - return op.Any(m => m.Name == name); - } - - public static bool HasAdditionOperator(this Type t) - { - if (t.IsPrimitive) - return true; - - return t.HasMethod("op_Addition"); - } - - public static bool HasSubtractionOperator(this Type t) - { - if (t.IsPrimitive) - return true; - - return t.HasMethod("op_Subtraction"); - } - - public static bool HasMultiplyOperator(this Type t) - { - if (t.IsPrimitive) - return true; - - return t.HasMethod("op_Multiply"); - } - - public static bool HasDivisionOperator(this Type t) - { - if (t.IsPrimitive) - return true; - - return t.HasMethod("op_Division"); - } - - public static bool HasModulusOperator(this Type t) - { - if (t.IsPrimitive) - return true; - - return t.HasMethod("op_Modulus"); - } - - public static bool HasUnaryNegationOperator(this Type t) - { - if (t.IsPrimitive) - return true; - // Unary - will always have only one version. - var op = t.GetMethod("op_UnaryNegation", BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); - return op != null; - } - - public static bool HasEqualityOperator(this Type t) - { - if (t.IsPrimitive) - return true; - return t.HasMethod("op_Equality"); - } - - public static bool HasLessThanOperator(this Type t) - { - if (t.IsPrimitive) - return true; - - return t.HasMethod("op_LessThan"); - } - - public static bool HasLessThanOrEqualOperator(this Type t) - { - if (t.IsPrimitive) - return true; - return t.HasMethod("op_LessThanOrEqual"); - } - - public static MethodInfo[] GetMethods(this Type t, string name, BindingFlags flags) - { - return t.GetMethods(flags).Where(m => m.Name == name).ToArray(); - } - - public static MethodInfo[] GetExtensionMethods(this Type type, string name, IEnumerable assemblies = null) - { - var types = new List(); - - types.AddRange(type.Assembly.GetTypes().Where(t => t.IsPublic)); - - if (assemblies != null) - { - foreach (Assembly item in assemblies) - { - if (item == type.Assembly) - continue; - types.AddRange(item.GetTypes().Where(t => t.IsPublic && t.IsClass && t.IsSealed && t.IsAbstract && !t.IsNested)); - } - } - - var query = types - .SelectMany(extensionType => extensionType.GetMethods(name, BindingFlags.Static | BindingFlags.Public), - (extensionType, method) => new {extensionType, method}) - .Where(t => t.method.IsDefined(typeof(ExtensionAttribute), false)) - .Where(t => - t.method.GetParameters()[0].ParameterType == type || - t.method.GetParameters()[0].ParameterType.IsAssignableFrom(type) || - type.GetInterfaces().Contains(t.method.GetParameters()[0].ParameterType)) - .Select(t => t.method); - - return query.ToArray(); - } - - /// - /// Extends the System.Type-type to search for a given extended MethodeName. - /// - /// - /// - /// - /// - public static MethodInfo GetExtensionMethod(this Type t, string name, IEnumerable assemblies = null) - { - var mi = t.GetExtensionMethods(name, assemblies).ToArray(); - if (mi.Length == 0) - return null; - return mi[0]; - } - } -} \ No newline at end of file diff --git a/src/LUA/GenerateEventAssembly/ClassGenerator.cs b/src/LUA/GenerateEventAssembly/ClassGenerator.cs deleted file mode 100644 index 4e78279..0000000 --- a/src/LUA/GenerateEventAssembly/ClassGenerator.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using LuaState = KeraLua.Lua; - -namespace NLua -{ - class ClassGenerator - { - private readonly ObjectTranslator _translator; - private readonly Type _klass; - - public ClassGenerator(ObjectTranslator objTranslator, Type typeClass) - { - _translator = objTranslator; - _klass = typeClass; - } - - public object ExtractGenerated(LuaState luaState, int stackPos) - { - return CodeGeneration.Instance.GetClassInstance(_klass, _translator.GetTable(luaState, stackPos)); - } - } -} \ No newline at end of file diff --git a/src/LUA/GenerateEventAssembly/CodeGeneration.cs b/src/LUA/GenerateEventAssembly/CodeGeneration.cs deleted file mode 100644 index 8cac7ac..0000000 --- a/src/LUA/GenerateEventAssembly/CodeGeneration.cs +++ /dev/null @@ -1,752 +0,0 @@ -using System; -using System.Threading; -using System.Reflection; - -using System.Reflection.Emit; -using System.Collections.Generic; -using NLua.Method; - -namespace NLua -{ - class CodeGeneration - { - private readonly Dictionary _classCollection = new Dictionary(); - private readonly Dictionary _delegateCollection = new Dictionary(); - -#if !NETSTANDARD && !WINDOWS_UWP - private Dictionary eventHandlerCollection = new Dictionary(); - private Type eventHandlerParent = typeof(LuaEventHandler); - private Type delegateParent = typeof(LuaDelegate); - private Type classHelper = typeof(LuaClassHelper); - private AssemblyBuilder newAssembly; - private ModuleBuilder newModule; - private int luaClassNumber = 1; -#endif - - static CodeGeneration() - { - } - - private CodeGeneration() - { - // Create an assembly name - var assemblyName = new AssemblyName(); - assemblyName.Name = "NLua_generatedcode"; - // Create a new assembly with one module. -#if NETCOREAPP - newAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); - newModule = newAssembly.DefineDynamicModule("NLua_generatedcode"); -#elif !NETSTANDARD && !WINDOWS_UWP - newAssembly = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); - newModule = newAssembly.DefineDynamicModule("NLua_generatedcode"); -#endif - } - - /* - * Singleton instance of the class - */ - public static CodeGeneration Instance { get; } = new CodeGeneration(); - - /* - * Generates an event handler that calls a Lua function - */ - private Type GenerateEvent(Type eventHandlerType) - { -#if NETSTANDARD || WINDOWS_UWP - throw new NotImplementedException(" Emit not available on .NET Standard "); -#else - string typeName; - lock (this) - { - typeName = "LuaGeneratedClass" + luaClassNumber; - luaClassNumber++; - } - - // Define a public class in the assembly, called typeName - var myType = newModule.DefineType(typeName, TypeAttributes.Public, eventHandlerParent); - - // Defines the handler method. Its signature is void(object, ) - var paramTypes = new Type[2]; - paramTypes[0] = typeof(object); - paramTypes[1] = eventHandlerType; - var returnType = typeof(void); - var handleMethod = myType.DefineMethod("HandleEvent", MethodAttributes.Public | MethodAttributes.HideBySig, returnType, paramTypes); - - // Emits the IL for the method. It loads the arguments - // and calls the handleEvent method of the base class - ILGenerator generator = handleMethod.GetILGenerator(); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldarg_1); - generator.Emit(OpCodes.Ldarg_2); - var miGenericEventHandler = eventHandlerParent.GetMethod("HandleEvent"); - generator.Emit(OpCodes.Call, miGenericEventHandler); - // returns - generator.Emit(OpCodes.Ret); - // creates the new type - return myType.CreateType(); -#endif - } - - /* - * Generates a type that can be used for instantiating a delegate - * of the provided type, given a Lua function. - */ - private Type GenerateDelegate(Type delegateType) - { -#if NETSTANDARD || WINDOWS_UWP - throw new NotImplementedException("GenerateDelegate is not available on Windows Store, please register your LuaDelegate type with Lua.RegisterLuaDelegateType( yourDelegate, theLuaDelegateHandler) "); -#else - string typeName; - lock (this) - { - typeName = "LuaGeneratedClass" + luaClassNumber; - luaClassNumber++; - } - - // Define a public class in the assembly, called typeName - var myType = newModule.DefineType(typeName, TypeAttributes.Public, delegateParent); - - // Defines the delegate method with the same signature as the - // Invoke method of delegateType - var invokeMethod = delegateType.GetMethod("Invoke"); - var paramInfo = invokeMethod.GetParameters(); - var paramTypes = new Type[paramInfo.Length]; - var returnType = invokeMethod.ReturnType; - - // Counts out and ref params, for use later - int nOutParams = 0; - int nOutAndRefParams = 0; - - for (int i = 0; i < paramTypes.Length; i++) - { - paramTypes[i] = paramInfo[i].ParameterType; - - if ((!paramInfo[i].IsIn) && paramInfo[i].IsOut) - nOutParams++; - - if (paramTypes[i].IsByRef) - nOutAndRefParams++; - } - - int[] refArgs = new int[nOutAndRefParams]; - var delegateMethod = myType.DefineMethod("CallFunction", invokeMethod.Attributes, returnType, paramTypes); - - // Generates the IL for the method - ILGenerator generator = delegateMethod.GetILGenerator(); - generator.DeclareLocal(typeof(object[])); // original arguments - generator.DeclareLocal(typeof(object[])); // with out-only arguments removed - generator.DeclareLocal(typeof(int[])); // indexes of out and ref arguments - - if (!(returnType == typeof(void))) // return value - generator.DeclareLocal(returnType); - else - generator.DeclareLocal(typeof(object)); - - // Initializes local variables - generator.Emit(OpCodes.Ldc_I4, paramTypes.Length); - generator.Emit(OpCodes.Newarr, typeof(object)); - generator.Emit(OpCodes.Stloc_0); - generator.Emit(OpCodes.Ldc_I4, paramTypes.Length - nOutParams); - generator.Emit(OpCodes.Newarr, typeof(object)); - generator.Emit(OpCodes.Stloc_1); - generator.Emit(OpCodes.Ldc_I4, nOutAndRefParams); - generator.Emit(OpCodes.Newarr, typeof(int)); - generator.Emit(OpCodes.Stloc_2); - - // Stores the arguments in the local variables - for (int iArgs = 0, iInArgs = 0, iOutArgs = 0; iArgs < paramTypes.Length; iArgs++) - { - generator.Emit(OpCodes.Ldloc_0); - generator.Emit(OpCodes.Ldc_I4, iArgs); - generator.Emit(OpCodes.Ldarg, iArgs + 1); - - if (paramTypes[iArgs].IsByRef) - { - if (paramTypes[iArgs].GetElementType().IsValueType) - { - generator.Emit(OpCodes.Ldobj, paramTypes[iArgs].GetElementType()); - generator.Emit(OpCodes.Box, paramTypes[iArgs].GetElementType()); - } - else - generator.Emit(OpCodes.Ldind_Ref); - } - else - { - if (paramTypes[iArgs].IsValueType) - generator.Emit(OpCodes.Box, paramTypes[iArgs]); - } - - generator.Emit(OpCodes.Stelem_Ref); - - if (paramTypes[iArgs].IsByRef) - { - generator.Emit(OpCodes.Ldloc_2); - generator.Emit(OpCodes.Ldc_I4, iOutArgs); - generator.Emit(OpCodes.Ldc_I4, iArgs); - generator.Emit(OpCodes.Stelem_I4); - refArgs[iOutArgs] = iArgs; - iOutArgs++; - } - - if (paramInfo[iArgs].IsIn || (!paramInfo[iArgs].IsOut)) - { - generator.Emit(OpCodes.Ldloc_1); - generator.Emit(OpCodes.Ldc_I4, iInArgs); - generator.Emit(OpCodes.Ldarg, iArgs + 1); - - if (paramTypes[iArgs].IsByRef) - { - if (paramTypes[iArgs].GetElementType().IsValueType) - { - generator.Emit(OpCodes.Ldobj, paramTypes[iArgs].GetElementType()); - generator.Emit(OpCodes.Box, paramTypes[iArgs].GetElementType()); - } - else - generator.Emit(OpCodes.Ldind_Ref); - } - else - { - if (paramTypes[iArgs].IsValueType) - generator.Emit(OpCodes.Box, paramTypes[iArgs]); - } - - generator.Emit(OpCodes.Stelem_Ref); - iInArgs++; - } - } - - // Calls the callFunction method of the base class - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldloc_0); - generator.Emit(OpCodes.Ldloc_1); - generator.Emit(OpCodes.Ldloc_2); - var miGenericEventHandler = delegateParent.GetMethod("CallFunction"); - generator.Emit(OpCodes.Call, miGenericEventHandler); - - // Stores return value - if (returnType == typeof(void)) - { - generator.Emit(OpCodes.Pop); - generator.Emit(OpCodes.Ldnull); - } - else if (returnType.IsValueType) - { - generator.Emit(OpCodes.Unbox, returnType); - generator.Emit(OpCodes.Ldobj, returnType); - } - else - generator.Emit(OpCodes.Castclass, returnType); - - generator.Emit(OpCodes.Stloc_3); - - // Stores new value of out and ref params - for (int i = 0; i < refArgs.Length; i++) - { - generator.Emit(OpCodes.Ldarg, refArgs[i] + 1); - generator.Emit(OpCodes.Ldloc_0); - generator.Emit(OpCodes.Ldc_I4, refArgs[i]); - generator.Emit(OpCodes.Ldelem_Ref); - - if (paramTypes[refArgs[i]].GetElementType().IsValueType) - { - generator.Emit(OpCodes.Unbox, paramTypes[refArgs[i]].GetElementType()); - generator.Emit(OpCodes.Ldobj, paramTypes[refArgs[i]].GetElementType()); - generator.Emit(OpCodes.Stobj, paramTypes[refArgs[i]].GetElementType()); - } - else - { - generator.Emit(OpCodes.Castclass, paramTypes[refArgs[i]].GetElementType()); - generator.Emit(OpCodes.Stind_Ref); - } - } - - // Returns - if (!(returnType == typeof(void))) - generator.Emit(OpCodes.Ldloc_3); - - generator.Emit(OpCodes.Ret); - return myType.CreateType(); // creates the new type -#endif - } - - void GetReturnTypesFromClass(Type klass, out Type[][] returnTypes) - { - var classMethods = klass.GetMethods(); - returnTypes = new Type[classMethods.Length][]; - - int i = 0; - - foreach (var method in classMethods) - { - if (klass.IsInterface) - { - GetReturnTypesFromMethod(method, out returnTypes[i]); - i++; - } - else if (!method.IsPrivate && !method.IsFinal && method.IsVirtual) - { - GetReturnTypesFromMethod(method, out returnTypes[i]); - i++; - } - } - } - - /* - * Generates an implementation of klass, if it is an interface, or - * a subclass of klass that delegates its virtual methods to a Lua table. - */ - public void GenerateClass(Type klass, out Type newType, out Type[][] returnTypes) - { - -#if NETSTANDARD || WINDOWS_UWP - throw new NotImplementedException (" Emit not available on .NET Standard "); -#else - string typeName; - lock (this) - { - typeName = "LuaGeneratedClass" + luaClassNumber; - luaClassNumber++; - } - - TypeBuilder myType; - // Define a public class in the assembly, called typeName - if (klass.IsInterface) - myType = newModule.DefineType(typeName, TypeAttributes.Public, typeof(object), new Type[] { - klass, - typeof(ILuaGeneratedType) - }); - else - myType = newModule.DefineType(typeName, TypeAttributes.Public, klass, new Type[] { typeof(ILuaGeneratedType) }); - - // Field that stores the Lua table - var luaTableField = myType.DefineField("__luaInterface_luaTable", typeof(LuaTable), FieldAttributes.Public); - // Field that stores the return types array - var returnTypesField = myType.DefineField("__luaInterface_returnTypes", typeof(Type[][]), FieldAttributes.Public); - // Generates the constructor for the new type, it takes a Lua table and an array - // of return types and stores them in the respective fields - var constructor = myType.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { - typeof(LuaTable), - typeof(Type[][]) - }); - ILGenerator generator = constructor.GetILGenerator(); - generator.Emit(OpCodes.Ldarg_0); - - if (klass.IsInterface) - generator.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes)); - else - generator.Emit(OpCodes.Call, klass.GetConstructor(Type.EmptyTypes)); - - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldarg_1); - generator.Emit(OpCodes.Stfld, luaTableField); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldarg_2); - generator.Emit(OpCodes.Stfld, returnTypesField); - generator.Emit(OpCodes.Ret); - // Generates overriden versions of the klass' public virtual methods - var classMethods = klass.GetMethods(); - returnTypes = new Type[classMethods.Length][]; - int i = 0; - - foreach (var method in classMethods) - { - if (klass.IsInterface) - { - GenerateMethod(myType, method, MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.NewSlot, - i, luaTableField, returnTypesField, false, out returnTypes[i]); - i++; - } - else - { - if (!method.IsPrivate && !method.IsFinal && method.IsVirtual) - { - GenerateMethod(myType, method, (method.Attributes | MethodAttributes.NewSlot) ^ MethodAttributes.NewSlot, i, - luaTableField, returnTypesField, true, out returnTypes[i]); - i++; - } - } - } - - // Generates an implementation of the luaInterfaceGetLuaTable method - var returnTableMethod = myType.DefineMethod("LuaInterfaceGetLuaTable", - MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Virtual, typeof(LuaTable), new Type[0]); - myType.DefineMethodOverride(returnTableMethod, typeof(ILuaGeneratedType).GetMethod("LuaInterfaceGetLuaTable")); - generator = returnTableMethod.GetILGenerator(); - generator.Emit(OpCodes.Ldfld, luaTableField); - generator.Emit(OpCodes.Ret); - newType = myType.CreateType(); // Creates the type -#endif - } - - void GetReturnTypesFromMethod(MethodInfo method, out Type[] returnTypes) - { - var paramInfo = method.GetParameters(); - var paramTypes = new Type[paramInfo.Length]; - var returnTypesList = new List(); - - // Counts out and ref parameters, for later use, - // and creates the list of return types - int nOutParams = 0; - int nOutAndRefParams = 0; - var returnType = method.ReturnType; - returnTypesList.Add(returnType); - - for (int i = 0; i < paramTypes.Length; i++) - { - paramTypes[i] = paramInfo[i].ParameterType; - - if (!paramInfo[i].IsIn && paramInfo[i].IsOut) - { - nOutParams++; - } - - if (paramTypes[i].IsByRef) - { - returnTypesList.Add(paramTypes[i].GetElementType()); - nOutAndRefParams++; - } - } - - returnTypes = returnTypesList.ToArray(); - } - -#if !NETSTANDARD && !WINDOWS_UWP - - /* - * Generates an overriden implementation of method inside myType that delegates - * to a function in a Lua table with the same name, if the function exists. If it - * doesn't the method calls the base method (or does nothing, in case of interface - * implementations). - */ - private void GenerateMethod(TypeBuilder myType, MethodInfo method, MethodAttributes attributes, int methodIndex, - FieldInfo luaTableField, FieldInfo returnTypesField, bool generateBase, out Type[] returnTypes) - { - var paramInfo = method.GetParameters(); - var paramTypes = new Type[paramInfo.Length]; - var returnTypesList = new List(); - - // Counts out and ref parameters, for later use, - // and creates the list of return types - int nOutParams = 0; - int nOutAndRefParams = 0; - var returnType = method.ReturnType; - returnTypesList.Add(returnType); - - for (int i = 0; i < paramTypes.Length; i++) - { - paramTypes[i] = paramInfo[i].ParameterType; - if (!paramInfo[i].IsIn && paramInfo[i].IsOut) - nOutParams++; - - if (paramTypes[i].IsByRef) - { - returnTypesList.Add(paramTypes[i].GetElementType()); - nOutAndRefParams++; - } - } - - int[] refArgs = new int[nOutAndRefParams]; - returnTypes = returnTypesList.ToArray(); - - // Generates a version of the method that calls the base implementation - // directly, for use by the base field of the table - if (generateBase) - { - var baseMethod = myType.DefineMethod("__luaInterface_base_" + method.Name, - MethodAttributes.Private | MethodAttributes.NewSlot | MethodAttributes.HideBySig, - returnType, paramTypes); - ILGenerator generatorBase = baseMethod.GetILGenerator(); - generatorBase.Emit(OpCodes.Ldarg_0); - - for (int i = 0; i < paramTypes.Length; i++) - generatorBase.Emit(OpCodes.Ldarg, i + 1); - - generatorBase.Emit(OpCodes.Call, method); - - if (returnType == typeof(void)) - generatorBase.Emit(OpCodes.Pop); - - generatorBase.Emit(OpCodes.Ret); - } - - // Defines the method - var methodImpl = myType.DefineMethod(method.Name, attributes, returnType, paramTypes); - - // If it's an implementation of an interface tells what method it - // is overriding - if (myType.BaseType.Equals(typeof(object))) - myType.DefineMethodOverride(methodImpl, method); - - ILGenerator generator = methodImpl.GetILGenerator(); - generator.DeclareLocal(typeof(object[])); // original arguments - generator.DeclareLocal(typeof(object[])); // with out-only arguments removed - generator.DeclareLocal(typeof(int[])); // indexes of out and ref arguments - - if (!(returnType == typeof(void))) // return value - generator.DeclareLocal(returnType); - else - generator.DeclareLocal(typeof(object)); - - // Initializes local variables - generator.Emit(OpCodes.Ldc_I4, paramTypes.Length); - generator.Emit(OpCodes.Newarr, typeof(object)); - generator.Emit(OpCodes.Stloc_0); - generator.Emit(OpCodes.Ldc_I4, paramTypes.Length - nOutParams + 1); - generator.Emit(OpCodes.Newarr, typeof(object)); - generator.Emit(OpCodes.Stloc_1); - generator.Emit(OpCodes.Ldc_I4, nOutAndRefParams); - generator.Emit(OpCodes.Newarr, typeof(int)); - generator.Emit(OpCodes.Stloc_2); - generator.Emit(OpCodes.Ldloc_1); - generator.Emit(OpCodes.Ldc_I4_0); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldfld, luaTableField); - generator.Emit(OpCodes.Stelem_Ref); - - // Stores the arguments into the local variables, as needed - for (int iArgs = 0, iInArgs = 1, iOutArgs = 0; iArgs < paramTypes.Length; iArgs++) - { - generator.Emit(OpCodes.Ldloc_0); - generator.Emit(OpCodes.Ldc_I4, iArgs); - generator.Emit(OpCodes.Ldarg, iArgs + 1); - - if (paramTypes[iArgs].IsByRef) - { - if (paramTypes[iArgs].GetElementType().IsValueType) - { - generator.Emit(OpCodes.Ldobj, paramTypes[iArgs].GetElementType()); - generator.Emit(OpCodes.Box, paramTypes[iArgs].GetElementType()); - } - else - generator.Emit(OpCodes.Ldind_Ref); - } - else - { - if (paramTypes[iArgs].IsValueType) - generator.Emit(OpCodes.Box, paramTypes[iArgs]); - } - - generator.Emit(OpCodes.Stelem_Ref); - - if (paramTypes[iArgs].IsByRef) - { - generator.Emit(OpCodes.Ldloc_2); - generator.Emit(OpCodes.Ldc_I4, iOutArgs); - generator.Emit(OpCodes.Ldc_I4, iArgs); - generator.Emit(OpCodes.Stelem_I4); - refArgs[iOutArgs] = iArgs; - iOutArgs++; - } - - if (paramInfo[iArgs].IsIn || (!paramInfo[iArgs].IsOut)) - { - generator.Emit(OpCodes.Ldloc_1); - generator.Emit(OpCodes.Ldc_I4, iInArgs); - generator.Emit(OpCodes.Ldarg, iArgs + 1); - - if (paramTypes[iArgs].IsByRef) - { - if (paramTypes[iArgs].GetElementType().IsValueType) - { - generator.Emit(OpCodes.Ldobj, paramTypes[iArgs].GetElementType()); - generator.Emit(OpCodes.Box, paramTypes[iArgs].GetElementType()); - } - else - generator.Emit(OpCodes.Ldind_Ref); - } - else - { - if (paramTypes[iArgs].IsValueType) - generator.Emit(OpCodes.Box, paramTypes[iArgs]); - } - - generator.Emit(OpCodes.Stelem_Ref); - iInArgs++; - } - } - - // Gets the function the method will delegate to by calling - // the getTableFunction method of class LuaClassHelper - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldfld, luaTableField); - generator.Emit(OpCodes.Ldstr, method.Name); - generator.Emit(OpCodes.Call, classHelper.GetMethod("GetTableFunction")); - var lab1 = generator.DefineLabel(); - generator.Emit(OpCodes.Dup); - generator.Emit(OpCodes.Brtrue_S, lab1); - // Function does not exist, call base method - generator.Emit(OpCodes.Pop); - - if (!method.IsAbstract) - { - generator.Emit(OpCodes.Ldarg_0); - - for (int i = 0; i < paramTypes.Length; i++) - generator.Emit(OpCodes.Ldarg, i + 1); - - generator.Emit(OpCodes.Call, method); - - if (returnType == typeof(void)) - generator.Emit(OpCodes.Pop); - - generator.Emit(OpCodes.Ret); - generator.Emit(OpCodes.Ldnull); - } - else - generator.Emit(OpCodes.Ldnull); - - var lab2 = generator.DefineLabel(); - generator.Emit(OpCodes.Br_S, lab2); - generator.MarkLabel(lab1); - // Function exists, call using method callFunction of LuaClassHelper - generator.Emit(OpCodes.Ldloc_0); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldfld, returnTypesField); - generator.Emit(OpCodes.Ldc_I4, methodIndex); - generator.Emit(OpCodes.Ldelem_Ref); - generator.Emit(OpCodes.Ldloc_1); - generator.Emit(OpCodes.Ldloc_2); - generator.Emit(OpCodes.Call, classHelper.GetMethod("CallFunction")); - generator.MarkLabel(lab2); - - // Stores the function return value - if (returnType == typeof(void)) - { - generator.Emit(OpCodes.Pop); - generator.Emit(OpCodes.Ldnull); - } - else if (returnType.IsValueType) - { - generator.Emit(OpCodes.Unbox, returnType); - generator.Emit(OpCodes.Ldobj, returnType); - } - else - generator.Emit(OpCodes.Castclass, returnType); - - generator.Emit(OpCodes.Stloc_3); - - // Sets return values of out and ref parameters - for (int i = 0; i < refArgs.Length; i++) - { - generator.Emit(OpCodes.Ldarg, refArgs[i] + 1); - generator.Emit(OpCodes.Ldloc_0); - generator.Emit(OpCodes.Ldc_I4, refArgs[i]); - generator.Emit(OpCodes.Ldelem_Ref); - - if (paramTypes[refArgs[i]].GetElementType().IsValueType) - { - generator.Emit(OpCodes.Unbox, paramTypes[refArgs[i]].GetElementType()); - generator.Emit(OpCodes.Ldobj, paramTypes[refArgs[i]].GetElementType()); - generator.Emit(OpCodes.Stobj, paramTypes[refArgs[i]].GetElementType()); - } - else - { - generator.Emit(OpCodes.Castclass, paramTypes[refArgs[i]].GetElementType()); - generator.Emit(OpCodes.Stind_Ref); - } - } - - // Returns - if (!(returnType == typeof(void))) - generator.Emit(OpCodes.Ldloc_3); - - generator.Emit(OpCodes.Ret); - } -#endif - /* - * Gets an event handler for the event type that delegates to the eventHandler Lua function. - * Caches the generated type. - */ - public LuaEventHandler GetEvent(Type eventHandlerType, LuaFunction eventHandler) - { -#if NETSTANDARD || WINDOWS_UWP - throw new NotImplementedException (" Emit not available on .NET Standard "); -#else - Type eventConsumerType; - - if (eventHandlerCollection.ContainsKey(eventHandlerType)) - eventConsumerType = eventHandlerCollection[eventHandlerType]; - else - { - eventConsumerType = GenerateEvent(eventHandlerType); - eventHandlerCollection[eventHandlerType] = eventConsumerType; - } - - var luaEventHandler = (LuaEventHandler)Activator.CreateInstance(eventConsumerType); - luaEventHandler.Handler = eventHandler; - return luaEventHandler; -#endif - } - - public void RegisterLuaDelegateType(Type delegateType, Type luaDelegateType) - { - _delegateCollection[delegateType] = luaDelegateType; - } - - public void RegisterLuaClassType(Type klass, Type luaClass) - { - var luaClassType = new LuaClassType(); - luaClassType.klass = luaClass; - GetReturnTypesFromClass(klass, out luaClassType.returnTypes); - _classCollection[klass] = luaClassType; - } - /* - * Gets a delegate with delegateType that calls the luaFunc Lua function - * Caches the generated type. - */ - public Delegate GetDelegate(Type delegateType, LuaFunction luaFunc) - { - var returnTypes = new List(); - Type luaDelegateType; - - if (_delegateCollection.ContainsKey(delegateType)) - { - luaDelegateType = _delegateCollection[delegateType]; - } - else - { - luaDelegateType = GenerateDelegate(delegateType); - _delegateCollection[delegateType] = luaDelegateType; - } - - var methodInfo = delegateType.GetMethod("Invoke"); - returnTypes.Add(methodInfo.ReturnType); - - foreach (ParameterInfo paramInfo in methodInfo.GetParameters()) - { - if (paramInfo.ParameterType.IsByRef) - returnTypes.Add(paramInfo.ParameterType); - } - - var luaDelegate = (LuaDelegate)Activator.CreateInstance(luaDelegateType); - luaDelegate.Function = luaFunc; - luaDelegate.ReturnTypes = returnTypes.ToArray(); - return Delegate.CreateDelegate(delegateType, luaDelegate, "CallFunction"); - } - - /* - * Gets an instance of an implementation of the klass interface or - * subclass of klass that delegates public virtual methods to the - * luaTable table. - * Caches the generated type. - */ - public object GetClassInstance(Type klass, LuaTable luaTable) - { - LuaClassType luaClassType; - - if (_classCollection.ContainsKey(klass)) - luaClassType = _classCollection[klass]; - else - { - luaClassType = new LuaClassType(); - GenerateClass(klass, out luaClassType.klass, out luaClassType.returnTypes); - _classCollection[klass] = luaClassType; - } - - return Activator.CreateInstance(luaClassType.klass, new object[] { - luaTable, - luaClassType.returnTypes - }); - } - } -} diff --git a/src/LUA/GenerateEventAssembly/DelegateGenerator.cs b/src/LUA/GenerateEventAssembly/DelegateGenerator.cs deleted file mode 100644 index 62ad271..0000000 --- a/src/LUA/GenerateEventAssembly/DelegateGenerator.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using LuaState = KeraLua.Lua; - -namespace NLua -{ - class DelegateGenerator - { - private readonly ObjectTranslator _translator; - private readonly Type _delegateType; - - public DelegateGenerator(ObjectTranslator objectTranslator, Type type) - { - _translator = objectTranslator; - _delegateType = type; - } - - public object ExtractGenerated(LuaState luaState, int stackPos) - { - return CodeGeneration.Instance.GetDelegate(_delegateType, _translator.GetFunction(luaState, stackPos)); - } - } -} \ No newline at end of file diff --git a/src/LUA/GenerateEventAssembly/ILuaGeneratedType.cs b/src/LUA/GenerateEventAssembly/ILuaGeneratedType.cs deleted file mode 100644 index 37499e1..0000000 --- a/src/LUA/GenerateEventAssembly/ILuaGeneratedType.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace NLua -{ - /* - * Common interface for types generated from tables. The method - * returns the table that overrides some or all of the type's methods. - */ - public interface ILuaGeneratedType - { - LuaTable LuaInterfaceGetLuaTable(); - } -} \ No newline at end of file diff --git a/src/LUA/GenerateEventAssembly/LuaClassType.cs b/src/LUA/GenerateEventAssembly/LuaClassType.cs deleted file mode 100644 index 8b861d7..0000000 --- a/src/LUA/GenerateEventAssembly/LuaClassType.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace NLua -{ - /* - * Structure to store a type and the return types of - * its methods (the type of the returned value and out/ref - * parameters). - */ - struct LuaClassType - { - public Type klass; - public Type[][] returnTypes; - } -} \ No newline at end of file diff --git a/src/LUA/Lua.cs b/src/LUA/Lua.cs deleted file mode 100644 index 00c288d..0000000 --- a/src/LUA/Lua.cs +++ /dev/null @@ -1,1262 +0,0 @@ -using System; -using System.Linq; -using System.Reflection; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using KeraLua; - -using NLua.Event; -using NLua.Method; -using NLua.Exceptions; -using NLua.Extensions; - -#if __IOS__ || __TVOS__ || __WATCHOS__ - using ObjCRuntime; -#endif - -using LuaState = KeraLua.Lua; -using LuaNativeFunction = KeraLua.LuaFunction; - - -namespace NLua -{ - public class Lua : IDisposable - { - #region lua debug functions - /// - /// Event that is raised when an exception occures during a hook call. - /// - public event EventHandler HookException; - /// - /// Event when lua hook callback is called - /// - /// - /// Is only raised if SetDebugHook is called before. - /// - public event EventHandler DebugHook; - /// - /// lua hook calback delegate - /// - private LuaHookFunction _hookCallback; - #endregion - #region Globals auto-complete - private readonly List _globals = new List(); - private bool _globalsSorted; - #endregion - private LuaState _luaState; - /// - /// True while a script is being executed - /// - public bool IsExecuting => _executing; - - public LuaState State => _luaState; - - private ObjectTranslator _translator; - - /// - /// Used to ensure multiple .net threads all get serialized by this single lock for access to the lua stack/objects - /// - //private object luaLock = new object(); - private bool _StatePassed; - private bool _executing; - - // The commented code bellow is the initLua, the code assigned here is minified for size/performance reasons. - private const string InitLuanet = @"local a={}local rawget=rawget;local b=luanet.import_type;local c=luanet.load_assembly;luanet.error,luanet.type=error,type;function a:__index(d)local e=rawget(self,'.fqn')e=(e and e..'.'or'')..d;local f=rawget(luanet,d)or b(e)if f==nil then pcall(c,e)f={['.fqn']=e}setmetatable(f,a)end;rawset(self,d,f)return f end;function a:__call(...)error('No such type: '..rawget(self,'.fqn'),2)end;luanet['.fqn']=false;setmetatable(luanet,a)luanet.load_assembly('mscorlib')"; - //@"local metatable = {} - // local rawget = rawget - // local import_type = luanet.import_type - // local load_assembly = luanet.load_assembly - // luanet.error, luanet.type = error, type - // -- Lookup a .NET identifier component. - // function metatable:__index(key) -- key is e.g. 'Form' - // -- Get the fully-qualified name, e.g. 'System.Windows.Forms.Form' - // local fqn = rawget(self,'.fqn') - // fqn = ((fqn and fqn .. '.') or '') .. key - - // -- Try to find either a luanet function or a CLR type - // local obj = rawget(luanet,key) or import_type(fqn) - - // -- If key is neither a luanet function or a CLR type, then it is simply - // -- an identifier component. - // if obj == nil then - // -- It might be an assembly, so we load it too. - // pcall(load_assembly,fqn) - // obj = { ['.fqn'] = fqn } - // setmetatable(obj, metatable) - // end - - // -- Cache this lookup - // rawset(self, key, obj) - // return obj - // end - - // -- A non-type has been called; e.g. foo = System.Foo() - // function metatable:__call(...) - // error('No such type: ' .. rawget(self,'.fqn'), 2) - // end - - // -- This is the root of the .NET namespace - // luanet['.fqn'] = false - // setmetatable(luanet, metatable) - - // -- Preload the mscorlib assembly - // luanet.load_assembly('mscorlib')"; - - private const string ClrPackage = @"if not luanet then require'luanet'end;local a,b=luanet.import_type,luanet.load_assembly;local c={__index=function(d,e)local f=rawget(d,e)if f==nil then f=a(d.packageName.."".""..e)if f==nil then f=a(e)end;d[e]=f end;return f end}function luanet.namespace(g)if type(g)=='table'then local h={}for i=1,#g do h[i]=luanet.namespace(g[i])end;return unpack(h)end;local j={packageName=g}setmetatable(j,c)return j end;local k,l;local function m()l={}k={__index=function(n,e)for i,d in ipairs(l)do local f=d[e]if f then _G[e]=f;return f end end end}setmetatable(_G,k)end;function CLRPackage(o,p)p=p or o;local q=pcall(b,o)return luanet.namespace(p)end;function import(o,p)if not k then m()end;if not p then local i=o:find('%.dll$')if i then p=o:sub(1,i-1)else p=o end end;local j=CLRPackage(o,p)table.insert(l,j)return j end;function luanet.make_array(r,s)local t=r[#s]for i,u in ipairs(s)do t:SetValue(u,i-1)end;return t end;function luanet.each(v)local w=v:GetEnumerator()return function()if w:MoveNext()then return w.Current end end end"; -//@"--- -//--- This lua module provides auto importing of .net classes into a named package. -//--- Makes for super easy use of LuaInterface glue -//--- -//--- example: -//--- Threading = CLRPackage(""System"", ""System.Threading"") -//--- Threading.Thread.Sleep(100) -//--- -//--- Extensions: -//--- import() is a version of CLRPackage() which puts the package into a list which is used by a global __index lookup, -//--- and thus works rather like C#'s using statement. It also recognizes the case where one is importing a local -//--- assembly, which must end with an explicit .dll extension. - -//--- Alternatively, luanet.namespace can be used for convenience without polluting the global namespace: -//--- local sys,sysi = luanet.namespace {'System','System.IO'} -//-- sys.Console.WriteLine(""we are at {0}"",sysi.Directory.GetCurrentDirectory()) - - -//-- LuaInterface hosted with stock Lua interpreter will need to explicitly require this... -//if not luanet then require 'luanet' end - -//local import_type, load_assembly = luanet.import_type, luanet.load_assembly - -//local mt = { -// --- Lookup a previously unfound class and add it to our table -// __index = function(package, classname) -// local class = rawget(package, classname) -// if class == nil then -// class = import_type(package.packageName .. ""."" .. classname) -// if class == nil then class = import_type(classname) end -// package[classname] = class -- keep what we found around, so it will be shared -// end -// return class -// end -//} - -//function luanet.namespace(ns) -// if type(ns) == 'table' then -// local res = {} -// for i = 1,#ns do -// res[i] = luanet.namespace(ns[i]) -// end -// return unpack(res) -// end -// -- FIXME - table.packageName could instead be a private index (see Lua 13.4.4) -// local t = { packageName = ns } -// setmetatable(t,mt) -// return t -//end - -//local globalMT, packages - -//local function set_global_mt() -// packages = {} -// globalMT = { -// __index = function(T,classname) -// for i,package in ipairs(packages) do -// local class = package[classname] -// if class then -// _G[classname] = class -// return class -// end -// end -// end -// } -// setmetatable(_G, globalMT) -//end - -//--- Create a new Package class -//function CLRPackage(assemblyName, packageName) -// -- a sensible default... -// packageName = packageName or assemblyName -// local ok = pcall(load_assembly,assemblyName) -- Make sure our assembly is loaded -// return luanet.namespace(packageName) -//end - -//function import (assemblyName, packageName) -// if not globalMT then -// set_global_mt() -// end -// if not packageName then -// local i = assemblyName:find('%.dll$') -// if i then packageName = assemblyName:sub(1,i-1) -// else packageName = assemblyName end -// end -// local t = CLRPackage(assemblyName,packageName) -// table.insert(packages,t) -// return t -//end - - -//function luanet.make_array (tp,tbl) -// local arr = tp[#tbl] -// for i,v in ipairs(tbl) do -// arr:SetValue(v,i-1) -// end -// return arr -//end - -//function luanet.each(o) -// local e = o:GetEnumerator() -// return function() -// if e:MoveNext() then -// return e.Current -// end -// end -//end -//"; - public bool UseTraceback { get; set; } = false; - - /// - /// The maximum number of recursive steps to take when adding global reference variables. Defaults to 2. - /// - public int MaximumRecursion { get; set; } = 2; - - #region Globals auto-complete - /// - /// An alphabetically sorted list of all globals (objects, methods, etc.) externally added to this Lua instance - /// - /// Members of globals are also listed. The formatting is optimized for text input auto-completion. - public IEnumerable Globals { - get - { - // Only sort list when necessary - if (!_globalsSorted) - { - _globals.Sort(); - _globalsSorted = true; - } - - return _globals; - } - } - #endregion - - public Lua() - { - _luaState = new LuaState(); - Init(); - // We need to keep this in a managed reference so the delegate doesn't get garbage collected - _luaState.AtPanic(PanicCallback); - } - - /* - * CAUTION: NLua.Lua instances can't share the same lua state! - */ - public Lua(LuaState luaState) - { - luaState.PushString("NLua_Loaded"); - luaState.GetTable((int)LuaRegistry.Index); - - if (luaState.ToBoolean(-1)) - { - luaState.SetTop(-2); - throw new LuaException("There is already a NLua.Lua instance associated with this Lua state"); - } - - _luaState = luaState; - _StatePassed = true; - luaState.SetTop(-2); - Init(); - } - - void Init() - { - _luaState.PushString("NLua_Loaded"); - _luaState.PushBoolean(true); - _luaState.SetTable((int)LuaRegistry.Index); - if (_StatePassed == false) - { - _luaState.NewTable(); - _luaState.SetGlobal("luanet"); - } - _luaState.PushGlobalTable(); - _luaState.GetGlobal("luanet"); - _luaState.PushString("getmetatable"); - _luaState.GetGlobal("getmetatable"); - _luaState.SetTable(-3); - _luaState.PopGlobalTable(); - _translator = new ObjectTranslator(this, _luaState); - - ObjectTranslatorPool.Instance.Add(_luaState, _translator); - - _luaState.PopGlobalTable(); - _luaState.DoString(InitLuanet); - } - - public void Close() - { - if (_StatePassed || _luaState == null) - return; - - _luaState.Close(); - ObjectTranslatorPool.Instance.Remove(_luaState); - _luaState = null; - } - -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int PanicCallback(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - string reason = string.Format("Unprotected error in call to Lua API ({0})", luaState.ToString(-1, false)); - throw new LuaException(reason); - } - - /// - /// Assuming we have a Lua error string sitting on the stack, throw a C# exception out to the user's app - /// - /// Thrown if the script caused an exception - private void ThrowExceptionFromError(int oldTop) - { - object err = _translator.GetObject(_luaState, -1); - _luaState.SetTop(oldTop); - - // A pre-wrapped exception - just rethrow it (stack trace of InnerException will be preserved) - var luaEx = err as LuaScriptException; - - if (luaEx != null) - throw luaEx; - - // A non-wrapped Lua error (best interpreted as a string) - wrap it and throw it - if (err == null) - err = "Unknown Lua Error"; - - throw new LuaScriptException(err.ToString(), string.Empty); - } - - /// - /// Push a debug.traceback reference onto the stack, for a pcall function to use as error handler. (Remember to increment any top-of-stack markers!) - /// - private static int PushDebugTraceback(LuaState luaState, int argCount) - { - luaState.GetGlobal("debug"); - luaState.GetField(-1, "traceback"); - luaState.Remove(-2); - int errIndex = -argCount - 2; - luaState.Insert(errIndex); - return errIndex; - } - - /// - /// Return a debug.traceback() call result (a multi-line string, containing a full stack trace, including C calls. - /// Note: it won't return anything unless the interpreter is in the middle of execution - that is, it only makes sense to call it from a method called from Lua, or during a coroutine yield. - /// - public string GetDebugTraceback() - { - int oldTop = _luaState.GetTop(); - _luaState.GetGlobal("debug"); // stack: debug - _luaState.GetField(-1, "traceback"); // stack: debug,traceback - _luaState.Remove(-2); // stack: traceback - _luaState.PCall(0, -1, 0); - return _translator.PopValues(_luaState, oldTop)[0] as string; - } - - /// - /// Convert C# exceptions into Lua errors - /// - /// num of things on stack - /// null for no pending exception - internal int SetPendingException(Exception e) - { - var caughtExcept = e; - - if (caughtExcept == null) - return 0; - - _translator.ThrowError(_luaState, caughtExcept); - return 1; - } - - /// - /// - /// - /// - /// - /// - public LuaFunction LoadString(string chunk, string name) - { - int oldTop = _luaState.GetTop(); - _executing = true; - - try - { - if (_luaState.LoadString(chunk, name) != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - } - finally - { - _executing = false; - } - - var result = _translator.GetFunction(_luaState, -1); - _translator.PopValues(_luaState, oldTop); - return result; - } - - /// - /// - /// - /// - /// - /// - public LuaFunction LoadString(byte[] chunk, string name) - { - int oldTop = _luaState.GetTop(); - _executing = true; - - try - { - if (_luaState.LoadBuffer(chunk, name) != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - } - finally - { - _executing = false; - } - - var result = _translator.GetFunction(_luaState, -1); - _translator.PopValues(_luaState, oldTop); - return result; - } - - /// - /// Load a File on, and return a LuaFunction to execute the file loaded (useful to see if the syntax of a file is ok) - /// - /// - /// - public LuaFunction LoadFile(string fileName) - { - int oldTop = _luaState.GetTop(); - - if (_luaState.LoadFile(fileName) != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - - var result = _translator.GetFunction(_luaState, -1); - _translator.PopValues(_luaState, oldTop); - return result; - } - - /// - /// Executes a Lua chunk and returns all the chunk's return values in an array. - /// - /// Chunk to execute - /// Name to associate with the chunk. Defaults to "chunk". - /// - public object[] DoString(byte[] chunk, string chunkName = "chunk") - { - int oldTop = _luaState.GetTop(); - _executing = true; - - if (_luaState.LoadBuffer(chunk, chunkName) != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - - int errorFunctionIndex = 0; - - if (UseTraceback) - { - errorFunctionIndex = PushDebugTraceback(_luaState, 0); - oldTop++; - } - - try - { - if (_luaState.PCall(0, -1, errorFunctionIndex) != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - - return _translator.PopValues(_luaState, oldTop); - } - finally - { - _executing = false; - } - } - - /// - /// Executes a Lua chunk and returns all the chunk's return values in an array. - /// - /// Chunk to execute - /// Name to associate with the chunk. Defaults to "chunk". - /// - public object[] DoString(string chunk, string chunkName = "chunk") - { - int oldTop = _luaState.GetTop(); - _executing = true; - - if (_luaState.LoadString(chunk, chunkName) != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - - int errorFunctionIndex = 0; - - if (UseTraceback) - { - errorFunctionIndex = PushDebugTraceback(_luaState, 0); - oldTop++; - } - - try - { - if (_luaState.PCall(0, -1, errorFunctionIndex) != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - - return _translator.PopValues(_luaState, oldTop); - } - finally - { - _executing = false; - } - } - - /* - * Executes a Lua file and returns all the chunk's return - * values in an array - */ - public object[] DoFile(string fileName) - { - int oldTop = _luaState.GetTop(); - - if (_luaState.LoadFile(fileName) != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - - _executing = true; - - int errorFunctionIndex = 0; - if (UseTraceback) - { - errorFunctionIndex = PushDebugTraceback(_luaState, 0); - oldTop++; - } - - try - { - if (_luaState.PCall(0, -1, errorFunctionIndex) != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - - return _translator.PopValues(_luaState, oldTop); - } - finally - { - _executing = false; - } - } - - public object GetObjectFromPath(string fullPath) - { - int oldTop = _luaState.GetTop(); - string[] path = FullPathToArray(fullPath); - _luaState.GetGlobal(path[0]); - object returnValue = _translator.GetObject(_luaState, -1); - - if (path.Length > 1) - { - var dispose = returnValue as LuaBase; - string[] remainingPath = new string[path.Length - 1]; - Array.Copy(path, 1, remainingPath, 0, path.Length - 1); - returnValue = GetObject(remainingPath); - dispose?.Dispose(); - } - - _luaState.SetTop(oldTop); - return returnValue; - } - - public void SetObjectToPath(string fullPath, object value) - { - int oldTop = _luaState.GetTop(); - string[] path = FullPathToArray(fullPath); - - if (path.Length == 1) - { - _translator.Push(_luaState, value); - _luaState.SetGlobal(fullPath); - } - else - { - _luaState.GetGlobal(path[0]); - string[] remainingPath = new string[path.Length - 1]; - Array.Copy(path, 1, remainingPath, 0, path.Length - 1); - SetObject(remainingPath, value); - } - - _luaState.SetTop(oldTop); - - // Globals auto-complete - if (value == null) - { - // Remove now obsolete entries - _globals.Remove(fullPath); - } - else - { - // Add new entries - if (!_globals.Contains(fullPath)) - RegisterGlobal(fullPath, value.GetType(), 0); - } - } - /* - * Indexer for global variables from the LuaInterpreter - * Supports navigation of tables by using . operator - */ - public object this[string fullPath] { - get - { - // Silently convert Lua integer to double for backward compatibility with index[] operator - object obj = GetObjectFromPath(fullPath); - if (obj is long l) - return (double)l; - return obj; - } - set - { - SetObjectToPath(fullPath, value); - } - } - - #region Globals auto-complete - /// - /// Adds an entry to (recursivley handles 2 levels of members) - /// - /// The index accessor path ot the entry - /// The type of the entry - /// How deep have we gone with recursion? - private void RegisterGlobal(string path, Type type, int recursionCounter) - { - // If the type is a global method, list it directly - if (type == typeof(LuaFunction)) - { - // Format for easy method invocation - _globals.Add(path + "("); - } - // If the type is a class or an interface and recursion hasn't been running too long, list the members - else if ((type.IsClass || type.IsInterface) && type != typeof(string) && recursionCounter < MaximumRecursion) - { - #region Methods - foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance)) - { - string name = method.Name; - if ( - // Check that the LuaHideAttribute and LuaGlobalAttribute were not applied - (!method.GetCustomAttributes(typeof(LuaHideAttribute), false).Any()) && - (!method.GetCustomAttributes(typeof(LuaGlobalAttribute), false).Any()) && - // Exclude some generic .NET methods that wouldn't be very usefull in Lua - name != "GetType" && name != "GetHashCode" && name != "Equals" && - name != "ToString" && name != "Clone" && name != "Dispose" && - name != "GetEnumerator" && name != "CopyTo" && - !name.StartsWith("get_", StringComparison.Ordinal) && - !name.StartsWith("set_", StringComparison.Ordinal) && - !name.StartsWith("add_", StringComparison.Ordinal) && - !name.StartsWith("remove_", StringComparison.Ordinal)) - { - // Format for easy method invocation - string command = path + ":" + name + "("; - - if (method.GetParameters().Length == 0) - command += ")"; - _globals.Add(command); - } - } - #endregion - - #region Fields - foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.Instance)) - { - if ( - // Check that the LuaHideAttribute and LuaGlobalAttribute were not applied - (!field.GetCustomAttributes(typeof(LuaHideAttribute), false).Any()) && - (!field.GetCustomAttributes(typeof(LuaGlobalAttribute), false).Any())) - { - // Go into recursion for members - RegisterGlobal(path + "." + field.Name, field.FieldType, recursionCounter + 1); - } - } - #endregion - - #region Properties - foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) - { - if ( - // Check that the LuaHideAttribute and LuaGlobalAttribute were not applied - (!property.GetCustomAttributes(typeof(LuaHideAttribute), false).Any()) && - (!property.GetCustomAttributes(typeof(LuaGlobalAttribute), false).Any()) - // Exclude some generic .NET properties that wouldn't be very useful in Lua - && property.Name != "Item") - { - // Go into recursion for members - RegisterGlobal(path + "." + property.Name, property.PropertyType, recursionCounter + 1); - } - } - #endregion - } - else - _globals.Add(path); // Otherwise simply add the element to the list - - // List will need to be sorted on next access - _globalsSorted = false; - } - #endregion - - /* - * Navigates a table in the top of the stack, returning - * the value of the specified field - */ - object GetObject(string[] remainingPath) - { - object returnValue = null; - - for (int i = 0; i < remainingPath.Length; i++) - { - _luaState.PushString(remainingPath[i]); - _luaState.GetTable(-2); - returnValue = _translator.GetObject(_luaState, -1); - - if (returnValue == null) - break; - } - - return returnValue; - } - - /* - * Gets a numeric global variable - */ - public double GetNumber(string fullPath) - { - // Silently convert Lua integer to double for backward compatibility with GetNumber method - object obj = GetObjectFromPath(fullPath); - if (obj is long l) - return l; - return (double)obj; - } - - public int GetInteger(string fullPath) - { - return (int)(long)GetObjectFromPath(fullPath); - } - - public long GetLong(string fullPath) - { - return (long)GetObjectFromPath(fullPath); - } - - /* - * Gets a string global variable - */ - public string GetString(string fullPath) - { - object obj = GetObjectFromPath(fullPath); - return obj.ToString(); - } - - /* - * Gets a table global variable - */ - public LuaTable GetTable(string fullPath) - { - return (LuaTable)GetObjectFromPath(fullPath); - } - - /* - * Gets a table global variable as an object implementing - * the interfaceType interface - */ - public object GetTable(Type interfaceType, string fullPath) - { - return CodeGeneration.Instance.GetClassInstance(interfaceType, GetTable(fullPath)); - } - - /* - * Gets a function global variable - */ - public LuaFunction GetFunction(string fullPath) - { - object obj = GetObjectFromPath(fullPath); - var luaFunction = obj as LuaFunction; - if (luaFunction != null) - return luaFunction; - - luaFunction = new LuaFunction((LuaNativeFunction) obj, this); - return luaFunction; - } - - /* - * Register a delegate type to be used to convert Lua functions to C# delegates (useful for iOS where there is no dynamic code generation) - * type delegateType - */ - public void RegisterLuaDelegateType(Type delegateType, Type luaDelegateType) - { - CodeGeneration.Instance.RegisterLuaDelegateType(delegateType, luaDelegateType); - } - - public void RegisterLuaClassType(Type klass, Type luaClass) - { - CodeGeneration.Instance.RegisterLuaClassType(klass, luaClass); - } - - // ReSharper disable once InconsistentNaming - public void LoadCLRPackage() - { - _luaState.DoString(ClrPackage); - } - /* - * Gets a function global variable as a delegate of - * type delegateType - */ - public Delegate GetFunction(Type delegateType, string fullPath) - { - return CodeGeneration.Instance.GetDelegate(delegateType, GetFunction(fullPath)); - } - - /* - * Calls the object as a function with the provided arguments, - * returning the function's returned values inside an array - */ - internal object[] CallFunction(object function, object[] args) - { - return CallFunction(function, args, null); - } - - /* - * Calls the object as a function with the provided arguments and - * casting returned values to the types in returnTypes before returning - * them in an array - */ - internal object[] CallFunction(object function, object[] args, Type[] returnTypes) - { - int nArgs = 0; - int oldTop = _luaState.GetTop(); - - if (!_luaState.CheckStack(args.Length + 6)) - throw new LuaException("Lua stack overflow"); - - _translator.Push(_luaState, function); - - if (args.Length > 0) - { - nArgs = args.Length; - - for (int i = 0; i < args.Length; i++) - _translator.Push(_luaState, args[i]); - } - - _executing = true; - - try - { - int errfunction = 0; - if (UseTraceback) - { - errfunction = PushDebugTraceback(_luaState, nArgs); - oldTop++; - } - - LuaStatus error = _luaState.PCall(nArgs, -1, errfunction); - if (error != LuaStatus.OK) - ThrowExceptionFromError(oldTop); - } - finally - { - _executing = false; - } - - if (returnTypes != null) - return _translator.PopValues(_luaState, oldTop, returnTypes); - - return _translator.PopValues(_luaState, oldTop); - } - - /* - * Navigates a table to set the value of one of its fields - */ - void SetObject(string[] remainingPath, object val) - { - for (int i = 0; i < remainingPath.Length - 1; i++) - { - _luaState.PushString(remainingPath[i]); - _luaState.GetTable(-2); - } - - _luaState.PushString(remainingPath[remainingPath.Length - 1]); - _translator.Push(_luaState, val); - _luaState.SetTable(-3); - } - - string[] FullPathToArray(string fullPath) - { - return fullPath.SplitWithEscape('.', '\\').ToArray(); - } - /* - * Creates a new table as a global variable or as a field - * inside an existing table - */ - public void NewTable(string fullPath) - { - string[] path = FullPathToArray(fullPath); - int oldTop = _luaState.GetTop(); - - if (path.Length == 1) - { - _luaState.NewTable(); - _luaState.SetGlobal(fullPath); - } - else - { - _luaState.GetGlobal(path[0]); - - for (int i = 1; i < path.Length - 1; i++) - { - _luaState.PushString(path[i]); - _luaState.GetTable(-2); - } - - _luaState.PushString(path[path.Length - 1]); - _luaState.NewTable(); - _luaState.SetTable(-3); - } - - _luaState.SetTop( oldTop); - } - - public Dictionary GetTableDict(LuaTable table) - { - if (table == null) - throw new ArgumentNullException(nameof(table)); - - var dict = new Dictionary(); - int oldTop = _luaState.GetTop(); - _translator.Push(_luaState, table); - _luaState.PushNil(); - - while (_luaState.Next(-2)) - { - dict[_translator.GetObject(_luaState, -2)] = _translator.GetObject(_luaState, -1); - _luaState.SetTop(-2); - } - - _luaState.SetTop(oldTop); - return dict; - } - - /* - * Lets go of a previously allocated reference to a table, function - * or userdata - */ - #region lua debug functions - /// - /// Activates the debug hook - /// - /// Mask - /// Count - /// see lua docs. -1 if hook is already set - public int SetDebugHook(LuaHookMask mask, int count) - { - if (_hookCallback == null) - { - _hookCallback = DebugHookCallback; - _luaState.SetHook(_hookCallback, mask, count); - } - - return -1; - } - - /// - /// Removes the debug hook - /// - /// see lua docs - public void RemoveDebugHook() - { - _hookCallback = null; - _luaState.SetHook(null, LuaHookMask.Disabled, 0); - } - - /// - /// Gets the hook mask. - /// - /// hook mask - public LuaHookMask GetHookMask() - { - return _luaState.HookMask; - } - - /// - /// Gets the hook count - /// - /// see lua docs - public int GetHookCount() - { - return _luaState.HookCount; - } - - - /// - /// Gets local (see lua docs) - /// - /// lua debug structure - /// see lua docs - /// see lua docs - public string GetLocal(LuaDebug luaDebug, int n) - { - return _luaState.GetLocal(luaDebug, n); - } - - /// - /// Sets local (see lua docs) - /// - /// lua debug structure - /// see lua docs - /// see lua docs - public string SetLocal(LuaDebug luaDebug, int n) - { - return _luaState.SetLocal(luaDebug, n); - } - - public int GetStack(int level, ref LuaDebug ar) - { - return _luaState.GetStack(level, ref ar); - } - - public bool GetInfo(string what, ref LuaDebug ar) - { - return _luaState.GetInfo(what, ref ar); - } - - /// - /// Gets up value (see lua docs) - /// - /// see lua docs - /// see lua docs - /// see lua docs - public string GetUpValue(int funcindex, int n) - { - return _luaState.GetUpValue(funcindex, n); - } - - /// - /// Sets up value (see lua docs) - /// - /// see lua docs - /// see lua docs - /// see lua docs - public string SetUpValue(int funcindex, int n) - { - return _luaState.SetUpValue(funcindex, n); - } - - /// - /// Delegate that is called on lua hook callback - /// - /// lua state - /// Pointer to LuaDebug (lua_debug) structure - /// -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaHookFunction))] -#endif - static void DebugHookCallback(IntPtr luaState, IntPtr luaDebug) - { - var state = LuaState.FromIntPtr(luaState); - - state.GetStack(0, luaDebug); - - if (!state.GetInfo("Snlu", luaDebug)) - return; - - var debug = LuaDebug.FromIntPtr(luaDebug); - - ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(state); - Lua lua = translator.Interpreter; - lua.DebugHookCallbackInternal(debug); - } - - private void DebugHookCallbackInternal(LuaDebug luaDebug) - { - try - { - var temp = DebugHook; - - if (temp != null) - temp(this, new DebugHookEventArgs(luaDebug)); - } - catch (Exception ex) - { - OnHookException(new HookExceptionEventArgs(ex)); - } - } - - private void OnHookException(HookExceptionEventArgs e) - { - var temp = HookException; - if (temp != null) - temp(this, e); - } - - /// - /// Pops a value from the lua stack. - /// - /// Returns the top value from the lua stack. - public object Pop() - { - int top = _luaState.GetTop(); - return _translator.PopValues(_luaState, top - 1)[0]; - } - - /// - /// Pushes a value onto the lua stack. - /// - /// Value to push. - public void Push(object value) - { - _translator.Push(_luaState, value); - } - #endregion - - internal void DisposeInternal(int reference, bool finalized) - { - if (finalized && _translator != null) - { - _translator.AddFinalizedReference(reference); - return; - } - - if (_luaState != null && !finalized) - _luaState.Unref(reference); - } - - /* - * Gets a field of the table corresponding to the provided reference - * using rawget (do not use metatables) - */ - internal object RawGetObject(int reference, string field) - { - int oldTop = _luaState.GetTop(); - _luaState.GetRef(reference); - _luaState.PushString(field); - _luaState.RawGet(-2); - object obj = _translator.GetObject(_luaState, -1); - _luaState.SetTop(oldTop); - return obj; - } - - /* - * Gets a field of the table or userdata corresponding to the provided reference - */ - internal object GetObject(int reference, string field) - { - int oldTop = _luaState.GetTop(); - _luaState.GetRef(reference); - object returnValue = GetObject(FullPathToArray(field)); - _luaState.SetTop(oldTop); - return returnValue; - } - - /* - * Gets a numeric field of the table or userdata corresponding the the provided reference - */ - internal object GetObject(int reference, object field) - { - int oldTop = _luaState.GetTop(); - _luaState.GetRef(reference); - _translator.Push(_luaState, field); - _luaState.GetTable(-2); - object returnValue = _translator.GetObject(_luaState, -1); - _luaState.SetTop(oldTop); - return returnValue; - } - - /* - * Sets a field of the table or userdata corresponding the the provided reference - * to the provided value - */ - internal void SetObject(int reference, string field, object val) - { - int oldTop = _luaState.GetTop(); - _luaState.GetRef(reference); - SetObject(FullPathToArray(field), val); - _luaState.SetTop(oldTop); - } - - /* - * Sets a numeric field of the table or userdata corresponding the the provided reference - * to the provided value - */ - internal void SetObject(int reference, object field, object val) - { - int oldTop = _luaState.GetTop(); - _luaState.GetRef(reference); - _translator.Push(_luaState, field); - _translator.Push(_luaState, val); - _luaState.SetTable(-3); - _luaState.SetTop(oldTop); - } - - public LuaFunction RegisterFunction(string path, MethodBase function) - { - return RegisterFunction(path, null, function); - } - - /* - * Registers an object's method as a Lua function (global or table field) - * The method may have any signature - */ - public LuaFunction RegisterFunction(string path, object target, MethodBase function) - { - // We leave nothing on the stack when we are done - int oldTop = _luaState.GetTop(); - var wrapper = new LuaMethodWrapper(_translator, target, new ProxyType(function.DeclaringType), function); - - _translator.Push(_luaState, new LuaNativeFunction(wrapper.InvokeFunction)); - - object value = _translator.GetObject(_luaState, -1); - SetObjectToPath(path, value); - - LuaFunction f = GetFunction(path); - _luaState.SetTop(oldTop); - return f; - } - - /* - * Compares the two values referenced by ref1 and ref2 for equality - */ - internal bool CompareRef(int ref1, int ref2) - { - int top = _luaState.GetTop(); - _luaState.GetRef(ref1); - _luaState.GetRef(ref2); - bool equal = _luaState.AreEqual(-1, -2); - _luaState.SetTop(top); - return equal; - } - - // ReSharper disable once InconsistentNaming - internal void PushCSFunction(LuaNativeFunction function) - { - _translator.PushFunction(_luaState, function); - } - - #region IDisposable Members - - ~Lua() - { - Dispose(); - } - public virtual void Dispose() - { - if (_translator != null) - { - _translator.PendingEvents.Dispose(); - if (_translator.Tag != IntPtr.Zero) - Marshal.FreeHGlobal(_translator.Tag); - _translator = null; - } - - Close(); - GC.SuppressFinalize(this); - } - #endregion - } -} diff --git a/src/LUA/LuaBase.cs b/src/LUA/LuaBase.cs deleted file mode 100644 index 75a5441..0000000 --- a/src/LUA/LuaBase.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; - -namespace NLua -{ - /// - /// Base class to provide consistent disposal flow across lua objects. Uses code provided by Yves Duhoux and suggestions by Hans Schmeidenbacher and Qingrui Li - /// - public abstract class LuaBase : IDisposable - { - private bool _disposed; - protected readonly int _Reference; - Lua _lua; - - protected bool TryGet(out Lua lua) - { - if (_lua.State == null) - { - lua = null; - return false; - } - - lua = _lua; - return true; - } - protected LuaBase(int reference, Lua lua) - { - _lua = lua; - _Reference = reference; - } - - ~LuaBase() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - void DisposeLuaReference(bool finalized) - { - if (_lua == null) - return; - Lua lua; - if (!TryGet(out lua)) - return; - - lua.DisposeInternal(_Reference, finalized); - } - public virtual void Dispose(bool disposeManagedResources) - { - if (_disposed) - return; - - bool finalized = !disposeManagedResources; - - if (_Reference != 0) - { - DisposeLuaReference(finalized); - } - - _lua = null; - _disposed = true; - } - - public override bool Equals(object o) - { - var reference = o as LuaBase; - if (reference == null) - return false; - - Lua lua; - if (!TryGet(out lua)) - return false; - - return lua.CompareRef(reference._Reference, _Reference); - } - - public override int GetHashCode() - { - return _Reference; - } - } -} \ No newline at end of file diff --git a/src/LUA/LuaFunction.cs b/src/LUA/LuaFunction.cs deleted file mode 100644 index 9e2674f..0000000 --- a/src/LUA/LuaFunction.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using KeraLua; - -using LuaState = KeraLua.Lua; -using LuaNativeFunction = KeraLua.LuaFunction; - -namespace NLua -{ - public class LuaFunction : LuaBase - { - internal readonly LuaNativeFunction function; - - public LuaFunction(int reference, Lua interpreter):base(reference, interpreter) - { - function = null; - } - - public LuaFunction(LuaNativeFunction nativeFunction, Lua interpreter):base (0, interpreter) - { - function = nativeFunction; - } - - /* - * Calls the function casting return values to the types - * in returnTypes - */ - internal object[] Call(object[] args, Type[] returnTypes) - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.CallFunction(this, args, returnTypes); - } - - /* - * Calls the function and returns its return values inside - * an array - */ - public object[] Call(params object[] args) - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.CallFunction(this, args); - } - - /* - * Pushes the function into the Lua stack - */ - internal void Push(LuaState luaState) - { - Lua lua; - if (!TryGet(out lua)) - return; - - if (_Reference != 0) - luaState.RawGetInteger(LuaRegistry.Index, _Reference); - else - lua.PushCSFunction(function); - } - - public override string ToString() - { - return "function"; - } - - public override bool Equals(object o) - { - var l = o as LuaFunction; - - if (l == null) - return false; - - Lua lua; - if (!TryGet(out lua)) - return false; - - if (_Reference != 0 && l._Reference != 0) - return lua.CompareRef(l._Reference, _Reference); - - return function == l.function; - } - - public override int GetHashCode() - { - return _Reference != 0 ? _Reference : function.GetHashCode(); - } - } -} \ No newline at end of file diff --git a/src/LUA/LuaGlobalAttribute.cs b/src/LUA/LuaGlobalAttribute.cs deleted file mode 100644 index 27e6393..0000000 --- a/src/LUA/LuaGlobalAttribute.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace NLua -{ - /// - /// Marks a method for global usage in Lua scripts - /// - /// - /// - [AttributeUsage(AttributeTargets.Method)] - public sealed class LuaGlobalAttribute : Attribute - { - /// - /// An alternative name to use for calling the function in Lua - leave empty for CLR name - /// - public string Name { get; set; } - - /// - /// A description of the function - /// - public string Description { get; set; } - } -} \ No newline at end of file diff --git a/src/LUA/LuaHideAttribute.cs b/src/LUA/LuaHideAttribute.cs deleted file mode 100644 index c5840fd..0000000 --- a/src/LUA/LuaHideAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace NLua -{ - /// - /// Marks a method, field or property to be hidden from Lua auto-completion - /// - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class LuaHideAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/LUA/LuaRegistrationHelper.cs b/src/LUA/LuaRegistrationHelper.cs deleted file mode 100644 index eca12a9..0000000 --- a/src/LUA/LuaRegistrationHelper.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Reflection; -using System.Diagnostics.CodeAnalysis; - -namespace NLua -{ - public static class LuaRegistrationHelper - { - #region Tagged instance methods - /// - /// Registers all public instance methods in an object tagged with as Lua global functions - /// - /// The Lua VM to add the methods to - /// The object to get the methods from - public static void TaggedInstanceMethods(Lua lua, object o) - { - #region Sanity checks - if (lua == null) - throw new ArgumentNullException(nameof(lua)); - - if (o == null) - throw new ArgumentNullException(nameof(o)); - #endregion - - foreach (var method in o.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public)) - { - foreach (LuaGlobalAttribute attribute in method.GetCustomAttributes(typeof(LuaGlobalAttribute), true)) - { - if (string.IsNullOrEmpty(attribute.Name)) - lua.RegisterFunction(method.Name, o, method); // CLR name - else - lua.RegisterFunction(attribute.Name, o, method); // Custom name - } - } - } - #endregion - - #region Tagged static methods - /// - /// Registers all public static methods in a class tagged with as Lua global functions - /// - /// The Lua VM to add the methods to - /// The class type to get the methods from - public static void TaggedStaticMethods(Lua lua, Type type) - { - #region Sanity checks - if (lua == null) - throw new ArgumentNullException(nameof(lua)); - - if (type == null) - throw new ArgumentNullException(nameof(type)); - - if (!type.IsClass) - throw new ArgumentException("The type must be a class!", nameof(type)); - #endregion - - foreach (var method in type.GetMethods(BindingFlags.Static | BindingFlags.Public)) - { - foreach (LuaGlobalAttribute attribute in method.GetCustomAttributes(typeof(LuaGlobalAttribute), false)) - { - if (string.IsNullOrEmpty(attribute.Name)) - lua.RegisterFunction(method.Name, null, method); // CLR name - else - lua.RegisterFunction(attribute.Name, null, method); // Custom name - } - } - } - #endregion - - /// - /// Registers an enumeration's values for usage as a Lua variable table - /// - /// The enum type to register - /// The Lua VM to add the enum to - [SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification = "The type parameter is used to select an enum type")] - public static void Enumeration(Lua lua) - { - if (lua == null) - throw new ArgumentNullException(nameof(lua)); - - Type type = typeof(T); - - if (!type.IsEnum) - throw new ArgumentException("The type must be an enumeration!"); - - - string[] names = Enum.GetNames(type); - var values = (T[])Enum.GetValues(type); - lua.NewTable(type.Name); - - for (int i = 0; i < names.Length; i++) - { - string path = type.Name + "." + names[i]; - lua.SetObjectToPath(path, values[i]); - } - } - } -} diff --git a/src/LUA/LuaTable.cs b/src/LUA/LuaTable.cs deleted file mode 100644 index 8fff2e9..0000000 --- a/src/LUA/LuaTable.cs +++ /dev/null @@ -1,120 +0,0 @@ - -using System; -using System.Collections; - -using NLua.Extensions; - -using LuaState = KeraLua.Lua; - -namespace NLua -{ - public class LuaTable : LuaBase - { - public LuaTable(int reference, Lua interpreter): base(reference, interpreter) - { - } - - /* - * Indexer for string fields of the table - */ - public object this[string field] { - get - { - Lua lua; - if (!TryGet(out lua)) - return null; - return lua.GetObject(_Reference, field); - } - set - { - Lua lua; - if (!TryGet(out lua)) - return; - lua.SetObject(_Reference, field, value); - } - } - - /* - * Indexer for numeric fields of the table - */ - public object this[object field] { - get - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.GetObject(_Reference, field); - } - set - { - Lua lua; - if (!TryGet(out lua)) - return; - - lua.SetObject(_Reference, field, value); - } - } - - public IDictionaryEnumerator GetEnumerator() - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.GetTableDict(this).GetEnumerator(); - } - - public ICollection Keys - { - get - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.GetTableDict(this).Keys; - } - } - - - public ICollection Values - { - get - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.GetTableDict(this).Values; - } - } - - - /* - * Gets an string fields of a table ignoring its metatable, - * if it exists - */ - internal object RawGet(string field) - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.RawGetObject(_Reference, field); - } - - /* - * Pushes this table into the Lua stack - */ - internal void Push(LuaState luaState) - { - luaState.GetRef(_Reference); - } - - public override string ToString() - { - return "table"; - } - } -} \ No newline at end of file diff --git a/src/LUA/LuaUserData.cs b/src/LUA/LuaUserData.cs deleted file mode 100644 index 147d474..0000000 --- a/src/LUA/LuaUserData.cs +++ /dev/null @@ -1,74 +0,0 @@ - -using System; - -namespace NLua -{ - public class LuaUserData : LuaBase - { - public LuaUserData(int reference, Lua interpreter):base(reference, interpreter) - { - } - - /* - * Indexer for string fields of the userdata - */ - public object this[string field] { - get - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.GetObject(_Reference, field); - } - set - { - Lua lua; - if (!TryGet(out lua)) - return; - - lua.SetObject(_Reference, field, value); - } - } - - /* - * Indexer for numeric fields of the userdata - */ - public object this[object field] { - get - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.GetObject(_Reference, field); - } - set - { - Lua lua; - if (!TryGet(out lua)) - return; - - lua.SetObject(_Reference, field, value); - } - } - - /* - * Calls the userdata and returns its return values inside - * an array - */ - public object[] Call(params object[] args) - { - Lua lua; - if (!TryGet(out lua)) - return null; - - return lua.CallFunction(this, args); - } - - public override string ToString() - { - return "userdata"; - } - } -} \ No newline at end of file diff --git a/src/LUA/Metatables.cs b/src/LUA/Metatables.cs deleted file mode 100644 index a4b9b19..0000000 --- a/src/LUA/Metatables.cs +++ /dev/null @@ -1,1636 +0,0 @@ -using System; -using System.Linq; -using System.Collections; -using System.Reflection; -using System.Diagnostics; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -using KeraLua; - -using NLua.Method; -using NLua.Extensions; - -#if __IOS__ || __TVOS__ || __WATCHOS__ - using ObjCRuntime; -#endif - -using LuaState = KeraLua.Lua; -using LuaNativeFunction = KeraLua.LuaFunction; -using NLua.Exceptions; - -namespace NLua -{ - public class MetaFunctions - { - public static readonly LuaNativeFunction GcFunction = CollectObject; - public static readonly LuaNativeFunction IndexFunction = GetMethod; - public static readonly LuaNativeFunction NewIndexFunction = SetFieldOrProperty; - public static readonly LuaNativeFunction BaseIndexFunction = GetBaseMethod; - public static readonly LuaNativeFunction ClassIndexFunction = GetClassMethod; - public static readonly LuaNativeFunction ClassNewIndexFunction = SetClassFieldOrProperty; - public static readonly LuaNativeFunction ExecuteDelegateFunction = RunFunctionDelegate; - public static readonly LuaNativeFunction CallConstructorFunction = CallConstructor; - public static readonly LuaNativeFunction ToStringFunction = ToStringLua; - public static readonly LuaNativeFunction CallDelegateFunction = CallDelegate; - - public static readonly LuaNativeFunction AddFunction = AddLua; - public static readonly LuaNativeFunction SubtractFunction = SubtractLua; - public static readonly LuaNativeFunction MultiplyFunction = MultiplyLua; - public static readonly LuaNativeFunction DivisionFunction = DivideLua; - public static readonly LuaNativeFunction ModulosFunction = ModLua; - public static readonly LuaNativeFunction UnaryNegationFunction = UnaryNegationLua; - public static readonly LuaNativeFunction EqualFunction = EqualLua; - public static readonly LuaNativeFunction LessThanFunction = LessThanLua; - public static readonly LuaNativeFunction LessThanOrEqualFunction = LessThanOrEqualLua; - - readonly Dictionary> _memberCache = new Dictionary>(); - readonly ObjectTranslator _translator; - - /* - * __index metafunction for CLR objects. Implemented in Lua. - */ - public const string LuaIndexFunction = @"local function a(b,c)local d=getmetatable(b)local e=d.cache[c]if e~=nil then return e else local f,g=get_object_member(b,c)if g then d.cache[c]=f end;return f end end;return a"; - //@"local function index(obj,name) - // local meta = getmetatable(obj) - // local cached = meta.cache[name] - // if cached ~= nil then - // return cached - // else - // local value,isFunc = get_object_member(obj,name) - - // if isFunc then - // meta.cache[name]=value - // end - // return value - // end - //end - //return index"; - - public MetaFunctions(ObjectTranslator translator) - { - _translator = translator; - } - - /* - * __call metafunction of CLR delegates, retrieves and calls the delegate. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int RunFunctionDelegate(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - var func = (LuaNativeFunction)translator.GetRawNetObject(state, 1); - state.Remove(1); - int result = func(luaState); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - /* - * __gc metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int CollectObject(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - var translator = ObjectTranslatorPool.Instance.Find(luaState); - return CollectObject(luaState, translator); - } - - private static int CollectObject(LuaState luaState, ObjectTranslator translator) - { - int udata = luaState.RawNetObj(1); - - if (udata != -1) - translator.CollectObject(udata); - - return 0; - } - - /* - * __tostring metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int ToStringLua(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - var translator = ObjectTranslatorPool.Instance.Find(luaState); - return ToStringLua(luaState, translator); - } - - private static int ToStringLua(LuaState luaState, ObjectTranslator translator) - { - object obj = translator.GetRawNetObject(luaState, 1); - - if (obj != null) - translator.Push(luaState, obj + ": " + obj.GetHashCode()); - else - luaState.PushNil(); - - return 1; - } - - - /* - * __add metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int AddLua(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = MatchOperator(state, "op_Addition", translator); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - /* - * __sub metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int SubtractLua(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = MatchOperator(state, "op_Subtraction", translator); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - /* - * __mul metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int MultiplyLua(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = MatchOperator(state, "op_Multiply", translator); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - /* - * __div metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int DivideLua(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = MatchOperator(state, "op_Division", translator); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - /* - * __mod metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int ModLua(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = MatchOperator(state, "op_Modulus", translator); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - /* - * __unm metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int UnaryNegationLua(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = UnaryNegationLua(state, translator); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - static int UnaryNegationLua(LuaState luaState, ObjectTranslator translator) - { - object obj1 = translator.GetRawNetObject(luaState, 1); - - if (obj1 == null) - { - translator.ThrowError(luaState, "Cannot negate a nil object"); - return 1; - } - - Type type = obj1.GetType(); - MethodInfo opUnaryNegation = type.GetMethod("op_UnaryNegation"); - - if (opUnaryNegation == null) - { - translator.ThrowError(luaState, "Cannot negate object (" + type.Name + " does not overload the operator -)"); - return 1; - } - obj1 = opUnaryNegation.Invoke(obj1, new [] { obj1 }); - translator.Push(luaState, obj1); - return 1; - } - - - /* - * __eq metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int EqualLua(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = MatchOperator(state, "op_Equality", translator); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - /* - * __lt metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int LessThanLua(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = MatchOperator(state, "op_LessThan", translator); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - /* - * __le metafunction of CLR objects. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int LessThanOrEqualLua(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = MatchOperator(state, "op_LessThanOrEqual", translator); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - /// - /// Debug tool to dump the lua stack - /// - /// FIXME, move somewhere else - public static void DumpStack(ObjectTranslator translator, LuaState luaState) - { - int depth = luaState.GetTop(); - - Debug.WriteLine("lua stack depth: {0}", depth); - - for (int i = 1; i <= depth; i++) - { - var type = luaState.Type(i); - // we dump stacks when deep in calls, calling typename while the stack is in flux can fail sometimes, so manually check for key types - string typestr = (type == LuaType.Table) ? "table" : luaState.TypeName(type); - string strrep = luaState.ToString(i, false); - - if (type == LuaType.UserData) - { - object obj = translator.GetRawNetObject(luaState, i); - strrep = obj.ToString(); - } - - Debug.WriteLine("{0}: ({1}) {2}", i, typestr, strrep); - } - } - - /* - * Called by the __index metafunction of CLR objects in case the - * method is not cached or it is a field/property/event. - * Receives the object and the member name as arguments and returns - * either the value of the member or a delegate to call it. - * If the member does not exist returns nil. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int GetMethod(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - var translator = ObjectTranslatorPool.Instance.Find(luaState); - var instance = translator.MetaFunctionsInstance; - int result = instance.GetMethodInternal(luaState); - var exception = translator.GetObject(luaState, -1) as LuaScriptException; - - if (exception != null) - return luaState.Error(); - return result; - } - - private int GetMethodInternal(LuaState luaState) - { - object obj = _translator.GetRawNetObject(luaState, 1); - - if (obj == null) - { - _translator.ThrowError(luaState, "Trying to index an invalid object reference"); - return 1; - } - - object index = _translator.GetObject(luaState, 2); - string methodName = index as string; // will be null if not a string arg - var objType = obj.GetType(); - var proxyType = new ProxyType(objType); - - // Handle the most common case, looking up the method by name. - // CP: This will fail when using indexers and attempting to get a value with the same name as a property of the object, - // ie: xmlelement['item'] <- item is a property of xmlelement - - if (!string.IsNullOrEmpty(methodName) && IsMemberPresent(proxyType, methodName)) - return GetMember(luaState, proxyType, obj, methodName, BindingFlags.Instance); - - // Try to access by array if the type is right and index is an int (lua numbers always come across as double) - if (TryAccessByArray(luaState, objType, obj, index)) - return 1; - - int fallback = GetMethodFallback(luaState, objType, obj, index, methodName); - if (fallback != 0) - return fallback; - - if (!string.IsNullOrEmpty(methodName) || index != null) - { - if (string.IsNullOrEmpty(methodName)) - methodName = index.ToString(); - - return PushInvalidMethodCall(luaState, objType, methodName); - } - - luaState.PushBoolean(false); - return 2; - } - - private int PushInvalidMethodCall(LuaState luaState, Type type, string name) - { - SetMemberCache(type, name, null); - - _translator.Push(luaState, null); - _translator.Push(luaState, false); - return 2; - } - - private bool TryAccessByArray(LuaState luaState, - Type objType, - object obj, - object index) - { - if (!objType.IsArray) - return false; - - int intIndex = -1; - if (index is long l) - intIndex = (int)l; - else if (index is double d) - intIndex = (int)d; - - if (intIndex == -1) - return false; - - Type type = objType.UnderlyingSystemType; - - if (type == typeof(long[])) - { - long[] arr = (long[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - if (type == typeof(float[])) - { - float[] arr = (float[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - if (type == typeof(double[])) - { - double[] arr = (double[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - if (type == typeof(int[])) - { - int[] arr = (int[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - if (type == typeof(byte[])) - { - byte[] arr = (byte[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - if (type == typeof(short[])) - { - short[] arr = (short[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - if (type == typeof(ushort[])) - { - ushort[] arr = (ushort[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - if (type == typeof(ulong[])) - { - ulong[] arr = (ulong[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - if (type == typeof(uint[])) - { - uint[] arr = (uint[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - if (type == typeof(sbyte[])) - { - sbyte[] arr = (sbyte[])obj; - _translator.Push(luaState, arr[intIndex]); - return true; - } - - var array = (Array)obj; - object element = array.GetValue(intIndex); - _translator.Push(luaState, element); - return true; - } - - private int GetMethodFallback - (LuaState luaState, - Type objType, - object obj, - object index, - string methodName) - { - object method; - if (!string.IsNullOrEmpty(methodName) && TryGetExtensionMethod(objType, methodName, out method)) - { - return PushExtensionMethod(luaState, objType, obj, methodName, method); - } - // Try to use get_Item to index into this .net object - MethodInfo[] methods = objType.GetMethods(); - - int res = TryIndexMethods(luaState, methods, obj, index); - if (res != 0) - return res; - - // Fallback to GetRuntimeMethods - methods = objType.GetRuntimeMethods().ToArray(); - - res = TryIndexMethods(luaState, methods, obj, index); - if (res != 0) - return res; - - res = TryGetValueForKeyMethods(luaState, methods, obj, index); - if (res != 0) - return res; - - // Try find explicity interface implementation - MethodInfo explicitInterfaceMethod = objType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance). - FirstOrDefault(m => m.Name == methodName && m.IsPrivate && m.IsVirtual && m.IsFinal); - - if (explicitInterfaceMethod != null) - { - var proxyType = new ProxyType(objType); - var methodWrapper = new LuaMethodWrapper(_translator, obj, proxyType, explicitInterfaceMethod); - var invokeDelegate = new LuaNativeFunction(methodWrapper.InvokeFunction); - - SetMemberCache(proxyType, methodName, invokeDelegate); - - _translator.PushFunction(luaState, invokeDelegate); - _translator.Push(luaState, true); - return 2; - } - - return 0; - } - - private int TryGetValueForKeyMethods(LuaState luaState, MethodInfo[] methods, object obj, object index) - { - foreach (MethodInfo methodInfo in methods) - { - if (methodInfo.Name != "TryGetValueForKey") - continue; - - // Check if the signature matches the input - if (methodInfo.GetParameters().Length != 2) - continue; - - ParameterInfo[] actualParams = methodInfo.GetParameters(); - - // Get the index in a form acceptable to the getter - index = _translator.GetAsType(luaState, 2, actualParams[0].ParameterType); - - // If the index type and the parameter doesn't match, just skip it - if (index == null) - break; - - object[] args = new object[2]; - - // Just call the indexer - if out of bounds an exception will happen - args[0] = index; - - try - { - bool found = (bool)methodInfo.Invoke(obj, args); - - if (!found) - { - _translator.ThrowError(luaState, "key not found: " + index); - return 1; - } - - _translator.Push(luaState, args[1]); - return 1; - } - catch (TargetInvocationException e) - { - // Provide a more readable description for the common case of key not found - if (e.InnerException is KeyNotFoundException) - _translator.ThrowError(luaState, "key '" + index + "' not found "); - else - _translator.ThrowError(luaState, "exception indexing '" + index + "' " + e.Message); - - return 1; - } - } - return 0; - } - - - private int TryIndexMethods(LuaState luaState, MethodInfo [] methods, object obj, object index) - { - foreach (MethodInfo methodInfo in methods) - { - if (methodInfo.Name != "get_Item") - continue; - - // Check if the signature matches the input - if (methodInfo.GetParameters().Length != 1) - continue; - - ParameterInfo[] actualParams = methodInfo.GetParameters(); - - // Get the index in a form acceptable to the getter - index = _translator.GetAsType(luaState, 2, actualParams[0].ParameterType); - - // If the index type and the parameter doesn't match, just skip it - if (index == null) - continue; - - object[] args = new object[1]; - - // Just call the indexer - if out of bounds an exception will happen - args[0] = index; - - try - { - object result = methodInfo.Invoke(obj, args); - _translator.Push(luaState, result); - return 1; - } - catch (TargetInvocationException e) - { - // Provide a more readable description for the common case of key not found - if (e.InnerException is KeyNotFoundException) - _translator.ThrowError(luaState, "key '" + index + "' not found "); - else - _translator.ThrowError(luaState, "exception indexing '" + index + "' " + e.Message); - - return 1; - } - } - return 0; - } - - /* - * __index metafunction of base classes (the base field of Lua tables). - * Adds a prefix to the method name to call the base version of the method. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int GetBaseMethod(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - var translator = ObjectTranslatorPool.Instance.Find(luaState); - var instance = translator.MetaFunctionsInstance; - int result = instance.GetBaseMethodInternal(luaState); - var exception = translator.GetObject(luaState, -1) as LuaScriptException; - - if (exception != null) - return luaState.Error(); - return result; - } - - private int GetBaseMethodInternal(LuaState luaState) - { - object obj = _translator.GetRawNetObject(luaState, 1); - - if (obj == null) - { - _translator.ThrowError(luaState, "Trying to index an invalid object reference"); - return 1; - } - - string methodName = luaState.ToString(2, false); - - if (string.IsNullOrEmpty(methodName)) - { - luaState.PushNil(); - luaState.PushBoolean(false); - return 2; - } - - GetMember(luaState, new ProxyType(obj.GetType()), obj, "__luaInterface_base_" + methodName, BindingFlags.Instance); - luaState.SetTop(-2); - - if (luaState.Type(-1) == LuaType.Nil) - { - luaState.SetTop(-2); - return GetMember(luaState, new ProxyType(obj.GetType()), obj, methodName, BindingFlags.Instance); - } - - luaState.PushBoolean(false); - return 2; - } - - /// - /// Does this method exist as either an instance or static? - /// - /// - /// - /// - bool IsMemberPresent(ProxyType objType, string methodName) - { - object cachedMember = CheckMemberCache(objType, methodName); - - if (cachedMember != null) - return true; - - var members = objType.GetMember(methodName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public); - return members.Length > 0; - } - - bool TryGetExtensionMethod(Type type, string name, out object method) - { - object cachedMember = CheckMemberCache(type, name); - - if (cachedMember != null) - { - method = cachedMember; - return true; - } - - MethodInfo methodInfo; - bool found = _translator.TryGetExtensionMethod(type, name, out methodInfo); - method = methodInfo; - return found; - } - - int PushExtensionMethod(LuaState luaState, Type type, object obj, string name, object method) - { - var cachedMember = method as LuaNativeFunction; - - if (cachedMember != null) - { - _translator.PushFunction(luaState, cachedMember); - _translator.Push(luaState, true); - return 2; - } - - var methodInfo = (MethodInfo)method; - var methodWrapper = new LuaMethodWrapper(_translator, obj, new ProxyType(type), methodInfo); - var invokeDelegate = new LuaNativeFunction(methodWrapper.InvokeFunction); - - SetMemberCache(type, name, invokeDelegate); - - _translator.PushFunction(luaState, invokeDelegate); - _translator.Push(luaState, true); - return 2; - } - - /* - * Pushes the value of a member or a delegate to call it, depending on the type of - * the member. Works with static or instance members. - * Uses reflection to find members, and stores the reflected MemberInfo object in - * a cache (indexed by the type of the object and the name of the member). - */ - int GetMember(LuaState luaState, ProxyType objType, object obj, string methodName, BindingFlags bindingType) - { - bool implicitStatic = false; - MemberInfo member = null; - object cachedMember = CheckMemberCache(objType, methodName); - - if (cachedMember is LuaNativeFunction) - { - _translator.PushFunction(luaState, (LuaNativeFunction)cachedMember); - _translator.Push(luaState, true); - return 2; - } - if (cachedMember != null) - member = (MemberInfo)cachedMember; - else - { - var members = objType.GetMember(methodName, bindingType | BindingFlags.Public); - - if (members.Length > 0) - member = members[0]; - else - { - // If we can't find any suitable instance members, try to find them as statics - but we only want to allow implicit static - members = objType.GetMember(methodName, bindingType | BindingFlags.Static | BindingFlags.Public); - - if (members.Length > 0) - { - member = members[0]; - implicitStatic = true; - } - } - } - - if (member != null) - { - if (member.MemberType == MemberTypes.Field) - { - var field = (FieldInfo)member; - - if (cachedMember == null) - SetMemberCache(objType, methodName, member); - - try - { - var value = field.GetValue(obj); - _translator.Push(luaState, value); - } - catch - { - Debug.WriteLine("[Exception] Fail to get field value"); - luaState.PushNil(); - } - } - else if (member.MemberType == MemberTypes.Property) - { - var property = (PropertyInfo)member; - if (cachedMember == null) - SetMemberCache(objType, methodName, member); - - try - { - object value = property.GetValue(obj, null); - _translator.Push(luaState, value); - } - catch (ArgumentException) - { - // If we can't find the getter in our class, recurse up to the base class and see - // if they can help. - if (objType.UnderlyingSystemType != typeof(object)) - return GetMember(luaState, new ProxyType(objType.UnderlyingSystemType.BaseType), obj, methodName, bindingType); - luaState.PushNil(); - } - catch (TargetInvocationException e) - { // Convert this exception into a Lua error - ThrowError(luaState, e); - luaState.PushNil(); - } - } - else if (member.MemberType == MemberTypes.Event) - { - var eventInfo = (EventInfo)member; - if (cachedMember == null) - SetMemberCache(objType, methodName, member); - - _translator.Push(luaState, new RegisterEventHandler(_translator.PendingEvents, obj, eventInfo)); - } - else if (!implicitStatic) - { - if (member.MemberType == MemberTypes.NestedType && member.DeclaringType != null) - { - if (cachedMember == null) - SetMemberCache(objType, methodName, member); - - // Find the name of our class - string name = member.Name; - Type decType = member.DeclaringType; - - // Build a new long name and try to find the type by name - string longName = decType.FullName + "+" + name; - var nestedType = _translator.FindType(longName); - _translator.PushType(luaState, nestedType); - } - else - { - // Member type must be 'method' - var methodWrapper = new LuaMethodWrapper(_translator, objType, methodName, bindingType); - var wrapper = methodWrapper.InvokeFunction; - - if (cachedMember == null) - SetMemberCache(objType, methodName, wrapper); - - _translator.PushFunction(luaState, wrapper); - _translator.Push(luaState, true); - return 2; - } - } - else - { - // If we reach this point we found a static method, but can't use it in this context because the user passed in an instance - _translator.ThrowError(luaState, "Can't pass instance to static method " + methodName); - return 1; - } - } - else - { - if (objType.UnderlyingSystemType != typeof(object)) - return GetMember(luaState, new ProxyType(objType.UnderlyingSystemType.BaseType), obj, methodName, bindingType); - - // We want to throw an exception because merely returning 'nil' in this case - // is not sufficient. valid data members may return nil and therefore there must be some - // way to know the member just doesn't exist. - _translator.ThrowError(luaState, "Unknown member name " + methodName); - return 1; - } - - // Push false because we are NOT returning a function (see luaIndexFunction) - _translator.Push(luaState, false); - return 2; - } - - /* - * Checks if a MemberInfo object is cached, returning it or null. - */ - object CheckMemberCache(Type objType, string memberName) - { - return CheckMemberCache(new ProxyType(objType), memberName); - } - - object CheckMemberCache(ProxyType objType, string memberName) - { - Dictionary members; - - if (!_memberCache.TryGetValue(objType, out members)) - return null; - - object memberValue; - - if (members == null || !members.TryGetValue(memberName, out memberValue)) - return null; - - return memberValue; - } - - /* - * Stores a MemberInfo object in the member cache. - */ - void SetMemberCache(Type objType, string memberName, object member) - { - SetMemberCache(new ProxyType(objType), memberName, member); - } - - void SetMemberCache(ProxyType objType, string memberName, object member) - { - Dictionary members; - Dictionary memberCacheValue; - - if (_memberCache.TryGetValue(objType, out memberCacheValue)) - { - members = memberCacheValue; - } - else - { - members = new Dictionary(); - _memberCache[objType] = members; - } - - members[memberName] = member; - } - - /* - * __newindex metafunction of CLR objects. Receives the object, - * the member name and the value to be stored as arguments. Throws - * and error if the assignment is invalid. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int SetFieldOrProperty(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - var translator = ObjectTranslatorPool.Instance.Find(luaState); - var instance = translator.MetaFunctionsInstance; - int result = instance.SetFieldOrPropertyInternal(luaState); - var exception = translator.GetObject(luaState, -1) as LuaScriptException; - - if (exception != null) - return luaState.Error(); - return result; - } - - private int SetFieldOrPropertyInternal(LuaState luaState) - { - object target = _translator.GetRawNetObject(luaState, 1); - - if (target == null) - { - _translator.ThrowError(luaState, "trying to index and invalid object reference"); - return 1; - } - - var type = target.GetType(); - - // First try to look up the parameter as a property name - string detailMessage; - bool didMember = TrySetMember(luaState, new ProxyType(type), target, BindingFlags.Instance, out detailMessage); - - if (didMember) - return 0; // Must have found the property name - - // We didn't find a property name, now see if we can use a [] style this accessor to set array contents - try - { - if (type.IsArray && luaState.IsNumber(2)) - { - int index = (int)luaState.ToNumber(2); - var arr = (Array)target; - object val = _translator.GetAsType(luaState, 3, arr.GetType().GetElementType()); - arr.SetValue(val, index); - } - else - { - // Try to see if we have a this[] accessor - var setter = type.GetMethod("set_Item"); - if (setter != null) - { - var args = setter.GetParameters(); - var valueType = args[1].ParameterType; - - // The new value the user specified - object val = _translator.GetAsType(luaState, 3, valueType); - var indexType = args[0].ParameterType; - object index = _translator.GetAsType(luaState, 2, indexType); - - object[] methodArgs = new object[2]; - - // Just call the indexer - if out of bounds an exception will happen - methodArgs[0] = index; - methodArgs[1] = val; - setter.Invoke(target, methodArgs); - } - else - { - _translator.ThrowError(luaState, detailMessage); // Pass the original message from trySetMember because it is probably best - return 1; - } - } - } - catch (Exception e) - { - ThrowError(luaState, e); - return 1; - } - - return 0; - } - - /// - /// Tries to set a named property or field - /// - /// - /// - /// - /// - /// false if unable to find the named member, true for success - bool TrySetMember(LuaState luaState, ProxyType targetType, object target, BindingFlags bindingType, out string detailMessage) - { - detailMessage = null; // No error yet - - // If not already a string just return - we don't want to call tostring - which has the side effect of - // changing the lua typecode to string - // Note: We don't use isstring because the standard lua C isstring considers either strings or numbers to - // be true for isstring. - if (luaState.Type(2) != LuaType.String) - { - detailMessage = "property names must be strings"; - return false; - } - - // We only look up property names by string - string fieldName = luaState.ToString(2, false); - if (string.IsNullOrEmpty(fieldName) || !(char.IsLetter(fieldName[0]) || fieldName[0] == '_')) - { - detailMessage = "Invalid property name"; - return false; - } - - // Find our member via reflection or the cache - var member = (MemberInfo)CheckMemberCache(targetType, fieldName); - if (member == null) - { - var members = targetType.GetMember(fieldName, bindingType | BindingFlags.Public); - - if (members.Length <= 0) - { - detailMessage = "field or property '" + fieldName + "' does not exist"; - return false; - } - - member = members[0]; - SetMemberCache(targetType, fieldName, member); - } - - if (member.MemberType == MemberTypes.Field) - { - var field = (FieldInfo)member; - object val = _translator.GetAsType(luaState, 3, field.FieldType); - - try - { - field.SetValue(target, val); - } - catch (Exception e) - { - detailMessage = "Error setting field: " + e.Message; - return false; - } - - return true; - } - if (member.MemberType == MemberTypes.Property) - { - var property = (PropertyInfo)member; - object val = _translator.GetAsType(luaState, 3, property.PropertyType); - - try - { - property.SetValue(target, val, null); - } - catch (Exception e) - { - detailMessage = "Error setting property: " + e.Message; - return false; - } - - return true; - } - - detailMessage = "'" + fieldName + "' is not a .net field or property"; - return false; - } - - /* - * Writes to fields or properties, either static or instance. Throws an error - * if the operation is invalid. - */ - private int SetMember(LuaState luaState, ProxyType targetType, object target, BindingFlags bindingType) - { - string detail; - bool success = TrySetMember(luaState, targetType, target, bindingType, out detail); - - if (!success) - { - _translator.ThrowError(luaState, detail); - return 1; - } - - return 0; - } - - /// - /// Convert a C# exception into a Lua error - /// - /// - /// - /// We try to look into the exception to give the most meaningful description - void ThrowError(LuaState luaState, Exception e) - { - // If we got inside a reflection show what really happened - var te = e as TargetInvocationException; - - if (te != null) - e = te.InnerException; - - _translator.ThrowError(luaState, e); - } - - /* - * __index metafunction of type references, works on static members. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int GetClassMethod(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - var translator = ObjectTranslatorPool.Instance.Find(luaState); - var instance = translator.MetaFunctionsInstance; - int result = instance.GetClassMethodInternal(luaState); - var exception = translator.GetObject(luaState, -1) as LuaScriptException; - - if (exception != null) - return luaState.Error(); - return result; - } - - private int GetClassMethodInternal(LuaState luaState) - { - var klass = _translator.GetRawNetObject(luaState, 1) as ProxyType; - - if (klass == null) - { - _translator.ThrowError(luaState, "Trying to index an invalid type reference"); - return 1; - } - - if (luaState.IsNumber(2)) - { - int size = (int)luaState.ToNumber(2); - _translator.Push(luaState, Array.CreateInstance(klass.UnderlyingSystemType, size)); - return 1; - } - - string methodName = luaState.ToString(2, false); - - if (string.IsNullOrEmpty(methodName)) - { - luaState.PushNil(); - return 1; - } - return GetMember(luaState, klass, null, methodName, BindingFlags.Static); - } - - /* - * __newindex function of type references, works on static members. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int SetClassFieldOrProperty(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - var translator = ObjectTranslatorPool.Instance.Find(luaState); - var instance = translator.MetaFunctionsInstance; - int result = instance.SetClassFieldOrPropertyInternal(luaState); - var exception = translator.GetObject(luaState, -1) as LuaScriptException; - - if (exception != null) - return luaState.Error(); - return result; - } - - private int SetClassFieldOrPropertyInternal(LuaState luaState) - { - var target = _translator.GetRawNetObject(luaState, 1) as ProxyType; - - if (target == null) - { - _translator.ThrowError(luaState, "trying to index an invalid type reference"); - return 1; - } - - return SetMember(luaState, target, null, BindingFlags.Static); - } - - /* - * __call metafunction of Delegates. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - static int CallDelegate(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - var translator = ObjectTranslatorPool.Instance.Find(luaState); - var instance = translator.MetaFunctionsInstance; - int result = instance.CallDelegateInternal(luaState); - var exception = translator.GetObject(luaState, -1) as LuaScriptException; - - if (exception != null) - return luaState.Error(); - - return result; - } - - int CallDelegateInternal(LuaState luaState) - { - var del = _translator.GetRawNetObject(luaState, 1) as Delegate; - - if (del == null) - { - _translator.ThrowError(luaState, "Trying to invoke a not delegate or callable value"); - return 1; - } - - luaState.Remove(1); - - var validDelegate = new MethodCache(); - MethodBase methodDelegate = del.Method; - bool isOk = MatchParameters(luaState, methodDelegate, validDelegate, 0); - - if (isOk) - { - object result; - - if (methodDelegate.IsStatic) - result = methodDelegate.Invoke(null, validDelegate.args); - else - result = methodDelegate.Invoke(del.Target, validDelegate.args); - - _translator.Push(luaState, result); - return 1; - } - - _translator.ThrowError(luaState, "Cannot invoke delegate (invalid arguments for " + methodDelegate.Name + ")"); - return 1; - } - - /* - * __call metafunction of type references. Searches for and calls - * a constructor for the type. Returns nil if the constructor is not - * found or if the arguments are invalid. Throws an error if the constructor - * generates an exception. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int CallConstructor(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - var translator = ObjectTranslatorPool.Instance.Find(luaState); - var instance = translator.MetaFunctionsInstance; - int result = instance.CallConstructorInternal(luaState); - var exception = translator.GetObject(luaState, -1) as LuaScriptException; - - if (exception != null) - return luaState.Error(); - return result; - } - - private static ConstructorInfo[] ReorderConstructors(ConstructorInfo[] constructors) - { - int len = constructors.Length; - - if (len < 2) - return constructors; - - return constructors. - GroupBy(c => c.GetParameters().Length). - SelectMany(g => g.OrderByDescending(ci => ci.ToString())). - ToArray(); - } - - private int CallConstructorInternal(LuaState luaState) - { - var klass = _translator.GetRawNetObject(luaState, 1) as ProxyType; - - if (klass == null) - { - _translator.ThrowError(luaState, "Trying to call constructor on an invalid type reference"); - return 1; - } - - var validConstructor = new MethodCache(); - - luaState.Remove(1); - ConstructorInfo[] constructors = klass.UnderlyingSystemType.GetConstructors(); - constructors = ReorderConstructors(constructors); - foreach (var constructor in constructors) - { - bool isConstructor = MatchParameters(luaState, constructor, validConstructor, 0); - - if (!isConstructor) - continue; - - try - { - _translator.Push(luaState, constructor.Invoke(validConstructor.args)); - } - catch (TargetInvocationException e) - { - ThrowError(luaState, e); - return 1; - } - catch - { - luaState.PushNil(); - } - return 1; - } - - if (klass.UnderlyingSystemType.IsValueType) - { - int numLuaParams = luaState.GetTop(); - if (numLuaParams == 0) - { - _translator.Push(luaState, Activator.CreateInstance(klass.UnderlyingSystemType)); - return 1; - } - } - - string constructorName = constructors.Length == 0 ? "unknown" : constructors[0].Name; - _translator.ThrowError(luaState, string.Format("{0} does not contain constructor({1}) argument match", - klass.UnderlyingSystemType, constructorName)); - return 1; - } - - static bool IsInteger(double x) - { - return Math.Ceiling(x) == x; - } - - static object GetTargetObject(LuaState luaState, string operation, ObjectTranslator translator) - { - Type t; - object target = translator.GetRawNetObject(luaState, 1); - if (target != null) - { - t = target.GetType(); - if (t.HasMethod(operation)) - return target; - } - target = translator.GetRawNetObject(luaState, 2); - if (target != null) - { - t = target.GetType(); - if (t.HasMethod(operation)) - return target; - } - return null; - } - - static int MatchOperator(LuaState luaState, string operation, ObjectTranslator translator) - { - var validOperator = new MethodCache(); - - object target = GetTargetObject(luaState, operation, translator); - - if (target == null) - { - translator.ThrowError(luaState, "Cannot call " + operation + " on a nil object"); - return 1; - } - - Type type = target.GetType(); - var operators = type.GetMethods(operation, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); - - foreach (var op in operators) - { - bool isOk = translator.MatchParameters(luaState, op, validOperator, 0); - - if (!isOk) - continue; - - object result; - if (op.IsStatic) - result = op.Invoke(null, validOperator.args); - else - result = op.Invoke(target, validOperator.args); - translator.Push(luaState, result); - return 1; - } - - translator.ThrowError(luaState, "Cannot call (" + operation + ") on object type " + type.Name); - return 1; - } - - internal Array TableToArray(LuaState luaState, ExtractValue extractValue, Type paramArrayType, ref int startIndex, int count) - { - Array paramArray; - - if (count == 0) - return Array.CreateInstance(paramArrayType, 0); - - var luaParamValue = extractValue(luaState, startIndex); - startIndex++; - - if (luaParamValue is LuaTable) - { - LuaTable table = (LuaTable)luaParamValue; - IDictionaryEnumerator tableEnumerator = table.GetEnumerator(); - tableEnumerator.Reset(); - paramArray = Array.CreateInstance(paramArrayType, table.Values.Count); - - int paramArrayIndex = 0; - - while (tableEnumerator.MoveNext()) - { - object value = tableEnumerator.Value; - - if (paramArrayType == typeof(object)) - { - if (value != null && value is double && IsInteger((double)value)) - value = Convert.ToInt32((double)value); - } - - paramArray.SetValue(Convert.ChangeType(value, paramArrayType), paramArrayIndex); - paramArrayIndex++; - } - } - else - { - paramArray = Array.CreateInstance(paramArrayType, count); - - paramArray.SetValue(luaParamValue, 0); - - for (int i = 1; i < count; i++) - { - var value = extractValue(luaState, startIndex); - paramArray.SetValue(value, i); - startIndex++; - } - - } - - return paramArray; - - } - - /* - * Matches a method against its arguments in the Lua stack. Returns - * if the match was successful. It it was also returns the information - * necessary to invoke the method. - */ - internal bool MatchParameters(LuaState luaState, MethodBase method, MethodCache methodCache, int skipParam) - { - var paramInfo = method.GetParameters(); - int currentLuaParam = 1; - int nLuaParams = luaState.GetTop() - skipParam; - var paramList = new List(); - var outList = new List(); - var argTypes = new List(); - - foreach (var currentNetParam in paramInfo) - { - if (!currentNetParam.IsIn && currentNetParam.IsOut) // Skips out params - { - paramList.Add(null); - outList.Add(paramList.Count - 1); - continue; - } // Type does not match, ignore if the parameter is optional - - ExtractValue extractValue; - if (IsParamsArray(luaState, nLuaParams, currentLuaParam, currentNetParam, out extractValue)) - { - int count = (nLuaParams - currentLuaParam) + 1; - Type paramArrayType = currentNetParam.ParameterType.GetElementType(); - - Array paramArray = TableToArray(luaState, extractValue, paramArrayType, ref currentLuaParam, count); - paramList.Add(paramArray); - int index = paramList.LastIndexOf(paramArray); - var methodArg = new MethodArgs(); - methodArg.Index = index; - methodArg.ExtractValue = extractValue; - methodArg.IsParamsArray = true; - methodArg.ParameterType = paramArrayType; - argTypes.Add(methodArg); - continue; - } - - if (currentLuaParam > nLuaParams) - { // Adds optional parameters - if (!currentNetParam.IsOptional) - return false; - paramList.Add(currentNetParam.DefaultValue); - continue; - } - - if (IsTypeCorrect(luaState, currentLuaParam, currentNetParam, out extractValue)) - { // Type checking - var value = extractValue(luaState, currentLuaParam); - paramList.Add(value); - int index = paramList.Count - 1; - var methodArg = new MethodArgs(); - methodArg.Index = index; - methodArg.ExtractValue = extractValue; - methodArg.ParameterType = currentNetParam.ParameterType; - argTypes.Add(methodArg); - - if (currentNetParam.ParameterType.IsByRef) - outList.Add(index); - - currentLuaParam++; - continue; - } - - if (currentNetParam.IsOptional) - { - paramList.Add(currentNetParam.DefaultValue); - continue; - } - - return false; - } - - if (currentLuaParam != nLuaParams + 1) // Number of parameters does not match - return false; - - methodCache.args = paramList.ToArray(); - methodCache.cachedMethod = method; - methodCache.outList = outList.ToArray(); - methodCache.argTypes = argTypes.ToArray(); - - return true; - } - - /// - /// Returns true if the type is set and assigns the extract value - /// - /// - /// - /// - /// - /// - private bool IsTypeCorrect(LuaState luaState, int currentLuaParam, ParameterInfo currentNetParam, out ExtractValue extractValue) - { - extractValue = _translator.typeChecker.CheckLuaType(luaState, currentLuaParam, currentNetParam.ParameterType); - return extractValue != null; - } - - private bool IsParamsArray(LuaState luaState, int nLuaParams, int currentLuaParam, ParameterInfo currentNetParam, out ExtractValue extractValue) - { - extractValue = null; - - if (!currentNetParam.GetCustomAttributes(typeof(ParamArrayAttribute), false).Any()) - return false; - - bool isParamArray = nLuaParams < currentLuaParam; - - LuaType luaType = luaState.Type(currentLuaParam); - - if (luaType == LuaType.Table) - { - extractValue = _translator.typeChecker.GetExtractor(typeof(LuaTable)); - if (extractValue != null) - return true; - } - else - { - Type paramElementType = currentNetParam.ParameterType.GetElementType(); - - extractValue = _translator.typeChecker.CheckLuaType(luaState, currentLuaParam, paramElementType); - - if (extractValue != null) - return true; - } - return isParamArray; - } - } -} diff --git a/src/LUA/Method/EventHandlerContainer.cs b/src/LUA/Method/EventHandlerContainer.cs deleted file mode 100644 index 0d1a9f1..0000000 --- a/src/LUA/Method/EventHandlerContainer.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Diagnostics; -using System.Collections.Generic; - -namespace NLua.Method -{ - /// - /// We keep track of what delegates we have auto attached to an event - to allow us to cleanly exit a NLua session - /// - class EventHandlerContainer : IDisposable - { - private readonly Dictionary _dict = new Dictionary(); - - public void Add(Delegate handler, RegisterEventHandler eventInfo) - { - _dict.Add(handler, eventInfo); - } - - public void Remove(Delegate handler) - { - bool found = _dict.Remove(handler); - Debug.Assert(found); - } - - /// - /// Remove any still registered handlers - /// - public void Dispose() - { - foreach (KeyValuePair pair in _dict) - pair.Value.RemovePending(pair.Key); - - _dict.Clear(); - } - } -} \ No newline at end of file diff --git a/src/LUA/Method/LuaClassHelper.cs b/src/LUA/Method/LuaClassHelper.cs deleted file mode 100644 index 381eb8c..0000000 --- a/src/LUA/Method/LuaClassHelper.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; - -namespace NLua.Method -{ - public class LuaClassHelper - { - /* - * Gets the function called name from the provided table, - * returning null if it does not exist - */ - public static LuaFunction GetTableFunction(LuaTable luaTable, string name) - { - if (luaTable == null) - return null; - - var funcObj = luaTable.RawGet(name) as LuaFunction; - - if (funcObj != null) - return funcObj; - return null; - } - - /* - * Calls the provided function with the provided parameters - */ - public static object CallFunction(LuaFunction function, object[] args, Type[] returnTypes, object[] inArgs, int[] outArgs) - { - // args is the return array of arguments, inArgs is the actual array - // of arguments passed to the function (with in parameters only), outArgs - // has the positions of out parameters - object returnValue; - int iRefArgs; - object[] returnValues = function.Call(inArgs, returnTypes); - - if (returnTypes[0] == typeof(void)) - { - returnValue = null; - iRefArgs = 0; - } - else - { - returnValue = returnValues[0]; - iRefArgs = 1; - } - - for (int i = 0; i < outArgs.Length; i++) - { - args[outArgs[i]] = returnValues[iRefArgs]; - iRefArgs++; - } - - return returnValue; - } - } -} \ No newline at end of file diff --git a/src/LUA/Method/LuaDelegate.cs b/src/LUA/Method/LuaDelegate.cs deleted file mode 100644 index 0d988ff..0000000 --- a/src/LUA/Method/LuaDelegate.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; - -namespace NLua.Method -{ - public class LuaDelegate - { - public LuaFunction Function; - public Type[] ReturnTypes; - - public LuaDelegate() - { - Function = null; - ReturnTypes = null; - } - - public object CallFunction(object[] args, object[] inArgs, int[] outArgs) - { - // args is the return array of arguments, inArgs is the actual array - // of arguments passed to the function (with in parameters only), outArgs - // has the positions of out parameters - object returnValue; - int iRefArgs; - object[] returnValues = Function.Call(inArgs, ReturnTypes); - - if (ReturnTypes[0] == typeof(void)) - { - returnValue = null; - iRefArgs = 0; - } - else - { - returnValue = returnValues[0]; - iRefArgs = 1; - } - - // Sets the value of out and ref parameters (from - // the values returned by the Lua function). - for (int i = 0; i < outArgs.Length; i++) - { - args[outArgs[i]] = returnValues[iRefArgs]; - iRefArgs++; - } - - return returnValue; - } - } -} \ No newline at end of file diff --git a/src/LUA/Method/LuaEventHandler.cs b/src/LUA/Method/LuaEventHandler.cs deleted file mode 100644 index 49538dc..0000000 --- a/src/LUA/Method/LuaEventHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace NLua.Method -{ - public class LuaEventHandler - { - public LuaFunction Handler = null; - - public void HandleEvent(object[] args) - { - Handler.Call(args); - } - } -} \ No newline at end of file diff --git a/src/LUA/Method/LuaMethodWrapper.cs b/src/LUA/Method/LuaMethodWrapper.cs deleted file mode 100644 index 22b5686..0000000 --- a/src/LUA/Method/LuaMethodWrapper.cs +++ /dev/null @@ -1,355 +0,0 @@ -using System; -using System.Reflection; -using System.Collections.Generic; -using System.Linq; - -using NLua.Exceptions; -using NLua.Extensions; - -using LuaState = KeraLua.Lua; -using LuaNativeFunction = KeraLua.LuaFunction; - -namespace NLua.Method -{ - /* - * Argument extraction with type-conversion function - */ - delegate object ExtractValue(LuaState luaState, int stackPos); - - /* - * Wrapper class for methods/constructors accessed from Lua. - * - */ - class LuaMethodWrapper - { - internal LuaNativeFunction InvokeFunction; - - readonly ObjectTranslator _translator; - readonly MethodBase _method; - - readonly ExtractValue _extractTarget; - readonly object _target; - readonly bool _isStatic; - - readonly string _methodName; - readonly MethodInfo[] _members; - - private MethodCache _lastCalledMethod; - - - /* - * Constructs the wrapper for a known MethodBase instance - */ - public LuaMethodWrapper(ObjectTranslator translator, object target, ProxyType targetType, MethodBase method) - { - InvokeFunction = Call; - _translator = translator; - _target = target; - _extractTarget = translator.typeChecker.GetExtractor(targetType); - _lastCalledMethod = new MethodCache(); - - _method = method; - _methodName = method.Name; - _isStatic = method.IsStatic; - - } - - /* - * Constructs the wrapper for a known method name - */ - public LuaMethodWrapper(ObjectTranslator translator, ProxyType targetType, string methodName, BindingFlags bindingType) - { - InvokeFunction = Call; - - _translator = translator; - _methodName = methodName; - _extractTarget = translator.typeChecker.GetExtractor(targetType); - _lastCalledMethod = new MethodCache(); - - _isStatic = (bindingType & BindingFlags.Static) == BindingFlags.Static; - MethodInfo [] methods = GetMethodsRecursively(targetType.UnderlyingSystemType, - methodName, - bindingType | BindingFlags.Public); - _members = ReorderMethods(methods); - } - - private static MethodInfo[] ReorderMethods(MethodInfo[] m) - { - int len = m.Length; - - if (len < 2) - return m; - - return m. - GroupBy(c => c.GetParameters().Length). - SelectMany(g => g.OrderByDescending(ci => ci.ToString())). - ToArray(); - } - - MethodInfo[] GetMethodsRecursively(Type type, string methodName, BindingFlags bindingType) - { - if (type == typeof(object)) - return type.GetMethods(methodName, bindingType); - - var methods = type.GetMethods(methodName, bindingType); - var baseMethods = GetMethodsRecursively(type.BaseType, methodName, bindingType); - - return methods.Concat(baseMethods).ToArray(); - } - - /// - /// Convert C# exceptions into Lua errors - /// - /// num of things on stack - /// null for no pending exception - int SetPendingException(Exception e) - { - return _translator.interpreter.SetPendingException(e); - } - - void FillMethodArguments(LuaState luaState, int numStackToSkip) - { - object[] args = _lastCalledMethod.args; - - - for (int i = 0; i < _lastCalledMethod.argTypes.Length; i++) - { - MethodArgs type = _lastCalledMethod.argTypes[i]; - - int index = i + 1 + numStackToSkip; - - - if (_lastCalledMethod.argTypes[i].IsParamsArray) - { - int count = _lastCalledMethod.argTypes.Length - i; - Array paramArray = _translator.TableToArray(luaState, type.ExtractValue, type.ParameterType, index, count); - args[_lastCalledMethod.argTypes[i].Index] = paramArray; - } - else - { - args[type.Index] = type.ExtractValue(luaState, index); - } - - if (_lastCalledMethod.args[_lastCalledMethod.argTypes[i].Index] == null && - !luaState.IsNil(i + 1 + numStackToSkip)) - throw new LuaException(string.Format("Argument number {0} is invalid", (i + 1))); - } - } - - int PushReturnValue(LuaState luaState) - { - int nReturnValues = 0; - // Pushes out and ref return values - for (int index = 0; index < _lastCalledMethod.outList.Length; index++) - { - nReturnValues++; - _translator.Push(luaState, _lastCalledMethod.args[_lastCalledMethod.outList[index]]); - } - - // If not return void,we need add 1, - // or we will lost the function's return value - // when call dotnet function like "int foo(arg1,out arg2,out arg3)" in Lua code - if (!_lastCalledMethod.IsReturnVoid && nReturnValues > 0) - nReturnValues++; - - return nReturnValues < 1 ? 1 : nReturnValues; - } - - int CallInvoke(LuaState luaState, MethodBase method, object targetObject) - { - if (!luaState.CheckStack(_lastCalledMethod.outList.Length + 6)) - throw new LuaException("Lua stack overflow"); - - try - { - object result; - - if (method.IsConstructor) - result = ((ConstructorInfo)method).Invoke(_lastCalledMethod.args); - else - result = method.Invoke(targetObject, _lastCalledMethod.args); - - _translator.Push(luaState, result); - } - catch (TargetInvocationException e) - { - // Failure of method invocation - if (_translator.interpreter.UseTraceback) - e.GetBaseException().Data["Traceback"] = _translator.interpreter.GetDebugTraceback(); - return SetPendingException(e.GetBaseException()); - } - catch (Exception e) - { - return SetPendingException(e); - } - - return PushReturnValue(luaState); - } - - bool IsMethodCached(LuaState luaState, int numArgsPassed, int skipParams) - { - if (_lastCalledMethod.cachedMethod == null) - return false; - - if (numArgsPassed != _lastCalledMethod.argTypes.Length) - return false; - - // If there is no method overloads, is ok to use the cached method - if (_members.Length == 1) - return true; - - return _translator.MatchParameters(luaState, _lastCalledMethod.cachedMethod, _lastCalledMethod, skipParams); - } - - int CallMethodFromName(LuaState luaState) - { - object targetObject = null; - - if (!_isStatic) - targetObject = _extractTarget(luaState, 1); - - int numStackToSkip = - _isStatic - ? 0 - : 1; // If this is an instance invoe we will have an extra arg on the stack for the targetObject - int numArgsPassed = luaState.GetTop() - numStackToSkip; - - // Cached? - if (IsMethodCached(luaState, numArgsPassed, numStackToSkip)) - { - MethodBase method = _lastCalledMethod.cachedMethod; - - if (!luaState.CheckStack(_lastCalledMethod.outList.Length + 6)) - throw new LuaException("Lua stack overflow"); - - FillMethodArguments(luaState, numStackToSkip); - - return CallInvoke(luaState, method, targetObject); - } - - // If we are running an instance variable, we can now pop the targetObject from the stack - if (!_isStatic) - { - if (targetObject == null) - { - _translator.ThrowError(luaState, - string.Format("instance method '{0}' requires a non null target object", _methodName)); - return 1; - } - - luaState.Remove(1); // Pops the receiver - } - - bool hasMatch = false; - string candidateName = null; - - foreach (var member in _members) - { - if (member.ReflectedType == null) - continue; - - candidateName = member.ReflectedType.Name + "." + member.Name; - bool isMethod = _translator.MatchParameters(luaState, member, _lastCalledMethod, 0); - - if (isMethod) - { - hasMatch = true; - break; - } - } - - if (!hasMatch) - { - string msg = (candidateName == null) - ? "Invalid arguments to method call" - : ("Invalid arguments to method: " + candidateName); - _translator.ThrowError(luaState, msg); - return 1; - } - - if (_lastCalledMethod.cachedMethod.ContainsGenericParameters) - return CallInvokeOnGenericMethod(luaState, (MethodInfo)_lastCalledMethod.cachedMethod, targetObject); - - return CallInvoke(luaState, _lastCalledMethod.cachedMethod, targetObject); - } - - int CallInvokeOnGenericMethod(LuaState luaState, MethodInfo methodToCall, object targetObject) - { - //need to make a concrete type of the generic method definition - var typeArgs = new List(); - - ParameterInfo [] parameters = methodToCall.GetParameters(); - - for (int i = 0; i < parameters.Length; i++) - { - ParameterInfo parameter = parameters[i]; - - if (!parameter.ParameterType.IsGenericParameter) - continue; - - typeArgs.Add(_lastCalledMethod.args[i].GetType()); - } - - MethodInfo concreteMethod = methodToCall.MakeGenericMethod(typeArgs.ToArray()); - - _translator.Push(luaState, concreteMethod.Invoke(targetObject, _lastCalledMethod.args)); - - return PushReturnValue(luaState); - } - - /* - * Calls the method. Receives the arguments from the Lua stack - * and returns values in it. - */ - int Call(IntPtr state) - { - var luaState = LuaState.FromIntPtr(state); - - MethodBase methodToCall = _method; - object targetObject = _target; - - if (!luaState.CheckStack(5)) - throw new LuaException("Lua stack overflow"); - - SetPendingException(null); - - // Method from name - if (methodToCall == null) - return CallMethodFromName(luaState); - - // Method from MethodBase instance - if (!methodToCall.ContainsGenericParameters) - { - if (!methodToCall.IsStatic && !methodToCall.IsConstructor && targetObject == null) - { - targetObject = _extractTarget(luaState, 1); - luaState.Remove(1); // Pops the receiver - } - - if (!_translator.MatchParameters(luaState, methodToCall, _lastCalledMethod, 0)) - { - _translator.ThrowError(luaState, "Invalid arguments to method call"); - return 1; - } - } - else - { - if (!methodToCall.IsGenericMethodDefinition) - { - _translator.ThrowError(luaState, - "Unable to invoke method on generic class as the current method is an open generic method"); - return 1; - } - - _translator.MatchParameters(luaState, methodToCall, _lastCalledMethod, 0); - - return CallInvokeOnGenericMethod(luaState, (MethodInfo) methodToCall, targetObject); - } - - if (_isStatic) - targetObject = null; - - return CallInvoke(luaState, _lastCalledMethod.cachedMethod, targetObject); - } - } -} diff --git a/src/LUA/Method/MethodArgs.cs b/src/LUA/Method/MethodArgs.cs deleted file mode 100644 index 4b7db00..0000000 --- a/src/LUA/Method/MethodArgs.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace NLua.Method -{ - /* - * Parameter information - */ - class MethodArgs - { - // Position of parameter - public int Index; - public Type ParameterType; - - // Type-conversion function - public ExtractValue ExtractValue; - public bool IsParamsArray; - } -} \ No newline at end of file diff --git a/src/LUA/Method/MethodCache.cs b/src/LUA/Method/MethodCache.cs deleted file mode 100644 index 74bc5e6..0000000 --- a/src/LUA/Method/MethodCache.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Reflection; -using NLua.Extensions; - -namespace NLua.Method -{ - class MethodCache - { - public MethodCache() - { - args = new object[0]; - argTypes = new MethodArgs[0]; - outList = new int[0]; - } - private MethodBase _cachedMethod; - - public MethodBase cachedMethod { - get - { - return _cachedMethod; - } - set - { - _cachedMethod = value; - var mi = value as MethodInfo; - - if (mi != null) - { - IsReturnVoid = mi.ReturnType == typeof(void); - } - } - } - - public bool IsReturnVoid; - // List or arguments - public object[] args; - // Positions of out parameters - public int[] outList; - // Types of parameters - public MethodArgs[] argTypes; - } -} \ No newline at end of file diff --git a/src/LUA/Method/RegisterEventHandler.cs b/src/LUA/Method/RegisterEventHandler.cs deleted file mode 100644 index 5736062..0000000 --- a/src/LUA/Method/RegisterEventHandler.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Reflection; - -namespace NLua.Method -{ - class RegisterEventHandler - { - private readonly EventHandlerContainer _pendingEvents; - private readonly EventInfo _eventInfo; - private readonly object _target; - - public RegisterEventHandler(EventHandlerContainer pendingEvents, object target, EventInfo eventInfo) - { - _target = target; - _eventInfo = eventInfo; - _pendingEvents = pendingEvents; - } - - /* - * Adds a new event handler - */ - public Delegate Add(LuaFunction function) - { - Delegate handlerDelegate = CodeGeneration.Instance.GetDelegate(_eventInfo.EventHandlerType, function); - return Add(handlerDelegate); - } - - public Delegate Add(Delegate handlerDelegate) - { - _eventInfo.AddEventHandler(_target, handlerDelegate); - _pendingEvents.Add(handlerDelegate, this); - - return handlerDelegate; - } - - /* - * Removes an existing event handler - */ - public void Remove(Delegate handlerDelegate) - { - RemovePending(handlerDelegate); - _pendingEvents.Remove(handlerDelegate); - } - - /* - * Removes an existing event handler (without updating the pending handlers list) - */ - internal void RemovePending(Delegate handlerDelegate) - { - _eventInfo.RemoveEventHandler(_target, handlerDelegate); - } - } -} \ No newline at end of file diff --git a/src/LUA/ObjectTranslator.cs b/src/LUA/ObjectTranslator.cs deleted file mode 100644 index 5d5dfb0..0000000 --- a/src/LUA/ObjectTranslator.cs +++ /dev/null @@ -1,1171 +0,0 @@ -using System; -using System.IO; -using System.Reflection; -using System.Collections.Generic; -using System.Collections.Concurrent; -using System.Runtime.InteropServices; -using KeraLua; - -using NLua.Method; -using NLua.Exceptions; -using NLua.Extensions; - -#if __IOS__ || __TVOS__ || __WATCHOS__ - using ObjCRuntime; -#endif - -using LuaState = KeraLua.Lua; -using LuaNativeFunction = KeraLua.LuaFunction; - -namespace NLua -{ - public class ObjectTranslator - { - // Compare cache entries by exact reference to avoid unwanted aliases - private class ReferenceComparer : IEqualityComparer - { - public new bool Equals(object x, object y) - { - if (x != null && y != null && x.GetType() == y.GetType() && x.GetType().IsValueType && y.GetType().IsValueType) - return x.Equals(y); // Special case for boxed value types - return ReferenceEquals(x, y); - } - - public int GetHashCode(object obj) - { - return obj.GetHashCode(); - } - } - - private static readonly LuaNativeFunction _registerTableFunction = RegisterTable; - private static readonly LuaNativeFunction _unregisterTableFunction = UnregisterTable; - private static readonly LuaNativeFunction _getMethodSigFunction = GetMethodSignature; - private static readonly LuaNativeFunction _getConstructorSigFunction = GetConstructorSignature; - private static readonly LuaNativeFunction _importTypeFunction = ImportType; - private static readonly LuaNativeFunction _loadAssemblyFunction = LoadAssembly; - private static readonly LuaNativeFunction _ctypeFunction = CType; - private static readonly LuaNativeFunction _enumFromIntFunction = EnumFromInt; - - // object to object # - readonly Dictionary _objectsBackMap = new Dictionary(new ReferenceComparer()); - // object # to object (FIXME - it should be possible to get object address as an object #) - readonly Dictionary _objects = new Dictionary(); - - readonly ConcurrentQueue finalizedReferences = new ConcurrentQueue(); - - internal EventHandlerContainer PendingEvents = new EventHandlerContainer(); - MetaFunctions metaFunctions; - List assemblies; - internal CheckType typeChecker; - internal Lua interpreter; - /// - /// We want to ensure that objects always have a unique ID - /// - int _nextObj; - - public MetaFunctions MetaFunctionsInstance => metaFunctions; - public Lua Interpreter => interpreter; - public IntPtr Tag => _tagPtr; - - readonly IntPtr _tagPtr; - - public ObjectTranslator(Lua interpreter, LuaState luaState) - { - _tagPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int))); - this.interpreter = interpreter; - typeChecker = new CheckType(this); - metaFunctions = new MetaFunctions(this); - assemblies = new List(); - - CreateLuaObjectList(luaState); - CreateIndexingMetaFunction(luaState); - CreateBaseClassMetatable(luaState); - CreateClassMetatable(luaState); - CreateFunctionMetatable(luaState); - SetGlobalFunctions(luaState); - - } - - /* - * Sets up the list of objects in the Lua side - */ - private void CreateLuaObjectList(LuaState luaState) - { - luaState.PushString("luaNet_objects"); - luaState.NewTable(); - luaState.NewTable(); - luaState.PushString("__mode"); - luaState.PushString("v"); - luaState.SetTable(-3); - luaState.SetMetaTable(-2); - luaState.SetTable((int)LuaRegistry.Index); - } - - /* - * Registers the indexing function of CLR objects - * passed to Lua - */ - private void CreateIndexingMetaFunction(LuaState luaState) - { - luaState.PushString("luaNet_indexfunction"); - luaState.DoString(MetaFunctions.LuaIndexFunction); - luaState.RawSet(LuaRegistry.Index); - } - - /* - * Creates the metatable for superclasses (the base - * field of registered tables) - */ - private void CreateBaseClassMetatable(LuaState luaState) - { - luaState.NewMetaTable("luaNet_searchbase"); - luaState.PushString("__gc"); - luaState.PushCFunction(MetaFunctions.GcFunction); - luaState.SetTable(-3); - luaState.PushString("__tostring"); - luaState.PushCFunction(MetaFunctions.ToStringFunction); - luaState.SetTable(-3); - luaState.PushString("__index"); - luaState.PushCFunction(MetaFunctions.BaseIndexFunction); - luaState.SetTable(-3); - luaState.PushString("__newindex"); - luaState.PushCFunction(MetaFunctions.NewIndexFunction); - luaState.SetTable(-3); - luaState.SetTop(-2); - } - - /* - * Creates the metatable for type references - */ - private void CreateClassMetatable(LuaState luaState) - { - luaState.NewMetaTable("luaNet_class"); - luaState.PushString("__gc"); - luaState.PushCFunction(MetaFunctions.GcFunction); - luaState.SetTable(-3); - luaState.PushString("__tostring"); - luaState.PushCFunction(MetaFunctions.ToStringFunction); - luaState.SetTable(-3); - luaState.PushString("__index"); - luaState.PushCFunction(MetaFunctions.ClassIndexFunction); - luaState.SetTable(-3); - luaState.PushString("__newindex"); - luaState.PushCFunction(MetaFunctions.ClassNewIndexFunction); - luaState.SetTable(-3); - luaState.PushString("__call"); - luaState.PushCFunction(MetaFunctions.CallConstructorFunction); - luaState.SetTable(-3); - luaState.SetTop(-2); - } - - /* - * Registers the global functions used by NLua - */ - private void SetGlobalFunctions(LuaState luaState) - { - luaState.PushCFunction(MetaFunctions.IndexFunction); - luaState.SetGlobal("get_object_member"); - luaState.PushCFunction(_importTypeFunction); - luaState.SetGlobal("import_type"); - luaState.PushCFunction(_loadAssemblyFunction); - luaState.SetGlobal("load_assembly"); - luaState.PushCFunction(_registerTableFunction); - luaState.SetGlobal("make_object"); - luaState.PushCFunction(_unregisterTableFunction); - luaState.SetGlobal("free_object"); - luaState.PushCFunction(_getMethodSigFunction); - luaState.SetGlobal("get_method_bysig"); - luaState.PushCFunction(_getConstructorSigFunction); - luaState.SetGlobal("get_constructor_bysig"); - luaState.PushCFunction(_ctypeFunction); - luaState.SetGlobal("ctype"); - luaState.PushCFunction(_enumFromIntFunction); - luaState.SetGlobal("enum"); - } - - /* - * Creates the metatable for delegates - */ - private void CreateFunctionMetatable(LuaState luaState) - { - luaState.NewMetaTable("luaNet_function"); - luaState.PushString("__gc"); - luaState.PushCFunction(MetaFunctions.GcFunction); - luaState.SetTable(-3); - luaState.PushString("__call"); - luaState.PushCFunction(MetaFunctions.ExecuteDelegateFunction); - luaState.SetTable(-3); - luaState.SetTop(-2); - } - - /* - * Passes errors (argument e) to the Lua interpreter - */ - internal void ThrowError(LuaState luaState, object e) - { - // We use this to remove anything pushed by luaL_where - int oldTop = luaState.GetTop(); - - // Stack frame #1 is our C# wrapper, so not very interesting to the user - // Stack frame #2 must be the lua code that called us, so that's what we want to use - luaState.Where(1); - var curlev = PopValues(luaState, oldTop); - - // Determine the position in the script where the exception was triggered - string errLocation = string.Empty; - - if (curlev.Length > 0) - errLocation = curlev[0].ToString(); - - string message = e as string; - - if (message != null) - { - // Wrap Lua error (just a string) and store the error location - if (interpreter.UseTraceback) - message += Environment.NewLine + interpreter.GetDebugTraceback(); - e = new LuaScriptException(message, errLocation); - } - else - { - var ex = e as Exception; - - if (ex != null) - { - // Wrap generic .NET exception as an InnerException and store the error location - if (interpreter.UseTraceback) ex.Data["Traceback"] = interpreter.GetDebugTraceback(); - e = new LuaScriptException(ex, errLocation); - } - } - - Push(luaState, e); - } - - /* - * Implementation of load_assembly. Throws an error - * if the assembly is not found. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int LoadAssembly(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = translator.LoadAssemblyInternal(state); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - private int LoadAssemblyInternal(LuaState luaState) - { - try - { - string assemblyName = luaState.ToString(1, false); - Assembly assembly = null; - Exception exception = null; - - try - { - assembly = Assembly.Load(assemblyName); - } - catch (BadImageFormatException) - { - // The assemblyName was invalid. It is most likely a path. - } - catch (FileNotFoundException e) - { - exception = e; - } - - if (assembly == null) - { - try - { - assembly = Assembly.Load(AssemblyName.GetAssemblyName(assemblyName)); - } - catch (FileNotFoundException e) - { - exception = e; - } - if (assembly == null) - { - AssemblyName mscor = assemblies[0].GetName(); - AssemblyName name = new AssemblyName(); - name.Name = assemblyName; - name.CultureInfo = mscor.CultureInfo; - name.Version = mscor.Version; - name.SetPublicKeyToken(mscor.GetPublicKeyToken()); - name.SetPublicKey(mscor.GetPublicKey()); - assembly = Assembly.Load(name); - - if (assembly != null) - exception = null; - } - if (exception != null) - { - ThrowError(luaState, exception); - return 1; - } - } - if (assembly != null && !assemblies.Contains(assembly)) - assemblies.Add(assembly); - } - catch (Exception e) - { - ThrowError(luaState, e); - return 1; - } - return 0; - } - - internal Type FindType(string className) - { - foreach (var assembly in assemblies) - { - var klass = assembly.GetType(className); - - if (klass != null) - return klass; - } - return null; - } - - public bool TryGetExtensionMethod(Type type, string name, out MethodInfo method) - { - method = GetExtensionMethod(type, name); - return method != null; - } - - public MethodInfo GetExtensionMethod(Type type, string name) - { - return type.GetExtensionMethod(name, assemblies); - } - - /* - * Implementation of import_type. Returns nil if the - * type is not found. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int ImportType(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - return translator.ImportTypeInternal(state); - } - - private int ImportTypeInternal(LuaState luaState) - { - string className = luaState.ToString(1, false); - var klass = FindType(className); - - if (klass != null) - PushType(luaState, klass); - else - luaState.PushNil(); - - return 1; - } - - /* - * Implementation of make_object. Registers a table (first - * argument in the stack) as an object subclassing the - * type passed as second argument in the stack. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int RegisterTable(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = translator.RegisterTableInternal(state); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - private int RegisterTableInternal(LuaState luaState) - { - if (luaState.Type(1) != LuaType.Table) - { - ThrowError(luaState, "register_table: first arg is not a table"); - return 1; - } - - LuaTable luaTable = GetTable(luaState, 1); - string superclassName = luaState.ToString(2, false); - - if (string.IsNullOrEmpty(superclassName)) - { - ThrowError(luaState, "register_table: superclass name can not be null"); - return 1; - } - - var klass = FindType(superclassName); - - if (klass == null) - { - ThrowError(luaState, "register_table: can not find superclass '" + superclassName + "'"); - return 1; - } - - // Creates and pushes the object in the stack, setting - // it as the metatable of the first argument - object obj = CodeGeneration.Instance.GetClassInstance(klass, luaTable); - PushObject(luaState, obj, "luaNet_metatable"); - luaState.NewTable(); - luaState.PushString("__index"); - luaState.PushCopy(-3); - luaState.SetTable(-3); - luaState.PushString("__newindex"); - luaState.PushCopy(-3); - luaState.SetTable(-3); - luaState.SetMetaTable(1); - - // Pushes the object again, this time as the base field - // of the table and with the luaNet_searchbase metatable - luaState.PushString("base"); - int index = AddObject(obj); - PushNewObject(luaState, obj, index, "luaNet_searchbase"); - luaState.RawSet(1); - - return 0; - } - - /* - * Implementation of free_object. Clears the metatable and the - * base field, freeing the created object for garbage-collection - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int UnregisterTable(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = translator.UnregisterTableInternal(state); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - private int UnregisterTableInternal(LuaState luaState) - { - - if (!luaState.GetMetaTable(1)) - { - ThrowError(luaState, "unregister_table: arg is not valid table"); - return 1; - } - - luaState.PushString("__index"); - luaState.GetTable(-2); - object obj = GetRawNetObject(luaState, -1); - - if (obj == null) - { - ThrowError(luaState, "unregister_table: arg is not valid table"); - return 1; - } - - var luaTableField = obj.GetType().GetField("__luaInterface_luaTable"); - - if (luaTableField == null) - { - ThrowError(luaState, "unregister_table: arg is not valid table"); - return 1; - } - - // ReSharper disable once PossibleNullReferenceException - luaTableField.SetValue(obj, null); - luaState.PushNil(); - luaState.SetMetaTable(1); - luaState.PushString("base"); - luaState.PushNil(); - luaState.SetTable(1); - - return 0; - } - - /* - * Implementation of get_method_bysig. Returns nil - * if no matching method is not found. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int GetMethodSignature(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = translator.GetMethodSignatureInternal(state); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - private int GetMethodSignatureInternal(LuaState luaState) - { - ProxyType klass; - object target; - int udata = luaState.CheckUObject(1, "luaNet_class"); - - if (udata != -1) - { - klass = (ProxyType)_objects[udata]; - target = null; - } - else - { - target = GetRawNetObject(luaState, 1); - - if (target == null) - { - ThrowError(luaState, "get_method_bysig: first arg is not type or object reference"); - return 1; - } - - klass = new ProxyType(target.GetType()); - } - - string methodName = luaState.ToString(2, false); - var signature = new Type[luaState.GetTop() - 2]; - - for (int i = 0; i < signature.Length; i++) - signature[i] = FindType(luaState.ToString(i + 3, false)); - - try - { - var method = klass.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static | - BindingFlags.Instance, signature); - var wrapper = new LuaMethodWrapper(this, target, klass, method); - LuaNativeFunction invokeDelegate = wrapper.InvokeFunction; - PushFunction(luaState, invokeDelegate); - } - catch (Exception e) - { - ThrowError(luaState, e); - } - - return 1; - } - - /* - * Implementation of get_constructor_bysig. Returns nil - * if no matching constructor is found. - */ -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int GetConstructorSignature(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - int result = translator.GetConstructorSignatureInternal(state); - var exception = translator.GetObject(state, -1) as LuaScriptException; - - if (exception != null) - return state.Error(); - return result; - } - - private int GetConstructorSignatureInternal(LuaState luaState) - { - ProxyType klass = null; - int udata = luaState.CheckUObject(1, "luaNet_class"); - - if (udata != -1) - klass = (ProxyType)_objects[udata]; - - if (klass == null) - { - ThrowError(luaState, "get_constructor_bysig: first arg is invalid type reference"); - return 1; - } - - var signature = new Type[luaState.GetTop() - 1]; - - for (int i = 0; i < signature.Length; i++) - signature[i] = FindType(luaState.ToString(i + 2, false)); - - try - { - ConstructorInfo constructor = klass.UnderlyingSystemType.GetConstructor(signature); - var wrapper = new LuaMethodWrapper(this, null, klass, constructor); - var invokeDelegate = wrapper.InvokeFunction; - PushFunction(luaState, invokeDelegate); - } - catch (Exception e) - { - ThrowError(luaState, e); - } - return 1; - } - - /* - * Pushes a type reference into the stack - */ - internal void PushType(LuaState luaState, Type t) - { - PushObject(luaState, new ProxyType(t), "luaNet_class"); - } - - /* - * Pushes a delegate into the stack - */ - internal void PushFunction(LuaState luaState, LuaNativeFunction func) - { - PushObject(luaState, func, "luaNet_function"); - } - - - /* - * Pushes a CLR object into the Lua stack as an userdata - * with the provided metatable - */ - internal void PushObject(LuaState luaState, object o, string metatable) - { - int index = -1; - - // Pushes nil - if (o == null) - { - luaState.PushNil(); - return; - } - - // Object already in the list of Lua objects? Push the stored reference. - bool found = (!o.GetType().IsValueType || o.GetType().IsEnum) && _objectsBackMap.TryGetValue(o, out index); - - if (found) - { - luaState.GetMetaTable("luaNet_objects"); - luaState.RawGetInteger(-1, index); - - // Note: starting with lua5.1 the garbage collector may remove weak reference items (such as our luaNet_objects values) when the initial GC sweep - // occurs, but the actual call of the __gc finalizer for that object may not happen until a little while later. During that window we might call - // this routine and find the element missing from luaNet_objects, but collectObject() has not yet been called. In that case, we go ahead and call collect - // object here - // did we find a non nil object in our table? if not, we need to call collect object - var type = luaState.Type(-1); - if (type != LuaType.Nil) - { - luaState.Remove(-2); // drop the metatable - we're going to leave our object on the stack - return; - } - - // MetaFunctions.dumpStack(this, luaState); - luaState.Remove(-1); // remove the nil object value - luaState.Remove(-1); // remove the metatable - CollectObject(o, index); // Remove from both our tables and fall out to get a new ID - } - - index = AddObject(o); - PushNewObject(luaState, o, index, metatable); - } - - /* - * Pushes a new object into the Lua stack with the provided - * metatable - */ - private void PushNewObject(LuaState luaState, object o, int index, string metatable) - { - if (metatable == "luaNet_metatable") - { - // Gets or creates the metatable for the object's type - luaState.GetMetaTable(o.GetType().AssemblyQualifiedName); - - if (luaState.IsNil(-1)) - { - luaState.SetTop(-2); - luaState.NewMetaTable(o.GetType().AssemblyQualifiedName); - luaState.PushString("cache"); - luaState.NewTable(); - luaState.RawSet(-3); - luaState.PushLightUserData(_tagPtr); - luaState.PushNumber(1); - luaState.RawSet(-3); - luaState.PushString("__index"); - luaState.PushString("luaNet_indexfunction"); - luaState.RawGet(LuaRegistry.Index); - luaState.RawSet(-3); - luaState.PushString("__gc"); - luaState.PushCFunction(MetaFunctions.GcFunction); - luaState.RawSet(-3); - luaState.PushString("__tostring"); - luaState.PushCFunction(MetaFunctions.ToStringFunction); - luaState.RawSet(-3); - luaState.PushString("__newindex"); - luaState.PushCFunction(MetaFunctions.NewIndexFunction); - luaState.RawSet(-3); - // Bind C# operator with Lua metamethods (__add, __sub, __mul) - RegisterOperatorsFunctions(luaState, o.GetType()); - RegisterCallMethodForDelegate(luaState, o); - } - } - else - luaState.GetMetaTable(metatable); - - // Stores the object index in the Lua list and pushes the - // index into the Lua stack - luaState.GetMetaTable("luaNet_objects"); - luaState.NewUData(index); - luaState.PushCopy(-3); - luaState.Remove(-4); - luaState.SetMetaTable(-2); - luaState.PushCopy(-1); - luaState.RawSetInteger(-3, index); - luaState.Remove(-2); - } - - void RegisterCallMethodForDelegate(LuaState luaState, object o) - { - if (!(o is Delegate)) - return; - - luaState.PushString("__call"); - luaState.PushCFunction(MetaFunctions.CallDelegateFunction); - luaState.RawSet(-3); - } - - void RegisterOperatorsFunctions(LuaState luaState, Type type) - { - if (type.HasAdditionOperator()) - { - luaState.PushString("__add"); - luaState.PushCFunction(MetaFunctions.AddFunction); - luaState.RawSet(-3); - } - if (type.HasSubtractionOperator()) - { - luaState.PushString("__sub"); - luaState.PushCFunction(MetaFunctions.SubtractFunction); - luaState.RawSet(-3); - } - if (type.HasMultiplyOperator()) - { - luaState.PushString("__mul"); - luaState.PushCFunction(MetaFunctions.MultiplyFunction); - luaState.RawSet(-3); - } - if (type.HasDivisionOperator()) - { - luaState.PushString("__div"); - luaState.PushCFunction(MetaFunctions.DivisionFunction); - luaState.RawSet(-3); - } - if (type.HasModulusOperator()) - { - luaState.PushString("__mod"); - luaState.PushCFunction(MetaFunctions.ModulosFunction); - luaState.RawSet(-3); - } - if (type.HasUnaryNegationOperator()) - { - luaState.PushString("__unm"); - luaState.PushCFunction(MetaFunctions.UnaryNegationFunction); - luaState.RawSet(-3); - } - if (type.HasEqualityOperator()) - { - luaState.PushString("__eq"); - luaState.PushCFunction(MetaFunctions.EqualFunction); - luaState.RawSet(-3); - } - if (type.HasLessThanOperator()) - { - luaState.PushString("__lt"); - luaState.PushCFunction(MetaFunctions.LessThanFunction); - luaState.RawSet(-3); - } - if (type.HasLessThanOrEqualOperator()) - { - luaState.PushString("__le"); - luaState.PushCFunction(MetaFunctions.LessThanOrEqualFunction); - luaState.RawSet(-3); - } - } - - /* - * Gets an object from the Lua stack with the desired type, if it matches, otherwise - * returns null. - */ - internal object GetAsType(LuaState luaState, int stackPos, Type paramType) - { - var extractor = typeChecker.CheckLuaType(luaState, stackPos, paramType); - return extractor != null ? extractor(luaState, stackPos) : null; - } - - /// - /// Given the Lua int ID for an object remove it from our maps - /// - /// - internal void CollectObject(int udata) - { - object o; - bool found = _objects.TryGetValue(udata, out o); - - // The other variant of collectObject might have gotten here first, in that case we will silently ignore the missing entry - if (found) - CollectObject(o, udata); - } - - /// - /// Given an object reference, remove it from our maps - /// - /// - /// - private void CollectObject(object o, int udata) - { - _objects.Remove(udata); - if (!o.GetType().IsValueType || o.GetType().IsEnum) - _objectsBackMap.Remove(o); - } - - private int AddObject(object obj) - { - // New object: inserts it in the list - int index = _nextObj++; - _objects[index] = obj; - - if (!obj.GetType().IsValueType || obj.GetType().IsEnum) - _objectsBackMap[obj] = index; - - return index; - } - - /* - * Gets an object from the Lua stack according to its Lua type. - */ - internal object GetObject(LuaState luaState, int index) - { - LuaType type = luaState.Type(index); - - switch (type) - { - case LuaType.Number: - { - if (luaState.IsInteger(index)) - return luaState.ToInteger(index); - - return luaState.ToNumber(index); - } - case LuaType.String: - return luaState.ToString(index, false); - case LuaType.Boolean: - return luaState.ToBoolean(index); - case LuaType.Table: - return GetTable(luaState, index); - case LuaType.Function: - return GetFunction(luaState, index); - case LuaType.UserData: - { - int udata = luaState.ToNetObject(index, Tag); - return udata != -1 ? _objects[udata] : GetUserData(luaState, index); - } - default: - return null; - } - } - - /* - * Gets the table in the index positon of the Lua stack. - */ - internal LuaTable GetTable(LuaState luaState, int index) - { - // Before create new tables, check if there is any finalized object to clean. - CleanFinalizedReferences(luaState); - - luaState.PushCopy(index); - int reference = luaState.Ref(LuaRegistry.Index); - if (reference == -1) - return null; - return new LuaTable(reference, interpreter); - } - - /* - * Gets the userdata in the index positon of the Lua stack. - */ - internal LuaUserData GetUserData(LuaState luaState, int index) - { - // Before create new tables, check if there is any finalized object to clean. - CleanFinalizedReferences(luaState); - - luaState.PushCopy(index); - int reference = luaState.Ref(LuaRegistry.Index); - if (reference == -1) - return null; - return new LuaUserData(reference, interpreter); - } - - /* - * Gets the function in the index positon of the Lua stack. - */ - internal LuaFunction GetFunction(LuaState luaState, int index) - { - // Before create new tables, check if there is any finalized object to clean. - CleanFinalizedReferences(luaState); - - luaState.PushCopy(index); - int reference = luaState.Ref(LuaRegistry.Index); - if (reference == -1) - return null; - return new LuaFunction(reference, interpreter); - } - - /* - * Gets the CLR object in the index positon of the Lua stack. Returns - * delegates as Lua functions. - */ - internal object GetNetObject(LuaState luaState, int index) - { - int idx = luaState.ToNetObject(index, Tag); - return idx != -1 ? _objects[idx] : null; - } - - /* - * Gets the CLR object in the index position of the Lua stack. Returns - * delegates as is. - */ - internal object GetRawNetObject(LuaState luaState, int index) - { - int udata = luaState.RawNetObj(index); - return udata != -1 ? _objects[udata] : null; - } - - - /* - * Gets the values from the provided index to - * the top of the stack and returns them in an array. - */ - internal object[] PopValues(LuaState luaState, int oldTop) - { - int newTop = luaState.GetTop(); - - if (oldTop == newTop) - return null; - - var returnValues = new List(); - for (int i = oldTop + 1; i <= newTop; i++) - returnValues.Add(GetObject(luaState, i)); - - luaState.SetTop(oldTop); - return returnValues.ToArray(); - } - - /* - * Gets the values from the provided index to - * the top of the stack and returns them in an array, casting - * them to the provided types. - */ - internal object[] PopValues(LuaState luaState, int oldTop, Type[] popTypes) - { - int newTop = luaState.GetTop(); - - if (oldTop == newTop) - return null; - - int iTypes; - var returnValues = new List(); - - if (popTypes[0] == typeof(void)) - iTypes = 1; - else - iTypes = 0; - - for (int i = oldTop + 1; i <= newTop; i++) - { - returnValues.Add(GetAsType(luaState, i, popTypes[iTypes])); - iTypes++; - } - - luaState.SetTop(oldTop); - return returnValues.ToArray(); - } - - // The following line doesn't work for remoting proxies - they always return a match for 'is' - // else if (o is ILuaGeneratedType) - private static bool IsILua(object o) - { - if (o is ILuaGeneratedType) - { - // Make sure we are _really_ ILuaGenerated - var typ = o.GetType(); - return typ.GetInterface("ILuaGeneratedType", true) != null; - } - return false; - } - - /* - * Pushes the object into the Lua stack according to its type. - */ - internal void Push(LuaState luaState, object o) - { - if (o == null) - luaState.PushNil(); - else if (o is sbyte sb) - luaState.PushInteger(sb); - else if(o is byte bt) - luaState.PushInteger(bt); - else if(o is short s) - luaState.PushInteger(s); - else if (o is ushort us) - luaState.PushInteger(us); - else if (o is int i) - luaState.PushInteger(i); - else if (o is uint ui) - luaState.PushInteger(ui); - else if (o is long l) - luaState.PushInteger(l); - else if (o is ulong ul) - luaState.PushInteger((long)ul); - else if (o is char ch) - luaState.PushInteger(ch); - else if (o is float fl) - luaState.PushNumber(fl); - else if(o is decimal dc) - luaState.PushNumber((double)dc); - else if(o is double db) - luaState.PushNumber(db); - else if (o is string str) - luaState.PushString(str); - else if (o is bool b) - luaState.PushBoolean(b); - else if (IsILua(o)) - ((ILuaGeneratedType)o).LuaInterfaceGetLuaTable().Push(luaState); - else if (o is LuaTable table) - table.Push(luaState); - else if (o is LuaNativeFunction nativeFunction) - PushFunction(luaState, nativeFunction); - else if (o is LuaFunction luaFunction) - luaFunction.Push(luaState); - else - PushObject(luaState, o, "luaNet_metatable"); - } - - /* - * Checks if the method matches the arguments in the Lua stack, getting - * the arguments if it does. - */ - internal bool MatchParameters(LuaState luaState, MethodBase method, MethodCache methodCache, int skipParam) - { - return metaFunctions.MatchParameters(luaState, method, methodCache, skipParam); - } - - internal Array TableToArray(LuaState luaState, ExtractValue extractValue, Type paramArrayType, int startIndex, int count) - { - return metaFunctions.TableToArray(luaState, extractValue, paramArrayType, ref startIndex, count); - } - - private Type TypeOf(LuaState luaState, int idx) - { - int udata = luaState.CheckUObject(idx, "luaNet_class"); - if (udata == -1) - return null; - - var pt = (ProxyType)_objects[udata]; - return pt.UnderlyingSystemType; - } - - static int PushError(LuaState luaState, string msg) - { - luaState.PushNil(); - luaState.PushString(msg); - return 2; - } - -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int CType(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - return translator.CTypeInternal(state); - } - - int CTypeInternal(LuaState luaState) - { - Type t = TypeOf(luaState,1); - if (t == null) - return PushError(luaState, "Not a CLR Class"); - - PushObject(luaState, t, "luaNet_metatable"); - return 1; - } - -#if __IOS__ || __TVOS__ || __WATCHOS__ - [MonoPInvokeCallback(typeof(LuaNativeFunction))] -#endif - private static int EnumFromInt(IntPtr luaState) - { - var state = LuaState.FromIntPtr(luaState); - var translator = ObjectTranslatorPool.Instance.Find(state); - return translator.EnumFromIntInternal(state); - } - - int EnumFromIntInternal(LuaState luaState) - { - Type t = TypeOf(luaState, 1); - if (t == null || !t.IsEnum) - return PushError(luaState, "Not an Enum."); - - object res = null; - LuaType lt = luaState.Type(2); - if (lt == LuaType.Number) - { - int ival = (int)luaState.ToNumber(2); - res = Enum.ToObject(t, ival); - } - else if (lt == LuaType.String) - { - string sflags = luaState.ToString(2, false); - string err = null; - try - { - res = Enum.Parse(t, sflags, true); - } - catch (ArgumentException e) - { - err = e.Message; - } - if (err != null) - return PushError(luaState, err); - } - else - { - return PushError(luaState, "Second argument must be a integer or a string."); - } - PushObject(luaState, res, "luaNet_metatable"); - return 1; - } - - internal void AddFinalizedReference(int reference) - { - finalizedReferences.Enqueue(reference); - } - - void CleanFinalizedReferences(LuaState state) - { - if (finalizedReferences.Count == 0) - return; - - int reference; - - while (finalizedReferences.TryDequeue(out reference)) - state.Unref(LuaRegistry.Index, reference); - } - } -} diff --git a/src/LUA/ObjectTranslatorPool.cs b/src/LUA/ObjectTranslatorPool.cs deleted file mode 100644 index 7f1ac25..0000000 --- a/src/LUA/ObjectTranslatorPool.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Concurrent; - -using LuaState = KeraLua.Lua; - -namespace NLua -{ - internal class ObjectTranslatorPool - { - private static volatile ObjectTranslatorPool _instance = new ObjectTranslatorPool(); - - private ConcurrentDictionary translators = new ConcurrentDictionary(); - - public static ObjectTranslatorPool Instance => _instance; - - - public void Add(LuaState luaState, ObjectTranslator translator) - { - if(!translators.TryAdd(luaState, translator)) - throw new ArgumentException("An item with the same key has already been added. ", "luaState"); - } - - public ObjectTranslator Find(LuaState luaState) - { - ObjectTranslator translator; - - if(!translators.TryGetValue(luaState, out translator)) - { - LuaState main = luaState.MainThread; - - if (!translators.TryGetValue(main, out translator)) - return null; - } - return translator; - } - - public void Remove(LuaState luaState) - { - ObjectTranslator translator; - translators.TryRemove(luaState, out translator); - } - } -} - diff --git a/src/LUA/Properties/AssemblyInfo.cs b/src/LUA/Properties/AssemblyInfo.cs deleted file mode 100644 index befb0a5..0000000 --- a/src/LUA/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Reflection; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -#if NETFRAMEWORK -[assembly: AssemblyTitle ("NLua (.NET Framework 4.5)")] -#elif WINDOWS_UWP -[assembly: AssemblyTitle ("NLua (Windows Universal)")] -#elif __ANDROID__ -[assembly: AssemblyTitle ("NLua (Xamarin.Android)")] -#elif NETCOREAPP -[assembly: AssemblyTitle ("NLua (.NET Core)")] -#elif NETSTANDARD -[assembly: AssemblyTitle ("NLua (.NET Standard)")] -#elif __TVOS__ -[assembly: AssemblyTitle ("NLua (Xamarin.tvOS)")] -#elif __WATCHOS__ -[assembly: AssemblyTitle ("NLua (Xamarin.watchOS)")] -#elif __IOS__ -[assembly: AssemblyTitle ("NLua (Xamarin.iOS)")] -#elif __MACOS__ -[assembly: AssemblyTitle ("NLua (Xamarin.Mac)")] -#else -[assembly: AssemblyTitle ("NLua (.NET Framework)")] -#endif - -[assembly: AssemblyDescription ("NLua library")] -[assembly: AssemblyCompany ("NLua.org")] -[assembly: AssemblyProduct ("NLua")] -[assembly: AssemblyCopyright ("Copyright © Vinicius Jarina 2020")] -[assembly: AssemblyCulture ("")] - - -[assembly: AssemblyVersion("1.4.1.0")] -[assembly: AssemblyInformationalVersion("1.0.7+Branch.master.Sha.80a328a64f12ed9032a0f14a75e6ecad967514d0")] -[assembly: AssemblyFileVersion("1.4.1.0")] - - diff --git a/src/LUA/ProxyType.cs b/src/LUA/ProxyType.cs deleted file mode 100644 index 92c0075..0000000 --- a/src/LUA/ProxyType.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Reflection; - -namespace NLua -{ - /// - /// Summary description for ProxyType. - /// - public class ProxyType - { - private readonly Type _proxy; - - public ProxyType(Type proxy) - { - _proxy = proxy; - } - - /// - /// Provide human readable short hand for this proxy object - /// - /// - public override string ToString() - { - return "ProxyType(" + UnderlyingSystemType + ")"; - } - - public Type UnderlyingSystemType => _proxy; - - public override bool Equals(object obj) - { - if (obj is Type) - return _proxy == (Type)obj; - if (obj is ProxyType) - return _proxy == ((ProxyType)obj).UnderlyingSystemType; - return _proxy.Equals(obj); - } - - public override int GetHashCode() - { - return _proxy.GetHashCode(); - } - - public MemberInfo[] GetMember(string name, BindingFlags bindingAttr) - { - return _proxy.GetMember(name, bindingAttr); - } - - public MethodInfo GetMethod(string name, BindingFlags bindingAttr, Type[] signature) - { - return _proxy.GetMethod(name, bindingAttr, null, signature, null); - } - } -} \ No newline at end of file diff --git a/src/LUAEngine.cs b/src/LUAEngine.cs index 91372d9..0184cd0 100644 --- a/src/LUAEngine.cs +++ b/src/LUAEngine.cs @@ -20,42 +20,66 @@ namespace OpenSim.Region.ScriptEngine.Lua [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LUAEngine")] class LUAEngine : INonSharedRegionModule, IScriptModule, IScriptEngine { + private IConfigSource m_config = null; + + private Scene m_scene = null; + + private bool m_enable = true; + private bool m_sandbox = true; + + public event ScriptRemoved OnScriptRemoved; + public event ObjectRemoved OnObjectRemoved; + #region INonSharedRegionModule - public string Name => throw new NotImplementedException(); - - public Type ReplaceableInterface => throw new NotImplementedException(); - - public void AddRegion(Scene scene) + public string Name { - throw new NotImplementedException(); + get { return "LUAEngine"; } } - public void Close() + public Type ReplaceableInterface { - throw new NotImplementedException(); + get { return null; } } public void Initialise(IConfigSource source) { - throw new NotImplementedException(); + if (source.Configs["LUA"] == null) + return; + + m_config = source; + + m_enable = source.Configs["LUA"].GetBoolean("Enable", m_enable); + m_sandbox = source.Configs["LUA"].GetBoolean("Sandbox", m_sandbox); } - public void RegionLoaded(Scene scene) + public void AddRegion(Scene scene) { - throw new NotImplementedException(); + if (m_scene == null) + m_scene = scene; } public void RemoveRegion(Scene scene) { - throw new NotImplementedException(); + m_scene = null; + } + + public void Close() + { + m_scene = null; + } + + public void RegionLoaded(Scene scene) + { + if (m_scene == null) + m_scene = scene; } #endregion #region IScriptModule - public string ScriptEngineName => throw new NotImplementedException(); - - public event ScriptRemoved OnScriptRemoved; - public event ObjectRemoved OnObjectRemoved; + public string ScriptEngineName + { + get { return "LUAEngine"; } + } public Dictionary GetObjectScriptsExecutionTimes() { @@ -125,15 +149,27 @@ namespace OpenSim.Region.ScriptEngine.Lua #endregion #region IScriptEngine - public Scene World => throw new NotImplementedException(); + public Scene World + { + get { return m_scene; } + } public IScriptModule ScriptModule => throw new NotImplementedException(); - public IConfig Config => throw new NotImplementedException(); + public IConfig Config + { + get { return m_config.Configs["LUA"]; } + } - public IConfigSource ConfigSource => throw new NotImplementedException(); + public IConfigSource ConfigSource + { + get { return m_config; } + } - public string ScriptEnginePath => throw new NotImplementedException(); + public string ScriptEnginePath + { + get { return "./LUAScriptEngine"; } + } public string ScriptClassName => throw new NotImplementedException(); diff --git a/src/RunningScript.cs b/src/RunningScript.cs new file mode 100644 index 0000000..d5f4964 --- /dev/null +++ b/src/RunningScript.cs @@ -0,0 +1,23 @@ +using OpenMetaverse; +using OpenSim.Region.Framework.Scenes; +using NLua; + +namespace OpenSim.Region.ScriptEngine.Lua +{ + class RunningScript + { + private SceneObjectPart m_host = null; + private InventoryItem m_item = null; + private Lua m_runtime = null; + + private RunningScript(InventoryItem item, SceneObjectPart host) + { + m_host = host; + m_item = item; + + m_runtime = new Lua(); + } + + + } +}