using Jint.Native;
using Jint.Native.Errors;
using Jint.Native.Object;
using Jint.Runtime.Descriptors;
namespace Jint.Runtime.Environments
{
///
/// Represents an object environment record
/// http://www.ecma-international.org/ecma-262/5.1/#sec-10.2.1.2
///
public sealed class ObjectEnvironmentRecord : EnvironmentRecord
{
private readonly ObjectInstance _bindingObject;
private readonly bool _provideThis;
public ObjectEnvironmentRecord(ObjectInstance bindingObject, bool provideThis)
{
_bindingObject = bindingObject;
_provideThis = provideThis;
}
public override bool HasBinding(string name)
{
return _bindingObject.HasProperty(name);
}
///
/// http://www.ecma-international.org/ecma-262/5.1/#sec-10.2.1.2.2
///
///
///
public override void CreateMutableBinding(string name, bool configurable = true)
{
var property = new DataDescriptor(Undefined.Instance)
{
Writable = true,
Enumerable = true,
Configurable = configurable
};
_bindingObject.DefineOwnProperty(name, property, true);
}
public override void SetMutableBinding(string name, object value, bool strict)
{
_bindingObject.Put(name, value, strict);
}
public override object GetBindingValue(string name, bool strict)
{
// todo: can be optimized
if (!_bindingObject.HasProperty(name))
{
if(!strict)
{
return Undefined.Instance;
}
throw new ReferenceError();
}
return _bindingObject.Get(name);
}
public override bool DeleteBinding(string name)
{
return _bindingObject.Delete(name, false);
}
public override object ImplicitThisValue()
{
if (_provideThis)
{
return _bindingObject;
}
return Undefined.Instance;
}
}
}