ExecutionContextStack.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.Runtime.CompilerServices;
  2. using Jint.Collections;
  3. using Jint.Native.Generator;
  4. using Jint.Runtime.Environments;
  5. using Environment = Jint.Runtime.Environments.Environment;
  6. namespace Jint.Runtime
  7. {
  8. internal sealed class ExecutionContextStack
  9. {
  10. private readonly RefStack<ExecutionContext> _stack;
  11. public ExecutionContextStack(int capacity)
  12. {
  13. _stack = new RefStack<ExecutionContext>(capacity);
  14. }
  15. public void ReplaceTopLexicalEnvironment(Environment newEnv)
  16. {
  17. var array = _stack._array;
  18. var size = _stack._size;
  19. array[size - 1] = array[size - 1].UpdateLexicalEnvironment(newEnv);
  20. }
  21. public void ReplaceTopVariableEnvironment(Environment newEnv)
  22. {
  23. var array = _stack._array;
  24. var size = _stack._size;
  25. array[size - 1] = array[size - 1].UpdateVariableEnvironment(newEnv);
  26. }
  27. public void ReplaceTopPrivateEnvironment(PrivateEnvironment? newEnv)
  28. {
  29. var array = _stack._array;
  30. var size = _stack._size;
  31. array[size - 1] = array[size - 1].UpdatePrivateEnvironment(newEnv);
  32. }
  33. public ref readonly ExecutionContext ReplaceTopGenerator(GeneratorInstance newEnv)
  34. {
  35. var array = _stack._array;
  36. var size = _stack._size;
  37. array[size - 1] = array[size - 1].UpdateGenerator(newEnv);
  38. return ref array[size - 1];
  39. }
  40. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  41. public ref readonly ExecutionContext Peek() => ref _stack.Peek();
  42. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  43. public ref readonly ExecutionContext Peek(int fromTop) => ref _stack.Peek(fromTop);
  44. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  45. public void Push(in ExecutionContext context) => _stack.Push(in context);
  46. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  47. public ref readonly ExecutionContext Pop() => ref _stack.Pop();
  48. public IScriptOrModule? GetActiveScriptOrModule()
  49. {
  50. var array = _stack._array;
  51. var size = _stack._size;
  52. for (var i = size - 1; i > -1; --i)
  53. {
  54. var context = array[i];
  55. if (context.ScriptOrModule is not null)
  56. {
  57. return context.ScriptOrModule;
  58. }
  59. }
  60. return null;
  61. }
  62. }
  63. }