JintSpreadExpression.cs 1.4 KB

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