Browse Source

Add: LuaFunctionExtensions/LuaThreadExtensions

AnnulusGames 1 year ago
parent
commit
114109fe5e
2 changed files with 76 additions and 0 deletions
  1. 30 0
      src/Lua/LuaFunctionExtensions.cs
  2. 46 0
      src/Lua/LuaThreadExtensions.cs

+ 30 - 0
src/Lua/LuaFunctionExtensions.cs

@@ -0,0 +1,30 @@
+using Lua.Internal;
+
+namespace Lua;
+
+public static class LuaFunctionExtensions
+{
+
+    public static async ValueTask<LuaValue[]> InvokeAsync(this LuaFunction function, LuaState state, LuaValue[] arguments, CancellationToken cancellationToken = default)
+    {
+        using var buffer = new PooledArray<LuaValue>(1024);
+
+        var thread = state.CurrentThread;
+        var frameBase = thread.Stack.Count;
+        
+        for (int i = 0; i < arguments.Length; i++)
+        {
+            thread.Stack.Push(arguments[i]);
+        }
+
+        var resultCount = await function.InvokeAsync(new()
+        {
+            State = state,
+            Thread = thread,
+            ArgumentCount = arguments.Length,
+            FrameBase = frameBase,
+        }, buffer.AsMemory(), cancellationToken);
+
+        return buffer.AsSpan()[0..resultCount].ToArray();
+    }
+}

+ 46 - 0
src/Lua/LuaThreadExtensions.cs

@@ -0,0 +1,46 @@
+using Lua.Internal;
+
+namespace Lua;
+
+public static class LuaThreadExtensions
+{
+    public static async ValueTask<LuaValue[]> ResumeAsync(this LuaThread thread, LuaState state, CancellationToken cancellationToken = default)
+    {
+        using var buffer = new PooledArray<LuaValue>(1024);
+
+        var frameBase = thread.Stack.Count;
+        thread.Stack.Push(thread);
+
+        var resultCount = await thread.ResumeAsync(new()
+        {
+            State = state,
+            Thread = state.CurrentThread,
+            ArgumentCount = 1,
+            FrameBase = frameBase,
+        }, buffer.AsMemory(), cancellationToken);
+
+        return buffer.AsSpan()[0..resultCount].ToArray();
+    }
+
+    public static async ValueTask<LuaValue[]> ResumeAsync(this LuaThread thread, LuaState state, LuaValue[] arguments, CancellationToken cancellationToken = default)
+    {
+        using var buffer = new PooledArray<LuaValue>(1024);
+
+        var frameBase = thread.Stack.Count;
+        thread.Stack.Push(thread);
+        for (int i = 0; i < arguments.Length; i++)
+        {
+            thread.Stack.Push(arguments[i]);
+        }
+
+        var resultCount = await thread.ResumeAsync(new()
+        {
+            State = state,
+            Thread = state.CurrentThread,
+            ArgumentCount = 1 + arguments.Length,
+            FrameBase = frameBase,
+        }, buffer.AsMemory(), cancellationToken);
+
+        return buffer.AsSpan()[0..resultCount].ToArray();
+    }
+}