Module.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #nullable disable
  2. using Jint.Native;
  3. using Jint.Native.Object;
  4. using Jint.Runtime.Environments;
  5. namespace Jint.Runtime.Modules;
  6. internal sealed record ExportResolveSetItem(
  7. CyclicModule Module,
  8. string ExportName
  9. );
  10. /// <summary>
  11. /// https://tc39.es/ecma262/#sec-abstract-module-records
  12. /// </summary>
  13. public abstract class Module : JsValue, IScriptOrModule
  14. {
  15. private ObjectInstance _namespace;
  16. protected readonly Engine _engine;
  17. protected readonly Realm _realm;
  18. internal ModuleEnvironment _environment;
  19. public string Location { get; }
  20. internal Module(Engine engine, Realm realm, string location) : base(InternalTypes.Module)
  21. {
  22. _engine = engine;
  23. _realm = realm;
  24. Location = location;
  25. }
  26. public abstract List<string> GetExportedNames(List<CyclicModule> exportStarSet = null);
  27. internal abstract ResolvedBinding ResolveExport(string exportName, List<ExportResolveSetItem> resolveSet = null);
  28. public abstract void Link();
  29. public abstract JsValue Evaluate();
  30. protected internal abstract int InnerModuleLinking(Stack<CyclicModule> stack, int index);
  31. protected internal abstract Completion InnerModuleEvaluation(Stack<CyclicModule> stack, int index, ref int asyncEvalOrder);
  32. /// <summary>
  33. /// https://tc39.es/ecma262/#sec-getmodulenamespace
  34. /// </summary>
  35. public static ObjectInstance GetModuleNamespace(Module module)
  36. {
  37. var ns = module._namespace;
  38. if (ns is null)
  39. {
  40. var exportedNames = module.GetExportedNames();
  41. var unambiguousNames = new List<string>();
  42. for (var i = 0; i < exportedNames.Count; i++)
  43. {
  44. var name = exportedNames[i];
  45. var resolution = module.ResolveExport(name);
  46. if (resolution is not null && resolution != ResolvedBinding.Ambiguous)
  47. {
  48. unambiguousNames.Add(name);
  49. }
  50. }
  51. ns = CreateModuleNamespace(module, unambiguousNames);
  52. }
  53. return ns;
  54. }
  55. /// <summary>
  56. /// https://tc39.es/ecma262/#sec-modulenamespacecreate
  57. /// </summary>
  58. private static ModuleNamespace CreateModuleNamespace(Module module, List<string> unambiguousNames)
  59. {
  60. var m = new ModuleNamespace(module._engine, module, unambiguousNames);
  61. module._namespace = m;
  62. return m;
  63. }
  64. public override object ToObject()
  65. {
  66. Throw.NotSupportedException();
  67. return null;
  68. }
  69. public override string ToString()
  70. {
  71. return $"{Type}: {Location}";
  72. }
  73. }