2
0

JintSpreadExpression.cs 1.5 KB

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