JintAwaitExpression.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using Esprima.Ast;
  2. using Jint.Native.Promise;
  3. namespace Jint.Runtime.Interpreter.Expressions;
  4. internal sealed class JintAwaitExpression : JintExpression
  5. {
  6. private JintExpression _awaitExpression = null!;
  7. public JintAwaitExpression(AwaitExpression expression) : base(expression)
  8. {
  9. _initialized = false;
  10. }
  11. protected override void Initialize(EvaluationContext context)
  12. {
  13. _awaitExpression = Build(((AwaitExpression) _expression).Argument);
  14. }
  15. protected override object EvaluateInternal(EvaluationContext context)
  16. {
  17. var engine = context.Engine;
  18. var asyncContext = engine.ExecutionContext;
  19. try
  20. {
  21. var value = _awaitExpression.GetValue(context);
  22. if (value is not JsPromise)
  23. {
  24. var promiseInstance = new JsPromise(engine);
  25. promiseInstance.Resolve(value);
  26. value = promiseInstance;
  27. }
  28. engine.RunAvailableContinuations();
  29. return value.UnwrapIfPromise();
  30. }
  31. catch (PromiseRejectedException e)
  32. {
  33. ExceptionHelper.ThrowJavaScriptException(engine, e.RejectedValue, _expression.Location);
  34. return null;
  35. }
  36. }
  37. }