2
0
Эх сурвалжийг харах

Improve: support nested coroutine stacktrace

AnnulusGames 1 жил өмнө
parent
commit
7898332ff5

+ 1 - 1
src/Lua/LuaFunction.cs

@@ -28,7 +28,7 @@ public abstract partial class LuaFunction
         }
         }
         catch (Exception ex) when (ex is not (LuaException or OperationCanceledException))
         catch (Exception ex) when (ex is not (LuaException or OperationCanceledException))
         {
         {
-            throw new LuaRuntimeException(thread.GetTraceback(), ex.Message);
+            throw new LuaRuntimeException(state.GetTraceback(), ex.Message);
         }
         }
         finally
         finally
         {
         {

+ 8 - 1
src/Lua/LuaState.cs

@@ -76,7 +76,14 @@ public sealed class LuaState
 
 
     public Traceback GetTraceback()
     public Traceback GetTraceback()
     {
     {
-        return MainThread.GetTraceback();
+        // TODO: optimize
+        return new()
+        {
+            StackFrames = threadStack.AsSpan().ToArray()
+                .Append(MainThread)
+                .SelectMany(x => x.GetStackFrames())
+                .ToArray()
+        };
     }
     }
 
 
     internal UpValue GetOrAddUpValue(LuaThread thread, int registerIndex)
     internal UpValue GetOrAddUpValue(LuaThread thread, int registerIndex)

+ 2 - 5
src/Lua/LuaThread.cs

@@ -24,12 +24,9 @@ public abstract class LuaThread
         return stack.AsSpan();
         return stack.AsSpan();
     }
     }
 
 
-    internal Traceback GetTraceback()
+    internal CallStackFrame[] GetStackFrames()
     {
     {
-        return new()
-        {
-            StackFrames = callStack.AsSpan()[1..].ToArray()
-        };
+        return callStack.AsSpan()[1..].ToArray();
     }
     }
 
 
     internal void PushCallStackFrame(CallStackFrame frame)
     internal void PushCallStackFrame(CallStackFrame frame)