From cef72bef4b129d7f29fe182b8c9c0e539bf60abe Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Thu, 16 Nov 2023 09:08:20 -0800 Subject: [PATCH] try to fix crashes under Mono when calling a cached function with the wrong arguments --- .../GenerateEventAssembly/ClassGenerator.cs | 1 + ExternalProjects/NLua/src/Metatables.cs | 14 +++++------ .../NLua/src/Method/LuaMethodWrapper.cs | 23 ++++++++++++++---- ExternalProjects/NLua/src/ObjectTranslator.cs | 2 +- References/NLua.dll | Bin 104448 -> 104448 bytes 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/ExternalProjects/NLua/src/GenerateEventAssembly/ClassGenerator.cs b/ExternalProjects/NLua/src/GenerateEventAssembly/ClassGenerator.cs index d5fecdf9ab..49085881fd 100644 --- a/ExternalProjects/NLua/src/GenerateEventAssembly/ClassGenerator.cs +++ b/ExternalProjects/NLua/src/GenerateEventAssembly/ClassGenerator.cs @@ -1,4 +1,5 @@ using System; + using NLua.Native; namespace NLua.GenerateEventAssembly diff --git a/ExternalProjects/NLua/src/Metatables.cs b/ExternalProjects/NLua/src/Metatables.cs index 0a8bed480f..9ae34e1642 100644 --- a/ExternalProjects/NLua/src/Metatables.cs +++ b/ExternalProjects/NLua/src/Metatables.cs @@ -14,13 +14,13 @@ namespace NLua public class MetaFunctions { public static readonly LuaNativeFunction GcFunction = CollectObject; - public static readonly LuaNativeFunction IndexFunction = GetMethod; + 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 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; @@ -31,7 +31,7 @@ namespace NLua 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 LessThanFunction = LessThanLua; public static readonly LuaNativeFunction LessThanOrEqualFunction = LessThanOrEqualLua; internal readonly Dictionary> _memberCache = new(); diff --git a/ExternalProjects/NLua/src/Method/LuaMethodWrapper.cs b/ExternalProjects/NLua/src/Method/LuaMethodWrapper.cs index af1a839a18..72351510fb 100644 --- a/ExternalProjects/NLua/src/Method/LuaMethodWrapper.cs +++ b/ExternalProjects/NLua/src/Method/LuaMethodWrapper.cs @@ -103,7 +103,7 @@ namespace NLua.Method internal int SetPendingException(Exception e) => _translator.interpreter.SetPendingException(e); - internal void FillMethodArguments(LuaState luaState, int numStackToSkip) + internal int FillMethodArguments(LuaState luaState, int numStackToSkip) { var args = _lastCalledMethod.args; @@ -114,7 +114,7 @@ namespace NLua.Method if (_lastCalledMethod.argTypes[i].IsParamsArray) { var count = _lastCalledMethod.argTypes.Length - i; - var paramArray = _translator.TableToArray(luaState, type.ExtractValue, type.ParameterType, index, count); + var paramArray = ObjectTranslator.TableToArray(luaState, type.ExtractValue, type.ParameterType, index, count); args[_lastCalledMethod.argTypes[i].Index] = paramArray; } else @@ -125,9 +125,11 @@ namespace NLua.Method if (_lastCalledMethod.args[_lastCalledMethod.argTypes[i].Index] == null && !luaState.IsNil(i + 1 + numStackToSkip)) { - throw new LuaException($"Argument number {(i + 1)} is invalid"); + return i + 1; } } + + return 0; } internal int PushReturnValue(LuaState luaState) @@ -224,7 +226,13 @@ namespace NLua.Method throw new LuaException("Lua stack overflow"); } - FillMethodArguments(luaState, numStackToSkip); + var invalidArgNum = FillMethodArguments(luaState, 0); + if (invalidArgNum != 0) + { + _translator.ThrowError(luaState, $"Argument number {invalidArgNum} is invalid"); + return 1; + } + return CallInvoke(luaState, method, targetObject); } @@ -335,7 +343,12 @@ namespace NLua.Method throw new LuaException("Lua stack overflow"); } - FillMethodArguments(luaState, 0); + var invalidArgNum = FillMethodArguments(luaState, 0); + if (invalidArgNum != 0) + { + _translator.ThrowError(luaState, $"Argument number {invalidArgNum} is invalid"); + return 1; + } } else if (!_translator.MatchParameters(luaState, _method, _lastCalledMethod, 0)) { diff --git a/ExternalProjects/NLua/src/ObjectTranslator.cs b/ExternalProjects/NLua/src/ObjectTranslator.cs index 6ee9102aa8..e2c7d18030 100644 --- a/ExternalProjects/NLua/src/ObjectTranslator.cs +++ b/ExternalProjects/NLua/src/ObjectTranslator.cs @@ -1097,7 +1097,7 @@ namespace NLua internal bool MatchParameters(LuaState luaState, MethodBase method, MethodCache methodCache, int skipParam) => metaFunctions.MatchParameters(luaState, method, methodCache, skipParam); - internal Array TableToArray(LuaState luaState, ExtractValue extractValue, Type paramArrayType, int startIndex, int count) + internal static Array TableToArray(LuaState luaState, ExtractValue extractValue, Type paramArrayType, int startIndex, int count) => MetaFunctions.TableToArray(luaState, extractValue, paramArrayType, ref startIndex, count); private Type TypeOf(LuaState luaState, int idx) diff --git a/References/NLua.dll b/References/NLua.dll index 6307bfcf398e13ad677baa0f51324fb13fb51997..a949f1ec6c25b738f1d08aec00490ff74308a178 100644 GIT binary patch delta 14197 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