|
@@ -1,6 +1,4 @@
|
|
|
-using System.Collections.Generic;
|
|
|
-using System.Linq;
|
|
|
-using Jint.Native;
|
|
|
+using Jint.Native;
|
|
|
|
|
|
namespace Jint.Runtime.Environments
|
|
|
{
|
|
@@ -11,7 +9,11 @@ namespace Jint.Runtime.Environments
|
|
|
public sealed class DeclarativeEnvironmentRecord : EnvironmentRecord
|
|
|
{
|
|
|
private readonly Engine _engine;
|
|
|
- private readonly Dictionary<string, Binding> _bindings = new Dictionary<string, Binding>();
|
|
|
+
|
|
|
+ private const string BindingNameArguments = "arguments";
|
|
|
+ private Binding _argumentsBinding;
|
|
|
+
|
|
|
+ private readonly MruPropertyCache2<string, Binding> _bindings = new MruPropertyCache2<string, Binding>();
|
|
|
|
|
|
public DeclarativeEnvironmentRecord(Engine engine) : base(engine)
|
|
|
{
|
|
@@ -20,22 +22,36 @@ namespace Jint.Runtime.Environments
|
|
|
|
|
|
public override bool HasBinding(string name)
|
|
|
{
|
|
|
+ if (name == BindingNameArguments)
|
|
|
+ {
|
|
|
+ return _argumentsBinding != null;
|
|
|
+ }
|
|
|
+
|
|
|
return _bindings.ContainsKey(name);
|
|
|
}
|
|
|
|
|
|
public override void CreateMutableBinding(string name, bool canBeDeleted = false)
|
|
|
{
|
|
|
- _bindings.Add(name, new Binding
|
|
|
- {
|
|
|
- Value = Undefined.Instance,
|
|
|
- CanBeDeleted = canBeDeleted,
|
|
|
- Mutable = true
|
|
|
- });
|
|
|
+ var binding = new Binding
|
|
|
+ {
|
|
|
+ Value = Undefined.Instance,
|
|
|
+ CanBeDeleted = canBeDeleted,
|
|
|
+ Mutable = true
|
|
|
+ };
|
|
|
+
|
|
|
+ if (name == BindingNameArguments)
|
|
|
+ {
|
|
|
+ _argumentsBinding = binding;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _bindings.Add(name, binding);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public override void SetMutableBinding(string name, JsValue value, bool strict)
|
|
|
{
|
|
|
- var binding = _bindings[name];
|
|
|
+ var binding = name == BindingNameArguments ? _argumentsBinding : _bindings[name];
|
|
|
if (binding.Mutable)
|
|
|
{
|
|
|
binding.Value = value;
|
|
@@ -51,7 +67,7 @@ namespace Jint.Runtime.Environments
|
|
|
|
|
|
public override JsValue GetBindingValue(string name, bool strict)
|
|
|
{
|
|
|
- var binding = _bindings[name];
|
|
|
+ var binding = name == BindingNameArguments ? _argumentsBinding : _bindings[name];
|
|
|
|
|
|
if (!binding.Mutable && binding.Value == Undefined.Instance)
|
|
|
{
|
|
@@ -69,7 +85,16 @@ namespace Jint.Runtime.Environments
|
|
|
public override bool DeleteBinding(string name)
|
|
|
{
|
|
|
Binding binding;
|
|
|
- if (!_bindings.TryGetValue(name, out binding))
|
|
|
+ if (name == BindingNameArguments)
|
|
|
+ {
|
|
|
+ binding = _argumentsBinding;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _bindings.TryGetValue(name, out binding);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (binding == null)
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
@@ -79,7 +104,14 @@ namespace Jint.Runtime.Environments
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- _bindings.Remove(name);
|
|
|
+ if (name == BindingNameArguments)
|
|
|
+ {
|
|
|
+ _argumentsBinding = null;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _bindings.Remove(name);
|
|
|
+ }
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -95,12 +127,21 @@ namespace Jint.Runtime.Environments
|
|
|
/// <param name="name">The identifier of the binding.</param>
|
|
|
public void CreateImmutableBinding(string name)
|
|
|
{
|
|
|
- _bindings.Add(name, new Binding
|
|
|
- {
|
|
|
- Value = Undefined.Instance,
|
|
|
- Mutable = false,
|
|
|
- CanBeDeleted = false
|
|
|
- });
|
|
|
+ var binding = new Binding
|
|
|
+ {
|
|
|
+ Value = Undefined.Instance,
|
|
|
+ Mutable = false,
|
|
|
+ CanBeDeleted = false
|
|
|
+ };
|
|
|
+
|
|
|
+ if (name == BindingNameArguments)
|
|
|
+ {
|
|
|
+ _argumentsBinding = binding;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _bindings.Add(name, binding);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -110,7 +151,7 @@ namespace Jint.Runtime.Environments
|
|
|
/// <param name="value">The value of the binding.</param>
|
|
|
public void InitializeImmutableBinding(string name, JsValue value)
|
|
|
{
|
|
|
- var binding = _bindings[name];
|
|
|
+ var binding = name == BindingNameArguments ? _argumentsBinding : _bindings[name];
|
|
|
binding.Value = value;
|
|
|
}
|
|
|
|
|
@@ -120,7 +161,7 @@ namespace Jint.Runtime.Environments
|
|
|
/// <returns>The array of all defined bindings</returns>
|
|
|
public override string[] GetAllBindingNames()
|
|
|
{
|
|
|
- return _bindings.Keys.ToArray();
|
|
|
+ return _bindings.GetKeys();
|
|
|
}
|
|
|
}
|
|
|
}
|