LuaGlobalState.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System.Diagnostics.CodeAnalysis;
  2. using System.Runtime.CompilerServices;
  3. using Lua.Internal;
  4. using Lua.Platforms;
  5. using Lua.Runtime;
  6. using Lua.Standard;
  7. namespace Lua;
  8. sealed class LuaGlobalState
  9. {
  10. // states
  11. readonly LuaState mainState;
  12. FastStackCore<LuaState> stateStack;
  13. readonly LuaTable environment;
  14. readonly LuaTable registry = new();
  15. readonly UpValue envUpValue;
  16. FastStackCore<LuaDebug.LuaDebugBuffer> debugBufferPool;
  17. public LuaPlatform Platform { get; set; }
  18. public ILuaModuleLoader? ModuleLoader { get; set; }
  19. internal UpValue EnvUpValue => envUpValue;
  20. internal ref FastStackCore<LuaState> ThreadStack => ref stateStack;
  21. internal ref FastStackCore<LuaDebug.LuaDebugBuffer> DebugBufferPool => ref debugBufferPool;
  22. public LuaTable Environment => environment;
  23. public LuaTable Registry => registry;
  24. public LuaTable LoadedModules => registry[ModuleLibrary.LoadedKeyForRegistry].Read<LuaTable>();
  25. public LuaTable PreloadModules => registry[ModuleLibrary.PreloadKeyForRegistry].Read<LuaTable>();
  26. public LuaState MainThread => mainState;
  27. // metatables
  28. LuaTable? nilMetatable;
  29. LuaTable? numberMetatable;
  30. LuaTable? stringMetatable;
  31. LuaTable? booleanMetatable;
  32. LuaTable? functionMetatable;
  33. LuaTable? stateMetatable;
  34. public static LuaGlobalState Create(LuaPlatform? platform = null)
  35. {
  36. LuaGlobalState globalState = new(platform ?? LuaPlatform.Default);
  37. return globalState;
  38. }
  39. LuaGlobalState(LuaPlatform platform)
  40. {
  41. mainState = new(this);
  42. environment = new();
  43. envUpValue = UpValue.Closed(environment);
  44. registry[ModuleLibrary.LoadedKeyForRegistry] = new LuaTable(0, 8);
  45. registry[ModuleLibrary.PreloadKeyForRegistry] = new LuaTable(0, 8);
  46. Platform = platform;
  47. }
  48. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  49. internal bool TryGetMetatable(LuaValue value, [NotNullWhen(true)] out LuaTable? result)
  50. {
  51. result = value.Type switch
  52. {
  53. LuaValueType.Nil => nilMetatable,
  54. LuaValueType.Boolean => booleanMetatable,
  55. LuaValueType.String => stringMetatable,
  56. LuaValueType.Number => numberMetatable,
  57. LuaValueType.Function => functionMetatable,
  58. LuaValueType.Thread => stateMetatable,
  59. LuaValueType.UserData => value.UnsafeRead<ILuaUserData>().Metatable,
  60. LuaValueType.Table => value.UnsafeRead<LuaTable>().Metatable,
  61. _ => null
  62. };
  63. return result != null;
  64. }
  65. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  66. internal void SetMetatable(LuaValue value, LuaTable metatable)
  67. {
  68. switch (value.Type)
  69. {
  70. case LuaValueType.Nil:
  71. nilMetatable = metatable;
  72. break;
  73. case LuaValueType.Boolean:
  74. booleanMetatable = metatable;
  75. break;
  76. case LuaValueType.String:
  77. stringMetatable = metatable;
  78. break;
  79. case LuaValueType.Number:
  80. numberMetatable = metatable;
  81. break;
  82. case LuaValueType.Function:
  83. functionMetatable = metatable;
  84. break;
  85. case LuaValueType.Thread:
  86. stateMetatable = metatable;
  87. break;
  88. case LuaValueType.UserData:
  89. value.UnsafeRead<ILuaUserData>().Metatable = metatable;
  90. break;
  91. case LuaValueType.Table:
  92. value.UnsafeRead<LuaTable>().Metatable = metatable;
  93. break;
  94. }
  95. }
  96. }