JintAwaitExpression.cs 1.2 KB

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