Browse Source

Change: TryGetNumber() -> TryRead<double>()

AnnulusGames 1 year ago
parent
commit
179c7f4c6d

+ 36 - 13
src/Lua/LuaValue.cs

@@ -1,5 +1,6 @@
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+using Lua.Internal;
 using Lua.Runtime;
 
 namespace Lua;
@@ -34,19 +35,7 @@ public readonly struct LuaValue : IEquatable<LuaValue>
         switch (type)
         {
             case LuaValueType.Number:
-                if (t == typeof(int))
-                {
-                    var v = (int)value;
-                    result = Unsafe.As<int, T>(ref v);
-                    return true;
-                }
-                else if (t == typeof(long))
-                {
-                    var v = (long)value;
-                    result = Unsafe.As<long, T>(ref v);
-                    return true;
-                }
-                else if (t == typeof(float))
+                if (t == typeof(float))
                 {
                     var v = (float)value;
                     result = Unsafe.As<float, T>(ref v);
@@ -58,6 +47,40 @@ public readonly struct LuaValue : IEquatable<LuaValue>
                     result = Unsafe.As<double, T>(ref v);
                     return true;
                 }
+                else if (t == typeof(string))
+                {
+                    var str = (string)referenceValue!;
+                    var span = str.AsSpan().Trim();
+
+                    var sign = 1;
+                    if (span.Length > 0 && span[0] == '-')
+                    {
+                        sign = -1;
+                        span = span[1..];
+                    }
+
+                    if (span.Length > 2 && span[0] is '0' && span[1] is 'x' or 'X')
+                    {
+                        // TODO: optimize
+                        try
+                        {
+                            var d = HexConverter.ToDouble(span) * sign;
+                            result = Unsafe.As<double, T>(ref d);
+                            return true;
+                        }
+                        catch (FormatException)
+                        {
+                            result = default!;
+                            return false;
+                        }
+                    }
+                    else
+                    {
+                        var tryResult = double.TryParse(str, out var d);
+                        result = tryResult ? Unsafe.As<double, T>(ref d) : default!;
+                        return tryResult;
+                    }
+                }
                 else if (t == typeof(object))
                 {
                     result = (T)(object)value;

+ 0 - 39
src/Lua/Runtime/LuaValueRuntimeExtensions.cs

@@ -1,49 +1,10 @@
 using System.Buffers;
 using System.Runtime.CompilerServices;
-using Lua.Internal;
 
 namespace Lua.Runtime;
 
 internal static class LuaRuntimeExtensions
 {
-    public static bool TryGetNumber(this LuaValue value, out double result)
-    {
-        if (value.TryRead(out result)) return true;
-
-        if (value.TryRead<string>(out var str))
-        {
-            var span = str.AsSpan().Trim();
-
-            var sign = 1;
-            if (span.Length > 0 && span[0] == '-')
-            {
-                sign = -1;
-                span = span[1..];
-            }
-
-            if (span.Length > 2 && span[0] is '0' && span[1] is 'x' or 'X')
-            {
-                // TODO: optimize
-                try
-                {
-                    result = HexConverter.ToDouble(span) * sign;
-                    return true;
-                }
-                catch (FormatException)
-                {
-                    return false;
-                }
-            }
-            else
-            {
-                return double.TryParse(str, out result);
-            }
-        }
-
-        result = default;
-        return false;
-    }
-
     public static bool TryGetMetamethod(this LuaValue value, LuaState state, string methodName, out LuaValue result)
     {
         result = default;

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

@@ -108,7 +108,7 @@ public static partial class LuaVirtualMachine
                         var table = stack.UnsafeGet(RB);
                         var vc = RK(stack, chunk, instruction.C, frame.Base);
                         var value = await GetTableValue(state, chunk, pc, table, vc, cancellationToken);
-                        
+
                         stack.UnsafeGet(RA + 1) = table;
                         stack.UnsafeGet(RA) = value;
                         stack.NotifyTop(RA + 2);
@@ -121,7 +121,7 @@ public static partial class LuaVirtualMachine
                         var vb = RK(stack, chunk, instruction.B, frame.Base);
                         var vc = RK(stack, chunk, instruction.C, frame.Base);
 
-                        if (vb.TryGetNumber(out var valueB) && vc.TryGetNumber(out var valueC))
+                        if (vb.TryRead<double>(out var valueB) && vc.TryRead<double>(out var valueC))
                         {
                             stack.UnsafeGet(RA) = valueB + valueC;
                         }
@@ -160,7 +160,7 @@ public static partial class LuaVirtualMachine
                         var vb = RK(stack, chunk, instruction.B, frame.Base);
                         var vc = RK(stack, chunk, instruction.C, frame.Base);
 
-                        if (vb.TryGetNumber(out var valueB) && vc.TryGetNumber(out var valueC))
+                        if (vb.TryRead<double>(out var valueB) && vc.TryRead<double>(out var valueC))
                         {
                             stack.UnsafeGet(RA) = valueB - valueC;
                         }
@@ -199,7 +199,7 @@ public static partial class LuaVirtualMachine
                         var vb = RK(stack, chunk, instruction.B, frame.Base);
                         var vc = RK(stack, chunk, instruction.C, frame.Base);
 
-                        if (vb.TryGetNumber(out var valueB) && vc.TryGetNumber(out var valueC))
+                        if (vb.TryRead<double>(out var valueB) && vc.TryRead<double>(out var valueC))
                         {
                             stack.UnsafeGet(RA) = valueB * valueC;
                         }
@@ -238,7 +238,7 @@ public static partial class LuaVirtualMachine
                         var vb = RK(stack, chunk, instruction.B, frame.Base);
                         var vc = RK(stack, chunk, instruction.C, frame.Base);
 
-                        if (vb.TryGetNumber(out var valueB) && vc.TryGetNumber(out var valueC))
+                        if (vb.TryRead<double>(out var valueB) && vc.TryRead<double>(out var valueC))
                         {
                             stack.UnsafeGet(RA) = valueB / valueC;
                         }
@@ -277,7 +277,7 @@ public static partial class LuaVirtualMachine
                         var vb = RK(stack, chunk, instruction.B, frame.Base);
                         var vc = RK(stack, chunk, instruction.C, frame.Base);
 
-                        if (vb.TryGetNumber(out var valueB) && vc.TryGetNumber(out var valueC))
+                        if (vb.TryRead<double>(out var valueB) && vc.TryRead<double>(out var valueC))
                         {
                             stack.UnsafeGet(RA) = valueB % valueC;
                         }
@@ -316,7 +316,7 @@ public static partial class LuaVirtualMachine
                         var vb = RK(stack, chunk, instruction.B, frame.Base);
                         var vc = RK(stack, chunk, instruction.C, frame.Base);
 
-                        if (vb.TryGetNumber(out var valueB) && vc.TryGetNumber(out var valueC))
+                        if (vb.TryRead<double>(out var valueB) && vc.TryRead<double>(out var valueC))
                         {
                             stack.UnsafeGet(RA) = Math.Pow(valueB, valueC);
                         }
@@ -354,7 +354,7 @@ public static partial class LuaVirtualMachine
 
                         var vb = stack.UnsafeGet(RB);
 
-                        if (vb.TryGetNumber(out var valueB))
+                        if (vb.TryRead<double>(out var valueB))
                         {
                             stack.UnsafeGet(RA) = -valueB;
                         }

+ 1 - 1
src/Lua/Standard/Basic/ToNumberFunction.cs

@@ -28,7 +28,7 @@ public sealed class ToNumberFunction : LuaFunction
         {
             if (arg1 == 10 || arg1 == 16)
             {
-                if (arg0.TryGetNumber(out var result))
+                if (arg0.TryRead<double>(out var result))
                 {
                     buffer.Span[0] = result;
                 }

+ 1 - 1
src/Lua/Standard/OperatingSystem/DateTimeHelper.cs

@@ -42,7 +42,7 @@ internal static class DateTimeHelper
                 }
             }
 
-            if (value.TryGetNumber(out var d) && MathEx.IsInteger(d))
+            if (value.TryRead<double>(out var d) && MathEx.IsInteger(d))
             {
                 return (int)d;
             }

+ 1 - 1
src/Lua/Standard/OperatingSystem/ExitFunction.cs

@@ -20,7 +20,7 @@ public sealed class ExitFunction : LuaFunction
             {
                 Environment.Exit(b ? 0 : 1);
             }
-            else if (code.TryGetNumber(out var d))
+            else if (code.TryRead<double>(out var d))
             {
                 if (!MathEx.IsInteger(d))
                 {