Browse Source

Add: Tracebacks.FirstLine

Akeit0 6 months ago
parent
commit
274ba80cdc
2 changed files with 29 additions and 3 deletions
  1. 27 1
      src/Lua/Runtime/Tracebacks.cs
  2. 2 2
      tests/Lua.Tests/LuaTests.cs

+ 27 - 1
src/Lua/Runtime/Tracebacks.cs

@@ -67,6 +67,32 @@ public class Traceback(LuaState state, ReadOnlySpan<CallStackFrame> stackFrames)
         }
     }
 
+    public int FirstLine
+    {
+        get
+        {
+            var stackFrames = StackFrames;
+            for (var index = 1; index <= stackFrames.Length; index++)
+            {
+                LuaFunction lastFunc = stackFrames[index - 1].Function;
+                var frame = stackFrames[index];
+                if (!frame.IsTailCall && lastFunc is LuaClosure closure)
+                {
+                    var p = closure.Proto;
+                    if (frame.CallerInstructionIndex < 0 || p.LineInfo.Length <= frame.CallerInstructionIndex)
+                    {
+                        Console.WriteLine($"Trace back error");
+                        return default;
+                    }
+
+                    return p.LineInfo[frame.CallerInstructionIndex];
+                }
+            }
+
+            return default;
+        }
+    }
+
     public override string ToString()
     {
         return GetTracebackString(State, StackFrames, LuaValue.Nil);
@@ -145,7 +171,7 @@ public class Traceback(LuaState state, ReadOnlySpan<CallStackFrame> stackFrames)
                     goto Next;
                 }
 
-                if (0 < index && stackFrames[index - 1].Flags.HasFlag(CallStackFrameFlags.InHook))
+                if (stackFrames[index - 1].Flags.HasFlag(CallStackFrameFlags.InHook))
                 {
                     list.AddRange("hook");
                     list.AddRange(" '");

+ 2 - 2
tests/Lua.Tests/LuaTests.cs

@@ -16,7 +16,7 @@ public class LuaTests
     //[TestCase("tests-lua/sort.lua")] //check for "invalid order function" is not implemented
     //[TestCase("tests-lua/calls.lua")] //  string.dump and reader function for load chunk is not implemented
     [TestCase("tests-lua/closure.lua")]
-    //[TestCase("tests-lua/errors.lua")] // get table name  if nil is not implemented
+    [TestCase("tests-lua/errors.lua")] // get table name  if nil is not implemented
     [TestCase("tests-lua/events.lua")]
     [TestCase("tests-lua/vararg.lua")]
     [TestCase("tests-lua/nextvar.lua")]
@@ -44,7 +44,7 @@ public class LuaTests
                 throw;
             }
 
-            var line = luaTraceback.LastLine;
+            var line = luaTraceback.FirstLine;
             throw new Exception($"{path}:line {line}\n{e.InnerException}\n {e}");
         }
     }