ObjectTraverseStack.cs 895 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. using Jint.Native;
  2. using Jint.Runtime;
  3. namespace Jint.Collections
  4. {
  5. /// <summary>
  6. /// Helps traversing objects and checks for cyclic references.
  7. /// </summary>
  8. internal sealed class ObjectTraverseStack
  9. {
  10. private readonly Engine _engine;
  11. private readonly Stack<object> _stack = new();
  12. public ObjectTraverseStack(Engine engine)
  13. {
  14. _engine = engine;
  15. }
  16. public void Enter(JsValue value)
  17. {
  18. if (value is null)
  19. {
  20. ExceptionHelper.ThrowArgumentNullException(nameof(value));
  21. }
  22. if (_stack.Contains(value))
  23. {
  24. ExceptionHelper.ThrowTypeError(_engine.Realm, "Cyclic reference detected.");
  25. }
  26. _stack.Push(value);
  27. }
  28. public void Exit()
  29. {
  30. _stack.Pop();
  31. }
  32. }
  33. }