ExecutionContextStack.cs 2.1 KB

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