SelectFunction.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. namespace Lua.Standard.Basic;
  2. public sealed class SelectFunction : LuaFunction
  3. {
  4. public override string Name => "select";
  5. public static readonly SelectFunction Instance = new();
  6. protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
  7. {
  8. var arg0 = context.ReadArgument(0);
  9. if (arg0.TryRead<double>(out var d))
  10. {
  11. if (!MathEx.IsInteger(d))
  12. {
  13. throw new LuaRuntimeException(context.State.GetTraceback(), "bad argument #1 to 'select' (number has no integer representation)");
  14. }
  15. var index = (int)d;
  16. var span = context.Arguments[index..];
  17. span.CopyTo(buffer.Span);
  18. return new(span.Length);
  19. }
  20. else if (arg0.TryRead<string>(out var str) && str == "#")
  21. {
  22. buffer.Span[0] = context.ArgumentCount - 1;
  23. return new(1);
  24. }
  25. else
  26. {
  27. LuaRuntimeException.BadArgument(context.State.GetTraceback(), 1, Name, "number", arg0.Type.ToString());
  28. return default;
  29. }
  30. }
  31. }