Esempio n. 1
0
        public override JSValue Evaluate(Context context)
        {
            var result = prep(_parts[0].Evaluate(context));

            for (var i = 1; i < _parts.Length; i++)
            {
                result = new RopeString(result, prep(_parts[i].Evaluate(context)));
            }

            _tempContainer._valueType = JSValueType.String;
            _tempContainer._oValue    = result;
            return(_tempContainer);
        }
Esempio n. 2
0
        internal static void Impl(JSValue resultContainer, JSValue first, JSValue second)
        {
            switch (first._valueType)
            {
            case JSValueType.Boolean:
            case JSValueType.Integer:
            {
                if (second._valueType >= JSValueType.Object)
                {
                    second = second.ToPrimitiveValue_Value_String();
                }
                switch (second._valueType)
                {
                case JSValueType.Integer:
                case JSValueType.Boolean:
                {
                    long tl = (long)first._iValue + second._iValue;
                    if ((int)tl == tl)
                    {
                        resultContainer._valueType = JSValueType.Integer;
                        resultContainer._iValue    = (int)tl;
                    }
                    else
                    {
                        resultContainer._valueType = JSValueType.Double;
                        resultContainer._dValue    = (double)tl;
                    }
                    return;
                }

                case JSValueType.Double:
                {
                    resultContainer._valueType = JSValueType.Double;
                    resultContainer._dValue    = first._iValue + second._dValue;
                    return;
                }

                case JSValueType.String:
                {
                    resultContainer._oValue    = new RopeString((first._valueType == JSValueType.Boolean ? (first._iValue != 0 ? "true" : "false") : first._iValue.ToString(CultureInfo.InvariantCulture)), second._oValue);
                    resultContainer._valueType = JSValueType.String;
                    return;
                }

                case JSValueType.NotExists:
                case JSValueType.NotExistsInObject:
                case JSValueType.Undefined:
                {
                    resultContainer._dValue    = double.NaN;
                    resultContainer._valueType = JSValueType.Double;
                    return;
                }

                case JSValueType.Object:             // x+null
                {
                    resultContainer._iValue    = first._iValue;
                    resultContainer._valueType = JSValueType.Integer;
                    return;
                }
                }
                break;
            }

            case JSValueType.Double:
            {
                if (second._valueType >= JSValueType.Object)
                {
                    second = second.ToPrimitiveValue_Value_String();
                }
                switch (second._valueType)
                {
                case JSValueType.Integer:
                case JSValueType.Boolean:
                {
                    resultContainer._valueType = JSValueType.Double;
                    resultContainer._dValue    = first._dValue + second._iValue;
                    return;
                }

                case JSValueType.Double:
                {
                    resultContainer._valueType = JSValueType.Double;
                    resultContainer._dValue    = first._dValue + second._dValue;
                    return;
                }

                case JSValueType.String:
                {
                    resultContainer._oValue    = new RopeString(Tools.DoubleToString(first._dValue), second._oValue);
                    resultContainer._valueType = JSValueType.String;
                    return;
                }

                case JSValueType.Object:             // null
                {
                    resultContainer._dValue    = first._dValue;
                    resultContainer._valueType = JSValueType.Double;
                    return;
                }

                case JSValueType.NotExists:
                case JSValueType.NotExistsInObject:
                case JSValueType.Undefined:
                {
                    resultContainer._dValue    = double.NaN;
                    resultContainer._valueType = JSValueType.Double;
                    return;
                }
                }
                break;
            }

            case JSValueType.String:
            {
                object tstr = first._oValue;
                switch (second._valueType)
                {
                case JSValueType.String:
                {
                    tstr = new RopeString(tstr, second._oValue);
                    break;
                }

                case JSValueType.Boolean:
                {
                    tstr = new RopeString(tstr, second._iValue != 0 ? "true" : "false");
                    break;
                }

                case JSValueType.Integer:
                {
                    tstr = new RopeString(tstr, second._iValue.ToString(CultureInfo.InvariantCulture));
                    break;
                }

                case JSValueType.Double:
                {
                    tstr = new RopeString(tstr, Tools.DoubleToString(second._dValue));
                    break;
                }

                case JSValueType.Undefined:
                case JSValueType.NotExistsInObject:
                {
                    tstr = new RopeString(tstr, "undefined");
                    break;
                }

                case JSValueType.Object:
                case JSValueType.Function:
                case JSValueType.Date:
                {
                    tstr = new RopeString(tstr, second.ToString());
                    break;
                }
                }
                resultContainer._oValue    = tstr;
                resultContainer._valueType = JSValueType.String;
                return;
            }

            case JSValueType.Date:
            {
                first = first.ToPrimitiveValue_String_Value();
                Impl(resultContainer, first, second);
                return;
            }

            case JSValueType.NotExistsInObject:
            case JSValueType.Undefined:
            {
                if (second._valueType >= JSValueType.Object)
                {
                    second = second.ToPrimitiveValue_Value_String();
                }
                switch (second._valueType)
                {
                case JSValueType.String:
                {
                    resultContainer._valueType = JSValueType.String;
                    resultContainer._oValue    = new RopeString("undefined", second._oValue);
                    return;
                }

                case JSValueType.Double:
                case JSValueType.Boolean:
                case JSValueType.Integer:
                {
                    resultContainer._valueType = JSValueType.Double;
                    resultContainer._dValue    = double.NaN;
                    return;
                }

                case JSValueType.Object:             // undefined+null
                case JSValueType.NotExistsInObject:
                case JSValueType.Undefined:
                {
                    resultContainer._valueType = JSValueType.Double;
                    resultContainer._dValue    = double.NaN;
                    return;
                }
                }
                break;
            }

            case JSValueType.Function:
            case JSValueType.Object:
            {
                first = first.ToPrimitiveValue_Value_String();
                if (first._valueType == JSValueType.Integer || first._valueType == JSValueType.Boolean)
                {
                    goto case JSValueType.Integer;
                }
                else if (first._valueType == JSValueType.Object)         // null
                {
                    if (second._valueType >= JSValueType.String)
                    {
                        second = second.ToPrimitiveValue_Value_String();
                    }
                    if (second._valueType == JSValueType.String)
                    {
                        resultContainer._oValue    = new RopeString("null", second._oValue);
                        resultContainer._valueType = JSValueType.String;
                        return;
                    }
                    first._iValue = 0;
                    goto case JSValueType.Integer;
                }
                else if (first._valueType == JSValueType.Double)
                {
                    goto case JSValueType.Double;
                }
                else if (first._valueType == JSValueType.String)
                {
                    goto case JSValueType.String;
                }
                break;
            }
            }
        }