JintImportExpression.cs 1.3 KB

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