Operations.cpp revision 643ca7872b450ea4efacab6188849e5aac2ba161
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 throwOutOfMemoryError(ExecState* exec)
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSObject* error = Error::create(exec, GeneralError, "Out of memory");
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    exec->setException(error);
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return error;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
515f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE JSValue jsAddSlowCase(CallFrame* callFrame, JSValue v1, JSValue v2)
528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // exception for the Date exception in defaultValue()
545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue p1 = v1.toPrimitive(callFrame);
555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue p2 = v2.toPrimitive(callFrame);
568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (p1.isString()) {
58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return p2.isString()
59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            ? jsString(callFrame, asString(p1), asString(p2))
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            : jsString(callFrame, asString(p1), p2.toString(callFrame));
618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (p2.isString())
63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return jsString(callFrame, p1.toString(callFrame), asString(p2));
648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return jsNumber(callFrame, p1.toNumber(callFrame) + p2.toNumber(callFrame));
668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
685f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue jsTypeStringForValue(CallFrame* callFrame, JSValue v)
698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isUndefined())
718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return jsNontrivialString(callFrame, "undefined");
728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isBoolean())
738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return jsNontrivialString(callFrame, "boolean");
748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isNumber())
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return jsNontrivialString(callFrame, "number");
768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isString())
778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return jsNontrivialString(callFrame, "string");
788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isObject()) {
798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Return "undefined" for objects that should be treated
808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // as null when doing comparisons.
818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined())
828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return jsNontrivialString(callFrame, "undefined");
838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        CallData callData;
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->getCallData(callData) != CallTypeNone)
858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return jsNontrivialString(callFrame, "function");
868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return jsNontrivialString(callFrame, "object");
888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool jsIsObjectType(JSValue v)
918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (!v.isCell())
938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return v.isNull();
948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    JSType type = asCell(v)->structure()->typeInfo().type();
968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (type == NumberType || type == StringType)
978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return false;
988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (type == ObjectType) {
998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined())
1008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return false;
1018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        CallData callData;
1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->getCallData(callData) != CallTypeNone)
1038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return false;
1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
1058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return true;
1068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool jsIsFunctionType(JSValue v)
1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (v.isObject()) {
1118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        CallData callData;
1128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (asObject(v)->getCallData(callData) != CallTypeNone)
1138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return true;
1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
1158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return false;
1168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
119