Kaynağa Gözat

Add: os.clock

AnnulusGames 1 yıl önce
ebeveyn
işleme
4f4c64719f

+ 16 - 0
src/Lua/Standard/OpenLibExtensions.cs

@@ -3,6 +3,7 @@ using Lua.Standard.Coroutines;
 using Lua.Standard.IO;
 using Lua.Standard.IO;
 using Lua.Standard.Mathematics;
 using Lua.Standard.Mathematics;
 using Lua.Standard.Modules;
 using Lua.Standard.Modules;
+using Lua.Standard.OperatingSystem;
 using Lua.Standard.Table;
 using Lua.Standard.Table;
 
 
 namespace Lua.Standard;
 namespace Lua.Standard;
@@ -84,6 +85,10 @@ public static class OpenLibExtensions
         IO.TypeFunction.Instance,
         IO.TypeFunction.Instance,
     ];
     ];
 
 
+    static readonly LuaFunction[] osFunctions = [
+        ClockFunction.Instance,
+    ];
+
     public static void OpenBasicLibrary(this LuaState state)
     public static void OpenBasicLibrary(this LuaState state)
     {
     {
         // basic
         // basic
@@ -156,4 +161,15 @@ public static class OpenLibExtensions
 
 
         state.Environment["io"] = io;
         state.Environment["io"] = io;
     }
     }
+
+    public static void OpenOperatingSystemLibrary(this LuaState state)
+    {
+        var os = new LuaTable(0, osFunctions.Length);
+        foreach (var func in osFunctions)
+        {
+            os[func.Name] = func;
+        }
+
+        state.Environment["os"] = os;
+    }
 }
 }

+ 16 - 0
src/Lua/Standard/OperatingSystem/ClockFunction.cs

@@ -0,0 +1,16 @@
+
+using System.Diagnostics;
+
+namespace Lua.Standard.OperatingSystem;
+
+public sealed class ClockFunction : LuaFunction
+{
+    public override string Name => "clock";
+    public static readonly ClockFunction Instance = new();
+
+    protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
+    {
+        buffer.Span[0] = DateTimeHelper.GetUnixTime(DateTime.UtcNow, Process.GetCurrentProcess().StartTime);
+        return new(1);
+    }
+}

+ 21 - 0
src/Lua/Standard/OperatingSystem/DateTimeHelper.cs

@@ -0,0 +1,21 @@
+using System.Runtime.CompilerServices;
+
+namespace Lua.Standard.OperatingSystem;
+
+internal static class DateTimeHelper
+{
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    public static double GetUnixTime(DateTime dateTime, DateTime epoch)
+    {
+        var time = (dateTime - epoch).TotalSeconds;
+        if (time < 0.0) return 0;
+        return time;
+    }
+
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    public static DateTime FromUnixTime(double unixTime)
+    {
+        var ts = TimeSpan.FromSeconds(unixTime);
+        return DateTime.UnixEpoch + ts;
+    }
+}