CallStackElement.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Esprima;
  2. using Esprima.Ast;
  3. using Jint.Native.Function;
  4. using Jint.Runtime.Interpreter.Expressions;
  5. namespace Jint.Runtime.CallStack
  6. {
  7. internal readonly struct CallStackElement : IEquatable<CallStackElement>
  8. {
  9. public CallStackElement(
  10. FunctionInstance function,
  11. JintExpression? expression,
  12. in CallStackExecutionContext callingExecutionContext)
  13. {
  14. Function = function;
  15. Expression = expression;
  16. CallingExecutionContext = callingExecutionContext;
  17. }
  18. public readonly FunctionInstance Function;
  19. public readonly JintExpression? Expression;
  20. public readonly CallStackExecutionContext CallingExecutionContext;
  21. public Location Location
  22. {
  23. get
  24. {
  25. var expressionLocation = Expression?._expression.Location;
  26. if (expressionLocation != null && expressionLocation.Value != default)
  27. {
  28. return expressionLocation.Value;
  29. }
  30. return ((Node?) Function._functionDefinition?.Function)?.Location ?? default;
  31. }
  32. }
  33. public NodeList<Node>? Arguments => Function._functionDefinition?.Function.Params;
  34. public override string ToString()
  35. {
  36. var name = TypeConverter.ToString(Function.Get(CommonProperties.Name));
  37. if (string.IsNullOrWhiteSpace(name))
  38. {
  39. if (Expression is not null)
  40. {
  41. name = JintExpression.ToString(Expression._expression);
  42. }
  43. }
  44. return name ?? "(anonymous)";
  45. }
  46. public bool Equals(CallStackElement other)
  47. {
  48. return Function.Equals(other.Function) && Equals(Expression, other.Expression);
  49. }
  50. public override bool Equals(object? obj)
  51. {
  52. return obj is CallStackElement other && Equals(other);
  53. }
  54. public override int GetHashCode()
  55. {
  56. unchecked
  57. {
  58. return (Function.GetHashCode() * 397) ^ (Expression != null ? Expression.GetHashCode() : 0);
  59. }
  60. }
  61. }
  62. }