2
0

JintImportExpression.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. #nullable enable
  2. using Esprima.Ast;
  3. using Jint.Native.Promise;
  4. namespace Jint.Runtime.Interpreter.Expressions;
  5. internal sealed class JintImportExpression : JintExpression
  6. {
  7. private JintExpression _importExpression;
  8. public JintImportExpression(Import expression) : base(expression)
  9. {
  10. _initialized = false;
  11. _importExpression = null!;
  12. }
  13. protected override void Initialize(EvaluationContext context)
  14. {
  15. var expression = ((Import) _expression).Source;
  16. _importExpression = Build(context.Engine, expression!);
  17. }
  18. /// <summary>
  19. /// https://tc39.es/ecma262/#sec-import-calls
  20. /// </summary>
  21. protected override ExpressionResult EvaluateInternal(EvaluationContext context)
  22. {
  23. var referencingScriptOrModule = context.Engine.GetActiveScriptOrModule();
  24. var argRef = _importExpression.Evaluate(context);
  25. var specifier = context.Engine.GetValue(argRef.Value); //.UnwrapIfPromise();
  26. var promiseCapability = PromiseConstructor.NewPromiseCapability(context.Engine, context.Engine.Realm.Intrinsics.Promise);
  27. var specifierString = TypeConverter.ToString(specifier);
  28. context.Engine._host.ImportModuleDynamically(referencingScriptOrModule, specifierString, promiseCapability);
  29. context.Engine.RunAvailableContinuations();
  30. return NormalCompletion(promiseCapability.PromiseInstance);
  31. }
  32. }