JintArrayExpression.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using Jint.Native;
  2. namespace Jint.Runtime.Interpreter.Expressions;
  3. internal sealed class JintArrayExpression : JintExpression
  4. {
  5. private readonly ExpressionCache _arguments = new();
  6. private bool _initialized;
  7. private JintArrayExpression(ArrayExpression expression) : base(expression)
  8. {
  9. }
  10. public static JintExpression Build(ArrayExpression expression)
  11. {
  12. return expression.Elements.Count == 0
  13. ? JintEmptyArrayExpression.Instance
  14. : new JintArrayExpression(expression);
  15. }
  16. private void Initialize(EvaluationContext context)
  17. {
  18. _arguments.Initialize(context, ((ArrayExpression) _expression).Elements.AsSpan()!);
  19. // we get called from nested spread expansion in call
  20. _initialized = true;
  21. }
  22. protected override object EvaluateInternal(EvaluationContext context)
  23. {
  24. if (!_initialized)
  25. {
  26. Initialize(context);
  27. _initialized = true;
  28. }
  29. var expressions = ((ArrayExpression) _expression).Elements.AsSpan();
  30. var engine = context.Engine;
  31. if (!_arguments.HasSpreads)
  32. {
  33. var values = new JsValue[expressions.Length];
  34. _arguments.BuildArguments(context, values);
  35. return new JsArray(engine, values);
  36. }
  37. var array = new List<JsValue>();
  38. _arguments.BuildArgumentsWithSpreads(context, array);
  39. return new JsArray(engine, array.ToArray());
  40. }
  41. internal sealed class JintEmptyArrayExpression : JintExpression
  42. {
  43. public static JintEmptyArrayExpression Instance =
  44. new(new ArrayExpression(NodeList.From(Array.Empty<Expression?>())));
  45. private JintEmptyArrayExpression(Expression expression) : base(expression)
  46. {
  47. }
  48. protected override object EvaluateInternal(EvaluationContext context)
  49. {
  50. return new JsArray(context.Engine, []);
  51. }
  52. public override JsValue GetValue(EvaluationContext context)
  53. {
  54. return new JsArray(context.Engine, []);
  55. }
  56. }
  57. }