Browse Source

Add: pcall

AnnulusGames 1 year ago
parent
commit
0dcf6a40ac
1 changed files with 37 additions and 0 deletions
  1. 37 0
      src/Lua/Standard/Basic/PCallFunction.cs

+ 37 - 0
src/Lua/Standard/Basic/PCallFunction.cs

@@ -0,0 +1,37 @@
+using Lua.Internal;
+
+namespace Lua.Standard.Basic;
+
+public sealed class PCallFunction : LuaFunction
+{
+    public override string Name => "pcall";
+    public static readonly PCallFunction Instance = new();
+
+    protected override async ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
+    {
+        var arg0 = context.ReadArgument<LuaFunction>(0);
+
+        try
+        {
+            using var methodBuffer = new PooledArray<LuaValue>(1024);
+
+            var resultCount = await arg0.InvokeAsync(context with
+            {
+                State = context.State,
+                ArgumentCount = context.ArgumentCount - 1,
+                StackPosition = context.StackPosition + 1,
+            }, methodBuffer.AsMemory(), cancellationToken);
+
+            buffer.Span[0] = true;
+            methodBuffer.AsSpan()[..resultCount].CopyTo(buffer.Span[1..]);
+
+            return resultCount + 1;
+        }
+        catch (Exception ex)
+        {
+            buffer.Span[0] = false;
+            buffer.Span[1] = ex.Message;
+            return 2;
+        }
+    }
+}