ObjectTraverseStack.cs 781 B

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