diff --git a/.github/actions/dotnet/action.yml b/.github/actions/dotnet/action.yml index f259435..d18d2c8 100644 --- a/.github/actions/dotnet/action.yml +++ b/.github/actions/dotnet/action.yml @@ -19,9 +19,9 @@ runs: - name: Build run: dotnet build $Env:SOLUTION_PATH -c Release --no-restore -p:NoWarn=1591 shell: pwsh - # - name: Test - # run: dotnet test $Env:SOLUTION_PATH --no-restore --verbosity minimal - # shell: pwsh + - name: Test + run: dotnet test $Env:SOLUTION_PATH --no-restore --verbosity minimal + shell: pwsh - name: Pack run: | Invoke-Expression "dotnet pack $Env:SOLUTION_PATH -c Release -o ./artifacts --no-restore --no-build $($Env:VERSION_SUFFIX ? "--version-suffix=$Env:VERSION_SUFFIX" : $null)" diff --git a/src/Laylua.Playground/Laylua.Playground.csproj b/src/Laylua.Playground/Laylua.Playground.csproj index a789e32..6bcec1e 100644 --- a/src/Laylua.Playground/Laylua.Playground.csproj +++ b/src/Laylua.Playground/Laylua.Playground.csproj @@ -1,7 +1,7 @@ - + - net6.0;net7.0 + net8.0 Exe true @@ -9,15 +9,12 @@ Laylua.Console - - x64 - - + diff --git a/src/Laylua.Tests/Laylua.Tests.csproj b/src/Laylua.Tests/Laylua.Tests.csproj index c3bface..3337ce2 100644 --- a/src/Laylua.Tests/Laylua.Tests.csproj +++ b/src/Laylua.Tests/Laylua.Tests.csproj @@ -13,6 +13,7 @@ + diff --git a/src/Laylua.Tests/Tests/Moon/ErrorHandlingTests.cs b/src/Laylua.Tests/Tests/Moon/ErrorHandlingTests.cs index 663cbf8..a706bf4 100644 --- a/src/Laylua.Tests/Tests/Moon/ErrorHandlingTests.cs +++ b/src/Laylua.Tests/Tests/Moon/ErrorHandlingTests.cs @@ -49,4 +49,15 @@ public void LuaError_LuaFunction_ProtectedLongJmp_GetsCaughtWithLuaException() // Act & Assert Assert.Throws(() => function.Call()); } + + [Test] + public void LuaError_NestedLuaFunction_ProtectedLongJmp_GetsCaughtWithLuaException() + { + // Arrange + Lua.SetGlobal("print", (Action) Console.WriteLine); + Lua.SetGlobal("func", (string code) => Lua.Execute(code)); + + // Act & Assert + Assert.Throws(() => Lua.Execute(@"print(func('print(\'abc\')'))")); + } } diff --git a/src/Laylua/Laylua.csproj b/src/Laylua/Laylua.csproj index 7fa640f..b9e166b 100644 --- a/src/Laylua/Laylua.csproj +++ b/src/Laylua/Laylua.csproj @@ -13,6 +13,7 @@ + diff --git a/src/Laylua/Moon/Native/Laylua/LayluaNative.FunctionWrappers.cs b/src/Laylua/Moon/Native/Laylua/LayluaNative.FunctionWrappers.cs index 7c79ace..a7d9c19 100644 --- a/src/Laylua/Moon/Native/Laylua/LayluaNative.FunctionWrappers.cs +++ b/src/Laylua/Moon/Native/Laylua/LayluaNative.FunctionWrappers.cs @@ -253,7 +253,6 @@ public static IntPtr CreateLuaHookFunctionWrapper(LuaHookFunction function) return asmPtr; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Span AllocFunctionWrapperAsm(out IntPtr asmPtr) { @@ -272,7 +271,9 @@ private static void WriteFunctionWrapperPointers(Span asmSpan, #endif ) { - // var functionPtr = Marshal.GetFunctionPointerForDelegate(function); +#if TRACE_PANIC + var functionPtr = Marshal.GetFunctionPointerForDelegate(function); +#endif var functionWrapperPtr = Marshal.GetFunctionPointerForDelegate(functionWrapper); // MemoryMarshal.Write(asmSpan.Slice(21), ref functionPtr); diff --git a/src/Laylua/Moon/Native/Laylua/LayluaNative.cs b/src/Laylua/Moon/Native/Laylua/LayluaNative.cs index 384462a..cc487eb 100644 --- a/src/Laylua/Moon/Native/Laylua/LayluaNative.cs +++ b/src/Laylua/Moon/Native/Laylua/LayluaNative.cs @@ -219,6 +219,8 @@ internal static void ThrowPanicException(lua_State* L) private static void InitializePanicHooks() { + var libraryHandle = NativeLibrary.Load("lua54", typeof(LayluaNative).Assembly, null); + static IntPtr PrepareHookAsm(IntPtr export, IntPtr throwPanicExceptionPtr) { delegate* unmanaged[Cdecl] mPtrDel = &SetPanicJump; @@ -263,7 +265,7 @@ static IntPtr PrepareHookAsm(IntPtr export, IntPtr throwPanicExceptionPtr) if (delegateType == null) throw new InvalidOperationException($"No matching panic delegate '{delegateName}' found."); - if (!NativeLibrary.TryGetExport(NativeLibrary.Load(OperatingSystem.IsWindows() ? "lua54" : "liblua54.so"), exportName, out var exportPtr)) + if (!NativeLibrary.TryGetExport(libraryHandle, exportName, out var exportPtr)) { if (method.GetCustomAttribute() == null) throw new InvalidOperationException($"No export '{exportName}' found."); diff --git a/src/nuget.config b/src/nuget.config new file mode 100644 index 0000000..89533a6 --- /dev/null +++ b/src/nuget.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file