JintImportExpression.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Esprima.Ast;
  2. using Jint.Native;
  3. using Jint.Native.Promise;
  4. namespace Jint.Runtime.Interpreter.Expressions;
  5. internal sealed class JintImportExpression : JintExpression
  6. {
  7. private JintExpression _importExpression;
  8. private bool _initialized;
  9. public JintImportExpression(ImportExpression expression) : base(expression)
  10. {
  11. _importExpression = null!;
  12. }
  13. private void Initialize(EvaluationContext context)
  14. {
  15. var expression = ((ImportExpression) _expression).Source;
  16. _importExpression = Build(expression);
  17. }
  18. /// <summary>
  19. /// https://tc39.es/ecma262/#sec-import-calls
  20. /// </summary>
  21. protected override object EvaluateInternal(EvaluationContext context)
  22. {
  23. if (!_initialized)
  24. {
  25. Initialize(context);
  26. _initialized = true;
  27. }
  28. var referencingScriptOrModule = context.Engine.GetActiveScriptOrModule();
  29. var argRef = _importExpression.Evaluate(context);
  30. var specifier = context.Engine.GetValue(argRef); //.UnwrapIfPromise();
  31. var promiseCapability = PromiseConstructor.NewPromiseCapability(context.Engine, context.Engine.Realm.Intrinsics.Promise);
  32. string specifierString;
  33. try
  34. {
  35. specifierString = TypeConverter.ToString(specifier);
  36. }
  37. catch (JavaScriptException e)
  38. {
  39. promiseCapability.Reject.Call(JsValue.Undefined, new[] { e.Error });
  40. return JsValue.Undefined;
  41. }
  42. context.Engine._host.ImportModuleDynamically(referencingScriptOrModule, specifierString, promiseCapability);
  43. return promiseCapability.PromiseInstance;
  44. }
  45. }