18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All Rights Reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Library General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Library General Public License
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  along with this library; see the file COPYING.LIB.  If not, write to
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Boston, MA 02110-1301, USA.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Operations.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Error.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSObject.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSString.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <math.h>
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h>
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/MathExtras.h>
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool JSValue::equalSlowCase(ExecState* exec, JSValue v1, JSValue v2)
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return equalSlowCaseInline(exec, v1, v2);
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool JSValue::strictEqualSlowCase(ExecState* exec, JSValue v1, JSValue v2)
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return strictEqualSlowCaseInline(exec, v1, v2);
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
445f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE JSValue jsAddSlowCase(CallFrame* callFrame, JSValue v1, JSValue v2)
458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // exception for the Date exception in defaultValue()
475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue p1 = v1.toPrimitive(callFrame);
485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue p2 = v2.toPrimitive(callFrame);
498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5033fc8ca0ce504ea94c9b038e11968187fc10d13eSteve Block    if (p1.isString()) {
5133fc8ca0ce504ea94c9b038e11968187fc10d13eSteve Block        return p2.isString()
5233fc8ca0ce504ea94c9b038e11968187fc10d13eSteve Block            ? jsString(callFrame, asString(p1), asString(p2))
5333fc8ca0ce504ea94c9b038e11968187fc10d13eSteve Block            : jsString(callFrame, asString(p1), p2.toString(callFrame));
548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
5533fc8ca0ce504ea94c9b038e11968187fc10d13eSteve Block    if (p2.isString())
5633fc8ca0ce504ea94c9b038e11968187fc10d13eSteve Block        return jsString(callFrame, p1.toString(callFrame), asString(p2));
578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
58e14391e94c850b8bd03680c23b38978db68687a8John Reck    return jsNumber(p1.toNumber(callFrame) + p2.toNumber(callFrame));
598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
615f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue jsTypeStringForValue(CallFrame* callFrame, JSValue v)
628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isUndefined())
648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return jsNontrivialString(callFrame, "undefined");
658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isBoolean())
668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return jsNontrivialString(callFrame, "boolean");
678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isNumber())
688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return jsNontrivialString(callFrame, "number");
698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isString())
708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return jsNontrivialString(callFrame, "string");
718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isObject()) {
728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Return "undefined" for objects that should be treated
738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // as null when doing comparisons.
748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined())
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return jsNontrivialString(callFrame, "undefined");
768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        CallData callData;
778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->getCallData(callData) != CallTypeNone)
788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return jsNontrivialString(callFrame, "function");
798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return jsNontrivialString(callFrame, "object");
818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool jsIsObjectType(JSValue v)
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (!v.isCell())
868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return v.isNull();
878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
88e14391e94c850b8bd03680c23b38978db68687a8John Reck    JSType type = v.asCell()->structure()->typeInfo().type();
898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (type == NumberType || type == StringType)
908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return false;
918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (type == ObjectType) {
928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined())
938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return false;
948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        CallData callData;
958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->getCallData(callData) != CallTypeNone)
968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return false;
978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return true;
998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool jsIsFunctionType(JSValue v)
1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isObject()) {
1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        CallData callData;
1058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->getCallData(callData) != CallTypeNone)
1068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return true;
1078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
1088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return false;
1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
112