BuilderModuleRecord.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using Esprima.Ast;
  2. using Jint.Native;
  3. namespace Jint.Runtime.Modules;
  4. /// <summary>
  5. /// This is a custom ModuleRecord implementation for dynamically built modules using <see cref="ModuleBuilder"/>
  6. /// </summary>
  7. internal sealed class BuilderModuleRecord : SourceTextModuleRecord
  8. {
  9. private List<KeyValuePair<string, JsValue>> _exportBuilderDeclarations = new();
  10. internal BuilderModuleRecord(Engine engine, Realm realm, Module source, string? location, bool async)
  11. : base(engine, realm, source, location, async)
  12. {
  13. }
  14. internal void BindExportedValue(string name, JsValue value)
  15. {
  16. if (_environment is not null)
  17. {
  18. ExceptionHelper.ThrowInvalidOperationException("Cannot bind exported values after the environment has been initialized");
  19. }
  20. _exportBuilderDeclarations ??= new();
  21. _exportBuilderDeclarations.Add(new KeyValuePair<string, JsValue>(name, value));
  22. }
  23. protected override void InitializeEnvironment()
  24. {
  25. base.InitializeEnvironment();
  26. if (_exportBuilderDeclarations != null)
  27. {
  28. for (var i = 0; i < _exportBuilderDeclarations.Count; i++)
  29. {
  30. var d = _exportBuilderDeclarations[i];
  31. _environment.CreateImmutableBindingAndInitialize(d.Key, true, d.Value);
  32. _localExportEntries.Add(new ExportEntry(d.Key, null, null, d.Key));
  33. }
  34. _exportBuilderDeclarations.Clear();
  35. }
  36. }
  37. }