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