2
0

SyntheticModule.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. InnerModuleLinking(null!, 0);
  30. }
  31. public override JsValue Evaluate()
  32. {
  33. var moduleContext = new ExecutionContext(
  34. function: null,
  35. realm: _realm,
  36. scriptOrModule: this,
  37. variableEnvironment: _environment,
  38. lexicalEnvironment: _environment,
  39. privateEnvironment: null,
  40. generator: null,
  41. parserOptions: _parserOptions);
  42. // 7.Suspend the currently running execution context.
  43. _engine.EnterExecutionContext(moduleContext);
  44. _environment.SetMutableBinding(KnownKeys.Default, _obj, strict: true);
  45. _engine.LeaveExecutionContext();
  46. var pc = PromiseConstructor.NewPromiseCapability(_engine, _realm.Intrinsics.Promise);
  47. pc.Resolve.Call(Undefined, Array.Empty<JsValue>());
  48. return pc.PromiseInstance;
  49. }
  50. protected internal override int InnerModuleLinking(Stack<CyclicModule> stack, int index)
  51. {
  52. foreach (var exportName in _exportNames)
  53. {
  54. _environment.CreateMutableBinding(exportName, canBeDeleted: false);
  55. _environment.InitializeBinding(exportName, Undefined, DisposeHint.Normal);
  56. }
  57. return index;
  58. }
  59. protected internal override Completion InnerModuleEvaluation(Stack<CyclicModule> stack, int index, ref int asyncEvalOrder)
  60. {
  61. _environment.SetMutableBinding(KnownKeys.Default, _obj, strict: true);
  62. return new Completion(CompletionType.Normal, index, new Identifier(""));
  63. }
  64. }