JintArrayExpression.cs 2.1 KB

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