Browse Source

Fix: wrong function name with debug

Akeit0 10 months ago
parent
commit
3064beed0f
3 changed files with 49 additions and 22 deletions
  1. 2 1
      src/Lua/Internal/LuaDebug.cs
  2. 31 9
      src/Lua/Runtime/Tracebacks.cs
  3. 16 12
      src/Lua/Standard/DebugLibrary.cs

+ 2 - 1
src/Lua/Internal/LuaDebug.cs

@@ -379,7 +379,7 @@ internal readonly struct LuaDebug : IDisposable
 
 
     static void GetConstantName(Chunk p, int pc, int c, out string name)
     static void GetConstantName(Chunk p, int pc, int c, out string name)
     {
     {
-        if (c > 256)
+        if (c >= 256)
         {
         {
             /* is 'c' a constant? */
             /* is 'c' a constant? */
             ref var kvalue = ref p.Constants[c - 256];
             ref var kvalue = ref p.Constants[c - 256];
@@ -435,6 +435,7 @@ internal readonly struct LuaDebug : IDisposable
                     {
                     {
                         int k = i.C; /* key index */
                         int k = i.C; /* key index */
                         int t = i.B; /* table index */
                         int t = i.B; /* table index */
+                        
                         var vn = (op == OpCode.GetTable) /* name of indexed variable */
                         var vn = (op == OpCode.GetTable) /* name of indexed variable */
                             ? GetLocalName(chunk, t + 1, pc)
                             ? GetLocalName(chunk, t + 1, pc)
                             : chunk.UpValues[t].Name.ToString();
                             : chunk.UpValues[t].Name.ToString();

+ 31 - 9
src/Lua/Runtime/Tracebacks.cs

@@ -83,22 +83,44 @@ public class Traceback
                 if (index > 0 && caller is Closure callerClosure)
                 if (index > 0 && caller is Closure callerClosure)
                 {
                 {
                     var t = LuaDebug.GetFuncName(callerClosure.Proto, stackFrames[index - 1].CallerInstructionIndex, out var name);
                     var t = LuaDebug.GetFuncName(callerClosure.Proto, stackFrames[index - 1].CallerInstructionIndex, out var name);
-                    if (t is not null and not "global")
+                    if (t is not null)
                     {
                     {
-                        list.AddRange(t);
-                        list.AddRange(" '");
-                        list.AddRange(name);
-                        list.AddRange("'\n");
+                        if (t is "global")
+                        {
+                            list.AddRange("function '");
+                            list.AddRange(name);
+                            list.AddRange("'\n");
+                        }
+                        else
+                        {
+                            list.AddRange(t);
+                            list.AddRange(" '");
+                            list.AddRange(name);
+                            list.AddRange("'\n");
+                        }
+
                         continue;
                         continue;
                     }
                     }
                 }
                 }
 
 
-                list.AddRange("function '");
-                list.AddRange(p.Name);
-                list.AddRange("\n");
+                if (p.Name != "")
+                {
+                    list.AddRange("function '");
+                    list.AddRange(p.Name);
+                    list.AddRange("'\n");
+                }
+                else
+                {
+                    list.AddRange("function <");
+                    list.AddRange(shortSourceBuffer[..len]);
+                    list.AddRange(":");
+                    p.LineDefined.TryFormat(intFormatBuffer, out charsWritten, provider: CultureInfo.InvariantCulture);
+                    list.AddRange(intFormatBuffer[..charsWritten]);
+                    list.AddRange(">\n");
+                }
             }
             }
         }
         }
 
 
-        return list.AsSpan().ToString();
+        return list.AsSpan()[..^1].ToString();
     }
     }
 }
 }

+ 16 - 12
src/Lua/Standard/DebugLibrary.cs

@@ -1,6 +1,7 @@
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
 using Lua.Runtime;
 using Lua.Runtime;
 using Lua.Internal;
 using Lua.Internal;
+
 namespace Lua.Standard;
 namespace Lua.Standard;
 
 
 public class DebugLibrary
 public class DebugLibrary
@@ -256,8 +257,7 @@ public class DebugLibrary
         var thread = GetLuaThread(context, out var argOffset);
         var thread = GetLuaThread(context, out var argOffset);
 
 
         var message = context.GetArgumentOrDefault(argOffset);
         var message = context.GetArgumentOrDefault(argOffset);
