ClrAccessDescriptor.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using Jint.Native;
  2. using Jint.Runtime.Environments;
  3. using Jint.Runtime.Interop;
  4. namespace Jint.Runtime.Descriptors.Specialized
  5. {
  6. internal sealed class ClrAccessDescriptor : PropertyDescriptor
  7. {
  8. private readonly DeclarativeEnvironmentRecord _env;
  9. private readonly Engine _engine;
  10. private readonly EnvironmentRecord.BindingName _name;
  11. private GetterFunctionInstance _get;
  12. private SetterFunctionInstance _set;
  13. public ClrAccessDescriptor(
  14. DeclarativeEnvironmentRecord env,
  15. Engine engine,
  16. string name)
  17. : base(value: null, PropertyFlag.Configurable)
  18. {
  19. _env = env;
  20. _engine = engine;
  21. _name = new EnvironmentRecord.BindingName(name);
  22. }
  23. public override JsValue Get => _get ??= new GetterFunctionInstance(_engine, DoGet);
  24. public override JsValue Set => _set ??= new SetterFunctionInstance(_engine, DoSet);
  25. private JsValue DoGet(JsValue n)
  26. {
  27. return _env.TryGetBinding(_name, false, out var binding, out _)
  28. ? binding.Value
  29. : JsValue.Undefined;
  30. }
  31. private void DoSet(JsValue n, JsValue o)
  32. {
  33. _env.SetMutableBinding(_name.Key.Name, o, true);
  34. }
  35. }
  36. }