public IJsValue SetValue(IJsValue self, IJsValue value) { if (!Writable) { throw new JsReferenceException("Property {0} is not writable", Name); } if (!ReferenceEquals(self, Owner)) { // We are setting an inherited property in a subclassed instance var @this = self.Cast<IJsObject>("Cannot set property {0} on non-object", Name); // Is the property present in subclassed instance? var pd = @this.GetOwnProperty(Name); if (pd != null) { return pd.SetValue(self, value); } // If not, create it and return @this.DefineOwnProperty(new OwnedValuePropertyDescriptor(@this, Name, value, Flags)); return value; } return Value = value; }
public OwnedValuePropertyDescriptor(IJsObject owner, string name, IJsValue value, PropertyDescriptorFlags flags) { Owner = owner; Name = name; Value = value; Flags = flags; }
public static IJsValue Add(IEnvironment environment, IJsValue lhs, IJsValue rhs) { if ((lhs.ToPrimitive() is string) || (rhs.ToPrimitive() is string)) { return environment.CreateString(lhs.ToString() + rhs.ToString()); } return ArithEval(environment, lhs, rhs, (l, r) => l + r); }
public FunctionEnvironment(IEnvironment parent, IJsFunction function, IJsValue @this, IList<IJsValue> arguments) { if (parent == null) throw new ArgumentNullException("parent"); Parent = parent; Function = function; This = @this; Arguments = arguments; }
public override IReference GetReference(IJsValue name) { var index = name.ToArrayIndex(); if (index.HasValue && (index >= 0)) { return GetElementReference(index.Value); } return base.GetReference(name.ToString()); }
public IReference CreateReference(string name, IJsValue value) { if (_references == null) { _references = new Dictionary<string, IReference>(); } IReference reference; if (_references.TryGetValue(name, out reference)) { //throw new JsReferenceError(); // TODO: throw if strict only // NOTE: node.js allows redeclaration reference.SetValue(value); return reference; } return _references[name] = new ValueReference(value); }
public static IJsValue ArithEval(IEnvironment environment, IJsValue lhs, IJsValue rhs, Func<double, double, double> mathOperator) { /* var l = lhs.ToNumber(); if (double.IsNaN(l) || double.IsInfinity(l)) { return environment.CreateNumber(double.NaN); } var r = rhs.ToNumber(); if (double.IsNaN(r) || double.IsInfinity(r)) { return environment.CreateNumber(double.NaN); } return environment.CreateNumber(mathOperator(l, r)); */ var v = mathOperator(lhs.ToNumber(), rhs.ToNumber()); return environment.CreateNumber(double.IsInfinity(v) ? double.NaN : v); }
public override IJsValue Apply(IJsValue @this, IList<IJsValue> arguments) { if (Body == null) { return JsUndefined.Value; } var applyEnvironment = new Environment( new BoundArgumentsEnvironment( new FunctionEnvironment(Environment, this, @this, arguments), Arguments, arguments ) ); return Body.Evaluate(applyEnvironment); }
public abstract IJsValue Apply(IJsValue @this, IList<IJsValue> arguments);
public static IJsValue RelationalEval(IEnvironment environment, IJsValue lhs, IJsValue rhs, Func<double, double, bool> relationalOperator, Func<string, string, bool> stringRelationalOperator) { if ((lhs.ToPrimitive() is string) || (rhs.ToPrimitive() is string)) { return environment.CreateBool(stringRelationalOperator(lhs.ToString(), rhs.ToString())); } var ln = lhs.ToNumber(); if (double.IsNaN(ln)) { return JsUndefined.Value; } var rn = rhs.ToNumber(); if (double.IsNaN(rn)) { return JsUndefined.Value; } return environment.CreateBool(relationalOperator(ln, rn)); }
public static IJsValue Neg(IEnvironment environment, IJsValue value) { return environment.CreateNumber(-value.ToNumber()); }
public IJsValue SetValue(IJsValue self, IJsValue value) { throw new JsReferenceException("{0} is not defined", Name); }
public ReadonlyValueReference(IJsValue value) { Value = value; }
public IJsValue GetValue(IJsValue self = null) { return Value; }
public IJsValue SetValue(IJsValue self, IJsValue value) { return _setter(_name, value); }
private void Put(string name, IJsValue value) { GetReference(name).SetValue(this, value); }
public virtual IReference GetReference(IJsValue name) { return GetReference(name.ToString()); }
public static IJsValue Apply(this IJsFunction function, IJsValue @this, IEnumerable<IJsValue> arguments) { return function.Apply(@this, arguments.ToList()); }
public IJsValue GetValue(IJsValue self) { return Value; }
public static IJsValue Apply(this IJsFunction function, IJsValue @this, params IJsValue[] arguments) { return function.Apply(@this, (IList<IJsValue>)arguments); }
public override IJsValue Apply(IJsValue @this, IList<IJsValue> arguments) { return Func(Environment, @this, arguments) ?? JsUndefined.Value; }
public ValueReference(IJsValue value) { Value = value; }
public IReference GetReference(IJsValue name) { throw new JsReferenceException("Cannot read property {0} of {1}", name, this); }
public IJsValue Evaluate(IEnvironment environment, IJsValue value) { return Eval(environment, value); }
public IJsValue SetValue(IJsValue self, IJsValue value) { throw new JsReferenceException("Illegal assignment"); }
public IJsValue SetValue(IJsValue self, IJsValue value) { return Value = value; }
public IJsValue GetValue(IJsValue self) { return _getter(_name); }
public IJsValue GetValue(IJsValue self) { return JsUndefined.Value; }
public static IJsValue SetValue(this IReference reference, IJsValue value) { return reference.SetValue(null, value); }
public IJsValue Evaluate(IEnvironment environment, IJsValue lhs, IJsValue rhs) { return Eval(environment, lhs, rhs); }