public bool AreEqualStrict(GlobalContext c) { if (ReferenceEquals(X, Y)) { return(X != DoubleObj.NaN); } if (!ReferenceEquals(X.Type, Y.Type)) { return(false); } Debug.Assert(X != RuntimeObj.Undefined && X != RuntimeObj.Null); if (ReferenceEquals(X.Type, RuntimeObj.TypeNumber)) { if (X == DoubleObj.NaN || Y == DoubleObj.NaN) { return(false); } return(X.ToDouble() == Y.ToDouble()); } if (ReferenceEquals(X.Type, RuntimeObj.TypeString)) { return(X.ToString() == Y.ToString()); } if (ReferenceEquals(X.Type, RuntimeObj.TypeBoolean)) { return(X.ToBoolean() == Y.ToBoolean()); } return(false); }
protected override PExpr DoVisit() { if (IsPendingOrSignal(ref _expression, Expr.Expression)) { return(PendingOrSignal(_expression)); } RuntimeObj result = _expression.Result; // Minus and Plus are classified as a binary operator. // Handle those special cases here. if (Expr.TokenType == JSTokenizerToken.Minus) { result = Global.CreateNumber(-result.ToDouble()); } else if (Expr.TokenType == JSTokenizerToken.Plus) { result = Global.CreateNumber(result.ToDouble()); } else { switch ((int)Expr.TokenType & 15) { case (int)JSTokenizerToken.Not & 15: { result = Global.CreateBoolean(!result.ToBoolean()); break; } case (int)JSTokenizerToken.BitwiseNot & 15: { result = Global.CreateNumber(~JSSupport.ToInt64(result.ToDouble())); break; } case (int)JSTokenizerToken.TypeOf & 15: { // Well known Javascript bug: typeof null === "object". if (result == RuntimeObj.Null) { result = Global.CreateString(RuntimeObj.TypeObject); } else { result = Global.CreateString(result.Type); } break; } case (int)JSTokenizerToken.Void & 15: { result = RuntimeObj.Undefined; break; } default: throw UnsupportedOperatorException(); } } return(SetResult(result)); }
public bool AreEqual(GlobalContext c) { if (ReferenceEquals(X, Y)) { return(X != JSEvalNumber.NaN); } if (ReferenceEquals(X.Type, Y.Type)) { Debug.Assert(X != RuntimeObj.Undefined && X != RuntimeObj.Null, "This has been handled by the normalization and the above reference test."); if (ReferenceEquals(X.Type, RuntimeObj.TypeNumber)) { Debug.Assert(!(((JSEvalNumber)X).IsNaN && ((JSEvalNumber)Y).IsNaN)); return(X.ToDouble() == Y.ToDouble()); } else if (ReferenceEquals(X.Type, RuntimeObj.TypeString)) { return(X.ToString() == Y.ToString()); } else if (ReferenceEquals(X.Type, RuntimeObj.TypeBoolean)) { return(X.ToBoolean() == Y.ToBoolean()); } else { IComparable cmp; if (X.GetType() == Y.GetType() && (cmp = X as IComparable) != null) { Debug.Assert((cmp.CompareTo(Y) == 0) == X.Equals(Y), "When IComparable is implemented, it must match Equals behavior."); return(cmp.Equals(Y)); } } return(false); } if (ReferenceEquals(X.Type, RuntimeObj.TypeNumber) && ReferenceEquals(Y.Type, RuntimeObj.TypeString)) { return(X.ToDouble() == Y.ToDouble()); } if (ReferenceEquals(X.Type, RuntimeObj.TypeBoolean) || ReferenceEquals(Y.Type, RuntimeObj.TypeBoolean)) { return(X.ToBoolean() == Y.ToBoolean()); } return(false); }
public RuntimeObj CreateBoolean(RuntimeObj o) { if (o == null) { return(JSEvalBoolean.False); } if (o is JSEvalBoolean) { return(o); } return(CreateBoolean(o.ToBoolean())); }
public RuntimeObj CreateBoolean( RuntimeObj o ) { if( o == null ) return JSEvalBoolean.False; if( o is JSEvalBoolean ) return o; return CreateBoolean( o.ToBoolean() ); }
public override bool ToBoolean() => _value.ToBoolean();
public override bool ToBoolean() { return(_value.ToBoolean()); }
protected override PExpr DoVisit() { if (IsPendingOrSignal(ref _expression, Expr.Expression)) { RuntimeError e = _expression.AsErrorResult; if (e != null && e.IsReferenceError && ((int)Expr.TokenType & 15) == ((int)TokenizerToken.TypeOf & 15)) { return(SetResult(StringObj.Create(RuntimeObj.TypeUndefined))); } return(PendingOrSignal(_expression)); } RuntimeObj result = _expression.Result; // Minus and Plus are classified as a binary operator. // Handle those special cases here. if (Expr.TokenType == TokenizerToken.Minus) { result = DoubleObj.Create(-result.ToDouble()); } else if (Expr.TokenType == TokenizerToken.Plus) { result = DoubleObj.Create(result.ToDouble()); } else { switch ((int)Expr.TokenType & 15) { case (int)TokenizerToken.Not & 15: { result = result.ToBoolean() ? BooleanObj.False : BooleanObj.True; break; } case (int)TokenizerToken.BitwiseNot & 15: { result = DoubleObj.Create(~JSSupport.ToInt64(result.ToDouble())); break; } case (int)TokenizerToken.TypeOf & 15: { // Well known Javascript bug: typeof null === "object". if (result == RuntimeObj.Null) { result = StringObj.Create(RuntimeObj.TypeObject); } else { result = StringObj.Create(result.Type); } break; } case (int)TokenizerToken.IndexOf & 15: { RefRuntimeIndexedObj iO = result as RefRuntimeIndexedObj; if (iO == null) { result = new RuntimeError(Expr, "No associated index. indexof must be used on a foreach variable."); } else { result = iO.Index; } break; } case (int)TokenizerToken.Void & 15: { result = RuntimeObj.Undefined; break; } default: throw UnsupportedOperatorException(); } } return(SetResult(result)); }