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