CallStackElement.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #nullable enable
  2. using Esprima;
  3. using Esprima.Ast;
  4. using Jint.Native.Function;
  5. using Jint.Runtime.Environments;
  6. using Jint.Runtime.Interpreter.Expressions;
  7. namespace Jint.Runtime.CallStack
  8. {
  9. internal readonly struct CallStackElement
  10. {
  11. public CallStackElement(
  12. FunctionInstance function,
  13. JintExpression? expression,
  14. ExecutionContext callingExecutionContext)
  15. {
  16. Function = function;
  17. Expression = expression;
  18. CallingExecutionContext = callingExecutionContext;
  19. }
  20. public readonly FunctionInstance Function;
  21. public readonly JintExpression? Expression;
  22. public readonly ExecutionContext CallingExecutionContext;
  23. public Location Location
  24. {
  25. get
  26. {
  27. var expressionLocation = Expression?._expression.Location;
  28. if (expressionLocation != null && expressionLocation.Value != default)
  29. {
  30. return expressionLocation.Value;
  31. }
  32. return ((Node?) Function._functionDefinition?.Function)?.Location ?? default;
  33. }
  34. }
  35. public NodeList<Expression>? Arguments =>
  36. Function._functionDefinition?.Function.Params;
  37. public override string ToString()
  38. {
  39. var name = TypeConverter.ToString(Function.Get(CommonProperties.Name));
  40. if (string.IsNullOrWhiteSpace(name))
  41. {
  42. if (Expression is not null)
  43. {
  44. name = JintExpression.ToString(Expression._expression);
  45. }
  46. }
  47. return name ?? "(anonymous)";
  48. }
  49. }
  50. }