Browse Source

add: DoBytesAsync for utf8 DoString

Akeit0 6 months ago
parent
commit
3d580f75d6
2 changed files with 45 additions and 9 deletions
  1. 10 0
      src/Lua/LuaStateExtensions.cs
  2. 35 9
      src/Lua/Runtime/LuaThreadAccessExtensions.cs

+ 10 - 0
src/Lua/LuaStateExtensions.cs

@@ -14,6 +14,16 @@ public static class LuaStateExtensions
         return state.TopLevelAccess.DoStringAsync(source, chunkName, cancellationToken);
     }
 
+    public static ValueTask<int> DoBytesAsync(this LuaState state, ReadOnlySpan<byte> source, Memory<LuaValue> buffer, string chunkName, CancellationToken cancellationToken = default)
+    {
+        return state.TopLevelAccess.DoBytesAsync(source, buffer, chunkName, cancellationToken);
+    }
+
+    public static ValueTask<LuaValue[]> DoBytesAsync(this LuaState state, ReadOnlySpan<byte> source, string chunkName, CancellationToken cancellationToken = default)
+    {
+        return state.TopLevelAccess.DoBytesAsync(source, chunkName, cancellationToken);
+    }
+
     public static ValueTask<int> DoFileAsync(this LuaState state, string path, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
     {
         return state.TopLevelAccess.DoFileAsync(path, buffer, cancellationToken);

+ 35 - 9
src/Lua/Runtime/LuaThreadAccessExtensions.cs

@@ -6,23 +6,32 @@ namespace Lua.Runtime;
 
 public static class LuaThreadAccessAccessExtensions
 {
-    public static async ValueTask<int> DoStringAsync(this LuaThreadAccess access, string source, Memory<LuaValue> buffer, string? chunkName = null, CancellationToken cancellationToken = default)
+    public static ValueTask<int> DoStringAsync(this LuaThreadAccess access, string source, Memory<LuaValue> results, string? chunkName = null, CancellationToken cancellationToken = default)
     {
         access.ThrowIfInvalid();
         var closure = access.State.Load(source, chunkName ?? source);
-        var count = await access.RunAsync(closure, 0, cancellationToken);
-        using var results = access.ReadReturnValues(count);
-        results.AsSpan()[..Math.Min(buffer.Length, count)].CopyTo(buffer.Span);
-        return count;
+        return DoClosureAsync(access, closure, results, cancellationToken);
     }
 
-    public static async ValueTask<LuaValue[]> DoStringAsync(this LuaThreadAccess access, string source, string? chunkName = null, CancellationToken cancellationToken = default)
+    public static ValueTask<LuaValue[]> DoStringAsync(this LuaThreadAccess access, string source, string? chunkName = null, CancellationToken cancellationToken = default)
     {
         access.ThrowIfInvalid();
         var closure = access.State.Load(source, chunkName ?? source);
-        var count = await access.RunAsync(closure, 0, cancellationToken);
-        using var results = access.ReadReturnValues(count);
-        return results.AsSpan().ToArray();
+        return DoClosureAsync(access, closure, cancellationToken);
+    }
+
+    public static ValueTask<int> DoBytesAsync(this LuaThreadAccess access, ReadOnlySpan<byte> source, Memory<LuaValue> results, string chunkName, CancellationToken cancellationToken = default)
+    {
+        access.ThrowIfInvalid();
+        var closure = access.State.Load(source, chunkName);
+        return DoClosureAsync(access, closure, results, cancellationToken);
+    }
+
+    public static ValueTask<LuaValue[]> DoBytesAsync(this LuaThreadAccess access, ReadOnlySpan<byte> source, string chunkName, CancellationToken cancellationToken = default)
+    {
+        access.ThrowIfInvalid();
+        var closure = access.State.Load(source, chunkName);
+        return DoClosureAsync(access, closure, cancellationToken);
     }
 
     public static async ValueTask<int> DoFileAsync(this LuaThreadAccess access, string path, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
@@ -43,6 +52,23 @@ public static class LuaThreadAccessAccessExtensions
         return results.AsSpan().ToArray();
     }
 
+    private static async ValueTask<int> DoClosureAsync(LuaThreadAccess access, LuaClosure closure, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
+    {
+        access.ThrowIfInvalid();
+        var count = await access.RunAsync(closure, 0, cancellationToken);
+        using var results = access.ReadReturnValues(count);
+        results.AsSpan()[..Math.Min(buffer.Length, results.Length)].CopyTo(buffer.Span);
+        return results.Count;
+    }
+
+    public static async ValueTask<LuaValue[]> DoClosureAsync(this LuaThreadAccess access, LuaClosure closure, CancellationToken cancellationToken = default)
+    {
+        access.ThrowIfInvalid();
+        var count = await access.RunAsync(closure, 0, cancellationToken);
+        using var results = access.ReadReturnValues(count);
+        return results.AsSpan().ToArray();
+    }
+
     public static void Push(this LuaThreadAccess access, LuaValue value)
     {
         access.ThrowIfInvalid();