Skip to content

Commit d8a5ea6

Browse files
authored
Merge pull request #27 from AnnulusGames/function-thread-extensions
Add: LuaFunction/LuaThread extensions
2 parents 1d8cc67 + 114109f commit d8a5ea6

13 files changed

+92
-27
lines changed

src/Lua/LuaCoroutine.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public override void UnsafeSetStatus(LuaThreadStatus status)
4444
public bool IsProtectedMode { get; }
4545
public LuaFunction Function { get; }
4646

47-
public override async ValueTask<int> Resume(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
47+
public override async ValueTask<int> ResumeAsync(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
4848
{
4949
var baseThread = context.Thread;
5050
baseThread.UnsafeSetStatus(LuaThreadStatus.Normal);
@@ -122,7 +122,7 @@ public override async ValueTask<int> Resume(LuaFunctionExecutionContext context,
122122
{
123123
int frameBase;
124124
var variableArgumentCount = Function.GetVariableArgumentCount(context.ArgumentCount - 1);
125-
125+
126126
if (variableArgumentCount > 0)
127127
{
128128
var fixedArgumentCount = context.ArgumentCount - 1 - variableArgumentCount;
@@ -218,7 +218,7 @@ public override async ValueTask<int> Resume(LuaFunctionExecutionContext context,
218218
}
219219
}
220220

221-
public override async ValueTask<int> Yield(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
221+
public override async ValueTask<int> YieldAsync(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
222222
{
223223
if (Volatile.Read(ref status) != (byte)LuaThreadStatus.Running)
224224
{

src/Lua/LuaFunction.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,9 @@ public abstract partial class LuaFunction
88

99
public async ValueTask<int> InvokeAsync(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
1010
{
11-
var state = context.State;
12-
13-
if (context.FrameBase == null)
14-
{
15-
context = context with
16-
{
17-
FrameBase = context.Thread.Stack.Count - context.ArgumentCount
18-
};
19-
}
20-
2111
var frame = new CallStackFrame
2212
{
23-
Base = context.FrameBase.Value,
13+
Base = context.FrameBase,
2414
CallPosition = context.SourcePosition,
2515
ChunkName = context.ChunkName ?? LuaState.DefaultChunkName,
2616
RootChunkName = context.RootChunkName ?? LuaState.DefaultChunkName,

src/Lua/LuaFunctionExecutionContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public readonly record struct LuaFunctionExecutionContext
88
public required LuaState State { get; init; }
99
public required LuaThread Thread { get; init; }
1010
public required int ArgumentCount { get; init; }
11-
public int? FrameBase { get; init; }
11+
public int FrameBase { get; init; }
1212
public SourcePosition? SourcePosition { get; init; }
1313
public string? RootChunkName { get; init; }
1414
public string? ChunkName { get; init; }
@@ -17,7 +17,7 @@ public ReadOnlySpan<LuaValue> Arguments
1717
{
1818
get
1919
{
20-
return Thread.GetStackValues().Slice(FrameBase!.Value, ArgumentCount);
20+
return Thread.GetStackValues().Slice(FrameBase, ArgumentCount);
2121
}
2222
}
2323

src/Lua/LuaFunctionExtensions.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using Lua.Internal;
2+
3+
namespace Lua;
4+
5+
public static class LuaFunctionExtensions
6+
{
7+
8+
public static async ValueTask<LuaValue[]> InvokeAsync(this LuaFunction function, LuaState state, LuaValue[] arguments, CancellationToken cancellationToken = default)
9+
{
10+
using var buffer = new PooledArray<LuaValue>(1024);
11+
12+
var thread = state.CurrentThread;
13+
var frameBase = thread.Stack.Count;
14+
15+
for (int i = 0; i < arguments.Length; i++)
16+
{
17+
thread.Stack.Push(arguments[i]);
18+
}
19+
20+
var resultCount = await function.InvokeAsync(new()
21+
{
22+
State = state,
23+
Thread = thread,
24+
ArgumentCount = arguments.Length,
25+
FrameBase = frameBase,
26+
}, buffer.AsMemory(), cancellationToken);
27+
28+
return buffer.AsSpan()[0..resultCount].ToArray();
29+
}
30+
}

src/Lua/LuaMainThread.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ public override void UnsafeSetStatus(LuaThreadStatus status)
1212
// Do nothing
1313
}
1414

15-
public override ValueTask<int> Resume(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
15+
public override ValueTask<int> ResumeAsync(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
1616
{
1717
buffer.Span[0] = false;
1818
buffer.Span[1] = "cannot resume non-suspended coroutine";
1919
return new(2);
2020
}
2121

22-
public override ValueTask<int> Yield(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
22+
public override ValueTask<int> YieldAsync(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default)
2323
{
2424
throw new LuaRuntimeException(context.State.GetTraceback(), "attempt to yield from outside a coroutine");
2525
}

src/Lua/LuaThread.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System.Diagnostics;
21
using Lua.Internal;
32
using Lua.Runtime;
43

@@ -8,8 +7,8 @@ public abstract class LuaThread
87
{
98
public abstract LuaThreadStatus GetStatus();
109
public abstract void UnsafeSetStatus(LuaThreadStatus status);
11-
public abstract ValueTask<int> Resume(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default);
12-
public abstract ValueTask<int> Yield(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default);
10+
public abstract ValueTask<int> ResumeAsync(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default);
11+
public abstract ValueTask<int> YieldAsync(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken = default);
1312

1413
LuaStack stack = new();
1514
FastStackCore<CallStackFrame> callStack;

src/Lua/LuaThreadExtensions.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using Lua.Internal;
2+
3+
namespace Lua;
4+
5+
public static class LuaThreadExtensions
6+
{
7+
public static async ValueTask<LuaValue[]> ResumeAsync(this LuaThread thread, LuaState state, CancellationToken cancellationToken = default)
8+
{
9+
using var buffer = new PooledArray<LuaValue>(1024);
10+
11+
var frameBase = thread.Stack.Count;
12+
thread.Stack.Push(thread);
13+
14+
var resultCount = await thread.ResumeAsync(new()
15+
{
16+
State = state,
17+
Thread = state.CurrentThread,
18+
ArgumentCount = 1,
19+
FrameBase = frameBase,
20+
}, buffer.AsMemory(), cancellationToken);
21+
22+
return buffer.AsSpan()[0..resultCount].ToArray();
23+
}
24+
25+
public static async ValueTask<LuaValue[]> ResumeAsync(this LuaThread thread, LuaState state, LuaValue[] arguments, CancellationToken cancellationToken = default)
26+
{
27+
using var buffer = new PooledArray<LuaValue>(1024);
28+
29+
var frameBase = thread.Stack.Count;
30+
thread.Stack.Push(thread);
31+
for (int i = 0; i < arguments.Length; i++)
32+
{
33+
thread.Stack.Push(arguments[i]);
34+
}
35+
36+
var resultCount = await thread.ResumeAsync(new()
37+
{
38+
State = state,
39+
Thread = state.CurrentThread,
40+
ArgumentCount = 1 + arguments.Length,
41+
FrameBase = frameBase,
42+
}, buffer.AsMemory(), cancellationToken);
43+
44+
return buffer.AsSpan()[0..resultCount].ToArray();
45+
}
46+
}

src/Lua/Standard/Basic/XPCallFunction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ await arg1.InvokeAsync(context with
4040
{
4141
State = context.State,
4242
ArgumentCount = 1,
43-
FrameBase = null,
43+
FrameBase = context.Thread.Stack.Count - context.ArgumentCount,
4444
}, methodBuffer.AsMemory(), cancellationToken);
4545

4646
buffer.Span[0] = false;

src/Lua/Standard/Coroutines/CoroutineResumeFunction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ public sealed class CoroutineResumeFunction : LuaFunction
99
protected override async ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
1010
{
1111
var thread = context.GetArgument<LuaThread>(0);
12-
return await thread.Resume(context, buffer, cancellationToken);
12+
return await thread.ResumeAsync(context, buffer, cancellationToken);
1313
}
1414
}

src/Lua/Standard/Coroutines/CoroutineWrapFunction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ protected override async ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionCont
2727
stack.Push(targetThread);
2828
PushArguments(stack, context.Arguments);
2929

30-
var resultCount = await targetThread.Resume(context with
30+
var resultCount = await targetThread.ResumeAsync(context with
3131
{
3232
ArgumentCount = context.ArgumentCount + 1,
3333
FrameBase = frameBase,

src/Lua/Standard/Coroutines/CoroutineYieldFunction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ public sealed class CoroutineYieldFunction : LuaFunction
88

99
protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
1010
{
11-
return context.Thread.Yield(context, buffer, cancellationToken);
11+
return context.Thread.YieldAsync(context, buffer, cancellationToken);
1212
}
1313
}

src/Lua/Standard/Table/SortFunction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ static async ValueTask<int> PartitionAsync(LuaFunctionExecutionContext context,
6363
await comparer.InvokeAsync(context with
6464
{
6565
ArgumentCount = 2,
66-
FrameBase = null,
66+
FrameBase = context.Thread.Stack.Count - context.ArgumentCount,
6767
}, methodBuffer.AsMemory(), cancellationToken);
6868

6969
if (methodBuffer[0].ToBoolean())

src/Lua/Standard/Text/GSubFunction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ protected override async ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionCont
6565
await func.InvokeAsync(context with
6666
{
6767
ArgumentCount = match.Groups.Count,
68-
FrameBase = null
68+
FrameBase = context.Thread.Stack.Count - context.ArgumentCount,
6969
}, methodBuffer.AsMemory(), cancellationToken);
7070

7171
result = methodBuffer[0];

0 commit comments

Comments
 (0)