SyntheticModule.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using Esprima.Ast;
  2. using Jint.Native;
  3. using Jint.Native.Promise;
  4. using Jint.Runtime.Environments;
  5. namespace Jint.Runtime.Modules;
  6. internal sealed class SyntheticModule : Module
  7. {
  8. private readonly JsValue _obj;
  9. private readonly List<string> _exportNames = ["default"];
  10. internal SyntheticModule(Engine engine, Realm realm, JsValue obj, string? location)
  11. : base(engine, realm, location)
  12. {
  13. _obj = obj;
  14. var env = JintEnvironment.NewModuleEnvironment(_engine, realm.GlobalEnv);
  15. _environment = env;
  16. }
  17. public override List<string> GetExportedNames(List<CyclicModule>? exportStarSet = null) => _exportNames;
  18. internal override ResolvedBinding? ResolveExport(string exportName, List<ExportResolveSetItem>? resolveSet = null)
  19. {
  20. if (!_exportNames.Contains(exportName))
  21. {
  22. return null;
  23. }
  24. return new ResolvedBinding(this, exportName);
  25. }
  26. public override void Link()
  27. {
  28. }
  29. public override JsValue Evaluate()
  30. {
  31. var moduleContext = new ExecutionContext(
  32. function: null,
  33. realm: _realm,
  34. scriptOrModule: this,
  35. variableEnvironment: _environment,
  36. lexicalEnvironment: _environment,
  37. privateEnvironment: null,
  38. generator: null);
  39. // 7.Suspend the currently running execution context.
  40. _engine.EnterExecutionContext(moduleContext);
  41. _environment.SetMutableBinding("default", _obj, strict: true);
  42. _engine.LeaveExecutionContext();
  43. var pc = PromiseConstructor.NewPromiseCapability(_engine, _realm.Intrinsics.Promise);
  44. pc.Resolve.Call(Undefined, Array.Empty<JsValue>());
  45. return pc.PromiseInstance;
  46. }
  47. protected internal override int InnerModuleLinking(Stack<CyclicModule> stack, int index)
  48. {
  49. foreach (var exportName in _exportNames)
  50. {
  51. _environment.CreateMutableBinding(exportName, canBeDeleted: false);
  52. _environment.InitializeBinding(exportName, Undefined);
  53. }
  54. return index;
  55. }
  56. protected internal override Completion InnerModuleEvaluation(Stack<CyclicModule> stack, int index, ref int asyncEvalOrder)
  57. {
  58. _environment.SetMutableBinding("default", _obj, strict: true);
  59. return new Completion(CompletionType.Normal, index, new Identifier(""));
  60. }
  61. }