JintSpreadExpression.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. using Jint.Native;
  2. using Jint.Native.Iterator;
  3. namespace Jint.Runtime.Interpreter.Expressions;
  4. internal sealed class JintSpreadExpression : JintExpression
  5. {
  6. internal readonly JintExpression _argument;
  7. private readonly string? _argumentName;
  8. public JintSpreadExpression(SpreadElement expression) : base(expression)
  9. {
  10. _argument = Build(expression.Argument);
  11. _argumentName = (expression.Argument as Identifier)?.Name;
  12. }
  13. protected override object EvaluateInternal(EvaluationContext context)
  14. {
  15. GetValueAndCheckIterator(context, out var objectInstance, out var iterator);
  16. return objectInstance;
  17. }
  18. public override JsValue GetValue(EvaluationContext context)
  19. {
  20. // need to notify correct node when taking shortcut
  21. context.LastSyntaxElement = _expression;
  22. GetValueAndCheckIterator(context, out var objectInstance, out var iterator);
  23. return objectInstance;
  24. }
  25. internal void GetValueAndCheckIterator(EvaluationContext context, out JsValue instance, out IteratorInstance? iterator)
  26. {
  27. instance = _argument.GetValue(context);
  28. if (instance is null || !instance.TryGetIterator(context.Engine.Realm, out iterator))
  29. {
  30. iterator = null;
  31. ExceptionHelper.ThrowTypeError(context.Engine.Realm, _argumentName + " is not iterable");
  32. }
  33. }
  34. }