ObjectEnvironmentRecord.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System.Linq;
  2. using Jint.Native;
  3. using Jint.Native.Object;
  4. using Jint.Runtime.Descriptors;
  5. namespace Jint.Runtime.Environments
  6. {
  7. /// <summary>
  8. /// Represents an object environment record
  9. /// http://www.ecma-international.org/ecma-262/5.1/#sec-10.2.1.2
  10. /// </summary>
  11. public sealed class ObjectEnvironmentRecord : EnvironmentRecord
  12. {
  13. private readonly Engine _engine;
  14. private readonly ObjectInstance _bindingObject;
  15. private readonly bool _provideThis;
  16. public ObjectEnvironmentRecord(Engine engine, ObjectInstance bindingObject, bool provideThis) : base(engine)
  17. {
  18. _engine = engine;
  19. _bindingObject = bindingObject;
  20. _provideThis = provideThis;
  21. }
  22. public override bool HasBinding(string name)
  23. {
  24. return _bindingObject.HasProperty(name);
  25. }
  26. /// <summary>
  27. /// http://www.ecma-international.org/ecma-262/5.1/#sec-10.2.1.2.2
  28. /// </summary>
  29. /// <param name="name"></param>
  30. /// <param name="configurable"></param>
  31. public override void CreateMutableBinding(string name, bool configurable = true)
  32. {
  33. _bindingObject.DefineOwnProperty(name, new PropertyDescriptor(Undefined.Instance, true, true, configurable), true);
  34. }
  35. public override void SetMutableBinding(string name, JsValue value, bool strict)
  36. {
  37. _bindingObject.Put(name, value, strict);
  38. }
  39. public override JsValue GetBindingValue(string name, bool strict)
  40. {
  41. // todo: can be optimized
  42. if (!_bindingObject.HasProperty(name))
  43. {
  44. if(!strict)
  45. {
  46. return Undefined.Instance;
  47. }
  48. throw new JavaScriptException(_engine.ReferenceError);
  49. }
  50. return _bindingObject.Get(name);
  51. }
  52. public override bool DeleteBinding(string name)
  53. {
  54. return _bindingObject.Delete(name, false);
  55. }
  56. public override JsValue ImplicitThisValue()
  57. {
  58. if (_provideThis)
  59. {
  60. return new JsValue(_bindingObject);
  61. }
  62. return Undefined.Instance;
  63. }
  64. public override string[] GetAllBindingNames()
  65. {
  66. if (_bindingObject != null)
  67. {
  68. return _bindingObject.GetOwnProperties().Select( x=> x.Key).ToArray();
  69. }
  70. return new string[0];
  71. }
  72. }
  73. }