Browse Source

fix: minus variableArgumentCount

Akeit0 7 months ago
parent
commit
2dbe7fae0d

+ 10 - 1
src/Lua/LuaFunctionExtensions.cs

@@ -9,7 +9,16 @@ public static class LuaFunctionExtensions
         var varArgumentCount = function.GetVariableArgumentCount(argumentCount);
         if (varArgumentCount != 0)
         {
-            LuaVirtualMachine.PrepareVariableArgument(thread.Stack, argumentCount, varArgumentCount);
+            if (varArgumentCount < 0)
+            {
+                thread.Stack.SetTop(thread.Stack.Count - varArgumentCount);
+                argumentCount -= varArgumentCount;
+                varArgumentCount = 0;
+            }
+            else
+            {
+                LuaVirtualMachine.PrepareVariableArgument(thread.Stack, argumentCount, varArgumentCount);
+            }
         }
 
         LuaFunctionExecutionContext context = new() { Thread = thread, ArgumentCount = argumentCount - varArgumentCount, ReturnFrameBase = thread.Stack.Count, };

+ 2 - 0
src/Lua/LuaThreadExtensions.cs

@@ -89,11 +89,13 @@ public static class LuaThreadExtensions
 
     public static ReadOnlySpan<LuaValue> GetStackValues(this LuaThread thread)
     {
+        if (thread.CoreData == null) return default;
         return thread.CoreData!.Stack.AsSpan();
     }
 
     public static ReadOnlySpan<CallStackFrame> GetCallStackFrames(this LuaThread thread)
     {
+        if (thread.CoreData == null) return default;
         return thread.CoreData!.CallStack.AsSpan();
     }
 

+ 2 - 1
src/Lua/LuaUserThread.cs

@@ -14,8 +14,9 @@ public sealed class LuaUserThread : LuaThread, IPoolNode<LuaUserThread>
         {
             result = new LuaUserThread();
         }
+
         result.State = parent.State;
-        result.CoreData =ThreadCoreData.Create();
+        result.CoreData = ThreadCoreData.Create();
 
         return result;
     }

+ 8 - 1
src/Lua/Runtime/LuaVirtualMachine.cs

@@ -1693,7 +1693,14 @@ public static partial class LuaVirtualMachine
 
         var variableArgumentCount = function.GetVariableArgumentCount(argumentCount);
 
-        if (variableArgumentCount <= 0)
+        if (variableArgumentCount < 0)
+        {
+            thread.Stack.SetTop(thread.Stack.Count - variableArgumentCount);
+            argumentCount -= variableArgumentCount;
+            variableArgumentCount = 0;
+        }
+        
+        if (variableArgumentCount == 0)
         {
             return (argumentCount, 0);
         }