LuaFunction.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233
  1. using Lua.Runtime;
  2. namespace Lua;
  3. public abstract partial class LuaFunction
  4. {
  5. public virtual string Name => GetType().Name;
  6. public async ValueTask<int> InvokeAsync(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
  7. {
  8. var frame = new CallStackFrame
  9. {
  10. Base = context.FrameBase,
  11. CallPosition = context.SourcePosition,
  12. ChunkName = context.ChunkName ?? LuaState.DefaultChunkName,
  13. RootChunkName = context.RootChunkName ?? LuaState.DefaultChunkName,
  14. VariableArgumentCount = this is Closure closure ? Math.Max(context.ArgumentCount - closure.Proto.ParameterCount, 0) : 0,
  15. Function = this,
  16. };
  17. context.Thread.PushCallStackFrame(frame);
  18. try
  19. {
  20. return await InvokeAsyncCore(context, buffer, cancellationToken);
  21. }
  22. finally
  23. {
  24. context.Thread.PopCallStackFrame();
  25. }
  26. }
  27. protected abstract ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken);
  28. }