| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- using Lua.CodeAnalysis.Compilation;
- using Lua.Runtime;
- namespace Lua.Standard.Basic;
- public sealed class LoadFunction : LuaFunction
- {
- public override string Name => "load";
- public static readonly LoadFunction Instance = new();
- protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
- {
- // Lua-CSharp does not support binary chunks, the mode argument is ignored.
- var arg0 = context.GetArgument(0);
- var arg1 = context.HasArgument(1)
- ? context.GetArgument<string>(1)
- : null;
- var arg3 = context.HasArgument(3)
- ? context.GetArgument<LuaTable>(3)
- : null;
- // do not use LuaState.DoFileAsync as it uses the new LuaFunctionExecutionContext
- try
- {
- if (arg0.TryRead<string>(out var str))
- {
- var chunk = LuaCompiler.Default.Compile(str, arg1 ?? "chunk");
- buffer.Span[0] = new Closure(context.State, chunk, arg3);
- return new(1);
- }
- else if (arg0.TryRead<LuaFunction>(out var function))
- {
- // TODO:
- throw new NotImplementedException();
- }
- else
- {
- LuaRuntimeException.BadArgument(context.State.GetTraceback(), 1, Name);
- return default; // dummy
- }
- }
- catch (Exception ex)
- {
- buffer.Span[0] = LuaValue.Nil;
- buffer.Span[1] = ex.Message;
- return new(2);
- }
- }
- }
|