ModuleEnvironmentRecord.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using Jint.Collections;
  2. using Jint.Native;
  3. using Jint.Runtime.Modules;
  4. namespace Jint.Runtime.Environments;
  5. /// <summary>
  6. /// Represents a module environment record
  7. /// https://tc39.es/ecma262/#sec-module-environment-records
  8. /// </summary>
  9. internal sealed class ModuleEnvironmentRecord : DeclarativeEnvironmentRecord
  10. {
  11. private readonly HybridDictionary<IndirectBinding> _importBindings = new();
  12. internal ModuleEnvironmentRecord(Engine engine) : base(engine, false)
  13. {
  14. }
  15. public override JsValue GetThisBinding()
  16. {
  17. return Undefined;
  18. }
  19. public void CreateImportBinding(string importName, JsModule module, string name)
  20. {
  21. _hasBindings = true;
  22. _importBindings[importName] = new IndirectBinding(module, name);
  23. }
  24. public override JsValue GetBindingValue(string name, bool strict)
  25. {
  26. if (_importBindings.TryGetValue(name, out var indirectBinding))
  27. {
  28. return base.GetBindingValue(name, strict);
  29. }
  30. return indirectBinding.Module._environment.GetBindingValue(indirectBinding.BindingName, true);
  31. }
  32. internal override bool TryGetBinding(in BindingName name, bool strict, out Binding binding, out JsValue value)
  33. {
  34. if (!_importBindings.TryGetValue(name.Key, out var indirectBinding))
  35. {
  36. return base.TryGetBinding(name, strict, out binding, out value);
  37. }
  38. value = indirectBinding.Module._environment.GetBindingValue(indirectBinding.BindingName, true);
  39. binding = new(value, false, false, true);
  40. return true;
  41. }
  42. public override bool HasThisBinding() => true;
  43. private readonly record struct IndirectBinding(JsModule Module, string BindingName);
  44. }