ExecutionContextStack.cs 2.4 KB

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