SyntheticModule.cs 2.5 KB

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