Browse Source

Fix: `GetArgument<int>()` error message

AnnulusGames 11 months ago
parent
commit
47a2f408ef
2 changed files with 13 additions and 3 deletions
  1. 6 1
      src/Lua/Exceptions.cs
  2. 7 2
      src/Lua/LuaFunctionExecutionContext.cs

+ 6 - 1
src/Lua/Exceptions.cs

@@ -100,11 +100,16 @@ public class LuaRuntimeException : LuaException
         throw new LuaRuntimeException(traceback, $"bad argument #{argumentId} to '{functionName}' ({expected} expected, got {actual})");
     }
 
+    public static void BadArgumentNumberIsNotInteger(Traceback traceback, int argumentId, string functionName)
+    {
+        throw new LuaRuntimeException(traceback, $"bad argument #{argumentId} to '{functionName}' (number has no integer representation)");
+    }
+
     public static void ThrowBadArgumentIfNumberIsNotInteger(LuaState state, string functionName, int argumentId, double value)
     {
         if (!MathEx.IsInteger(value))
         {
-            throw new LuaRuntimeException(state.GetTraceback(), $"bad argument #{argumentId} to '{functionName}' (number has no integer representation)");
+            BadArgumentNumberIsNotInteger(state.GetTraceback(), argumentId, functionName);
         }
     }
 

+ 7 - 2
src/Lua/LuaFunctionExecutionContext.cs

@@ -46,13 +46,18 @@ public readonly record struct LuaFunctionExecutionContext
         var arg = Arguments[index];
         if (!arg.TryRead<T>(out var argValue))
         {
-            if (LuaValue.TryGetLuaValueType(typeof(T), out var type))
+            var t = typeof(T);
+            if ((t == typeof(int) || t == typeof(long)) && arg.TryReadNumber(out _))
+            {
+                LuaRuntimeException.BadArgumentNumberIsNotInteger(State.GetTraceback(), index + 1, Thread.GetCurrentFrame().Function.Name);
+            }
+            else if (LuaValue.TryGetLuaValueType(t, out var type))
             {
                 LuaRuntimeException.BadArgument(State.GetTraceback(), index + 1, Thread.GetCurrentFrame().Function.Name, type.ToString(), arg.Type.ToString());
             }
             else
             {
-                LuaRuntimeException.BadArgument(State.GetTraceback(), index + 1, Thread.GetCurrentFrame().Function.Name, typeof(T).Name, arg.Type.ToString());
+                LuaRuntimeException.BadArgument(State.GetTraceback(), index + 1, Thread.GetCurrentFrame().Function.Name, t.Name, arg.Type.ToString());
             }
         }