LuaFunctionExecutionContext.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System.Runtime.CompilerServices;
  2. using Lua.CodeAnalysis;
  3. namespace Lua;
  4. public readonly record struct LuaFunctionExecutionContext
  5. {
  6. public required LuaState State { get; init; }
  7. public required int ArgumentCount { get; init; }
  8. public int? StackPosition { get; init; }
  9. public SourcePosition? SourcePosition { get; init; }
  10. public string? RootChunkName { get; init; }
  11. public string? ChunkName { get; init; }
  12. public int FrameBase => State.GetCurrentFrame().Base;
  13. public ReadOnlySpan<LuaValue> Arguments => State.GetStackValues().Slice(FrameBase, ArgumentCount);
  14. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  15. public LuaValue ReadArgument(int index)
  16. {
  17. ThrowIfArgumentNotExists(index);
  18. return Arguments[index];
  19. }
  20. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  21. public T ReadArgument<T>(int index)
  22. {
  23. ThrowIfArgumentNotExists(index);
  24. var arg = Arguments[index];
  25. if (!arg.TryRead<T>(out var argValue))
  26. {
  27. if (LuaValue.TryGetLuaValueType(typeof(T), out var type))
  28. {
  29. LuaRuntimeException.BadArgument(State.GetTracebacks(), 1, State.GetCurrentFrame().Function.Name, type.ToString(), arg.Type.ToString());
  30. }
  31. else
  32. {
  33. LuaRuntimeException.BadArgument(State.GetTracebacks(), 1, State.GetCurrentFrame().Function.Name, typeof(T).Name, arg.Type.ToString());
  34. }
  35. }
  36. return argValue;
  37. }
  38. void ThrowIfArgumentNotExists(int index)
  39. {
  40. if (ArgumentCount <= index)
  41. {
  42. LuaRuntimeException.BadArgument(State.GetTracebacks(), index + 1, State.GetCurrentFrame().Function.Name);
  43. }
  44. }
  45. }