SyntheticModule.cs 2.3 KB

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