public override string ToString() { string sP = Deferred != null?String.Format("({2} - {0}), Expr: {1}", Deferred.GetType().Name, Deferred.Expr, DeferredStatus) : null; string sR = Result != null?String.Format("({0}), Value = {1}", Result.GetType().Name, Result) : null; return(sP ?? sR ?? "(Unknown)"); }
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 bool Compare(GlobalContext c, out int result) { result = 0; if (Y == RuntimeObj.Undefined) { return(X == RuntimeObj.Undefined); } Debug.Assert(typeof(IComparable).IsAssignableFrom(typeof(StringObj)), "StringObj is Comparable."); IComparable cmp; if (X.GetType() == Y.GetType() && (cmp = X as IComparable) != null) { result = cmp.CompareTo(Y); } else if (X.Type == RuntimeObj.TypeNumber || Y.Type == RuntimeObj.TypeNumber) { Double xD = X.ToDouble(); Double yD = Y.ToDouble(); if (Double.IsNaN(xD) || Double.IsNaN(yD)) { return(false); } if (xD < yD) { result = -1; } else if (xD > yD) { result = 1; } } else { return(false); } if (Swapped) { result = -result; } return(true); }