ObjectEnvironmentRecord.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Jint.Native;
  2. using Jint.Native.Errors;
  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 ObjectInstance _bindingObject;
  14. private readonly bool _provideThis;
  15. public ObjectEnvironmentRecord(ObjectInstance bindingObject, bool provideThis)
  16. {
  17. _bindingObject = bindingObject;
  18. _provideThis = provideThis;
  19. }
  20. public override bool HasBinding(string name)
  21. {
  22. return _bindingObject.HasProperty(name);
  23. }
  24. /// <summary>
  25. /// http://www.ecma-international.org/ecma-262/5.1/#sec-10.2.1.2.2
  26. /// </summary>
  27. /// <param name="name"></param>
  28. /// <param name="configurable"></param>
  29. public override void CreateMutableBinding(string name, bool configurable = true)
  30. {
  31. var property = new DataDescriptor(Undefined.Instance)
  32. {
  33. Writable = true,
  34. Enumerable = true,
  35. Configurable = configurable
  36. };
  37. _bindingObject.DefineOwnProperty(name, property, true);
  38. }
  39. public override void SetMutableBinding(string name, object value, bool strict)
  40. {
  41. _bindingObject.Put(name, value, strict);
  42. }
  43. public override object GetBindingValue(string name, bool strict)
  44. {
  45. // todo: can be optimized
  46. if (!_bindingObject.HasProperty(name))
  47. {
  48. if(!strict)
  49. {
  50. return Undefined.Instance;
  51. }
  52. throw new ReferenceError();
  53. }
  54. return _bindingObject.Get(name);
  55. }
  56. public override bool DeleteBinding(string name)
  57. {
  58. return _bindingObject.Delete(name, false);
  59. }
  60. public override object ImplicitThisValue()
  61. {
  62. if (_provideThis)
  63. {
  64. return _bindingObject;
  65. }
  66. return Undefined.Instance;
  67. }
  68. }
  69. }