コード例 #1
0
        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);
        }
コード例 #2
0
            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));
            }
コード例 #3
0
 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);
 }
コード例 #4
0
 public RuntimeObj CreateBoolean(RuntimeObj o)
 {
     if (o == null)
     {
         return(JSEvalBoolean.False);
     }
     if (o is JSEvalBoolean)
     {
         return(o);
     }
     return(CreateBoolean(o.ToBoolean()));
 }
コード例 #5
0
 public RuntimeObj CreateBoolean( RuntimeObj o )
 {
     if( o == null ) return JSEvalBoolean.False;
     if( o is JSEvalBoolean ) return o;
     return CreateBoolean( o.ToBoolean() );
 }
コード例 #6
0
 public override bool ToBoolean() => _value.ToBoolean();
コード例 #7
0
 public override bool ToBoolean()
 {
     return(_value.ToBoolean());
 }
コード例 #8
0
            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));
            }