JintCallStack.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. namespace Jint.Runtime.CallStack
  2. {
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. public class JintCallStack
  6. {
  7. private Stack<CallStackElement> _stack = new Stack<CallStackElement>();
  8. private Dictionary<CallStackElement, int> _statistics =
  9. new Dictionary<CallStackElement, int>(new CallStackElementComparer());
  10. public int Push(CallStackElement item)
  11. {
  12. _stack.Push(item);
  13. if (_statistics.ContainsKey(item))
  14. {
  15. return ++_statistics[item];
  16. }
  17. else
  18. {
  19. _statistics.Add(item, 0);
  20. return 0;
  21. }
  22. }
  23. public CallStackElement Pop()
  24. {
  25. var item = _stack.Pop();
  26. if (_statistics[item] == 0)
  27. {
  28. _statistics.Remove(item);
  29. }
  30. else
  31. {
  32. _statistics[item]--;
  33. }
  34. return item;
  35. }
  36. public void Clear()
  37. {
  38. _stack.Clear();
  39. _statistics.Clear();
  40. }
  41. public override string ToString()
  42. {
  43. return string.Join("->", _stack.Select(cse => cse.ToString()).Reverse());
  44. }
  45. }
  46. }