-        var level = context.GetArgumentOrDefault<int>(argOffset + 1, 0);
-
+        var level = context.GetArgumentOrDefault<int>(argOffset + 1, argOffset == 0 ? 1 : 0);
 
 
         if (message.Type is not (LuaValueType.Nil or LuaValueType.String or LuaValueType.Number))
         if (message.Type is not (LuaValueType.Nil or LuaValueType.String or LuaValueType.Number))
         {
         {
@@ -270,8 +270,9 @@ public class DebugLibrary
             buffer.Span[0] = LuaValue.Nil;
             buffer.Span[0] = LuaValue.Nil;
             return new(1);
             return new(1);
         }
         }
-
-        thread.PushCallStackFrame(thread.GetCurrentFrame());
+        
+        var currentFrame =thread.GetCallStackFrames().Length>0? thread.GetCallStackFrames()[^1]:default;
+        thread.PushCallStackFrame(currentFrame);
         var callStack = thread.GetCallStackFrames();
         var callStack = thread.GetCallStackFrames();
         var skipCount = Math.Min(level, callStack.Length - 1);
         var skipCount = Math.Min(level, callStack.Length - 1);
         var frames = callStack[1..^skipCount];
         var frames = callStack[1..^skipCount];
@@ -319,7 +320,7 @@ public class DebugLibrary
     {
     {
         //return new(0);
         //return new(0);
         var thread = GetLuaThread(context, out var argOffset);
         var thread = GetLuaThread(context, out var argOffset);
-        string what = context.GetArgumentOrDefault<string>(argOffset + 1,"flnStu");
+        string what = context.GetArgumentOrDefault<string>(argOffset + 1, "flnStu");
         CallStackFrame? previousFrame = null;
         CallStackFrame? previousFrame = null;
         CallStackFrame? currentFrame = null;
         CallStackFrame? currentFrame = null;
         int pc = 0;
         int pc = 0;
@@ -332,20 +333,20 @@ public class DebugLibrary
         else if (arg1.TryReadNumber(out _))
         else if (arg1.TryReadNumber(out _))
         {
         {
             var level = context.GetArgument<int>(argOffset) + 1;
             var level = context.GetArgument<int>(argOffset) + 1;
-            
+
             var callStack = thread.GetCallStackFrames();
             var callStack = thread.GetCallStackFrames();
             if (level <= 0 || level > callStack.Length)
             if (level <= 0 || level > callStack.Length)
             {
             {
                 context.ThrowBadArgument(1, "level out of range");
                 context.ThrowBadArgument(1, "level out of range");
             }
             }
+
             currentFrame = thread.GetCallStackFrames()[^(level)];
             currentFrame = thread.GetCallStackFrames()[^(level)];
             functionToInspect = currentFrame.Value.Function;
             functionToInspect = currentFrame.Value.Function;
-            previousFrame = level +1 <= callStack.Length?callStack[^(level + 1)]:null;
-            if(level!=0)
+            previousFrame = level + 1 <= callStack.Length ? callStack[^(level + 1)] : null;
+            if (level != 0)
             {
             {
                 pc = thread.GetCallStackFrames()[^(level - 1)].CallerInstructionIndex;
                 pc = thread.GetCallStackFrames()[^(level - 1)].CallerInstructionIndex;
             }
             }
-            
         }
         }
         else
         else
         {
         {
@@ -365,7 +366,8 @@ public class DebugLibrary
             table["short_src"] = debug.ShortSource.ToString();
             table["short_src"] = debug.ShortSource.ToString();
             table["linedefined"] = debug.LineDefined;
             table["linedefined"] = debug.LineDefined;
             table["lastlinedefined"] = debug.LastLineDefined;
             table["lastlinedefined"] = debug.LastLineDefined;
-            table["what"] = debug.What?? LuaValue.Nil;;
+            table["what"] = debug.What ?? LuaValue.Nil;
+            ;
         }
         }
 
 
         if (what.Contains('l'))
         if (what.Contains('l'))
@@ -382,8 +384,10 @@ public class DebugLibrary
 
 
         if (what.Contains('n'))
         if (what.Contains('n'))
         {
         {
-            table["name"] = debug.Name?? LuaValue.Nil;;
-            table["namewhat"] = debug.NameWhat?? LuaValue.Nil;;
+            table["name"] = debug.Name ?? LuaValue.Nil;
+            ;
+            table["namewhat"] = debug.NameWhat ?? LuaValue.Nil;
+            ;
         }
         }
 
 
         if (what.Contains('t'))
         if (what.Contains('t'))