18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2001 Peter Kelly (pmk@post.com) 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Apple Inc. All rights reserved. 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef JSValue_h 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define JSValue_h 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <math.h> 27231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <stddef.h> // for size_t 28231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <stdint.h> 295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/AlwaysInline.h> 300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/Assertions.h> 310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/HashTraits.h> 320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/MathExtras.h> 332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/StdLibExtras.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch extern const double NaN; 382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch extern const double Inf; 392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 40545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch class ExecState; 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class Identifier; 42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class JSCell; 435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian class JSGlobalData; 442bde8e466a4451c7319e3a072d118917957d6554Steve Block class JSGlobalObject; 45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class JSObject; 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class JSString; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class PropertySlot; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class PutPropertySlot; 49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class UString; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project struct ClassInfo; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project struct Instruction; 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block template <class T> class WriteBarrierBase; 552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum PreferredPrimitiveType { NoPreference, PreferNumber, PreferString }; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 582bde8e466a4451c7319e3a072d118917957d6554Steve Block 590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64) 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch typedef int64_t EncodedJSValue; 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian typedef void* EncodedJSValue; 630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 642bde8e466a4451c7319e3a072d118917957d6554Steve Block 652bde8e466a4451c7319e3a072d118917957d6554Steve Block union EncodedValueDescriptor { 662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int64_t asInt64; 672bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(JSVALUE32_64) 682bde8e466a4451c7319e3a072d118917957d6554Steve Block double asDouble; 692bde8e466a4451c7319e3a072d118917957d6554Steve Block#elif USE(JSVALUE64) 702bde8e466a4451c7319e3a072d118917957d6554Steve Block JSCell* ptr; 712bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 722bde8e466a4451c7319e3a072d118917957d6554Steve Block 732bde8e466a4451c7319e3a072d118917957d6554Steve Block#if CPU(BIG_ENDIAN) 742bde8e466a4451c7319e3a072d118917957d6554Steve Block struct { 752bde8e466a4451c7319e3a072d118917957d6554Steve Block int32_t tag; 762bde8e466a4451c7319e3a072d118917957d6554Steve Block int32_t payload; 772bde8e466a4451c7319e3a072d118917957d6554Steve Block } asBits; 782bde8e466a4451c7319e3a072d118917957d6554Steve Block#else 792bde8e466a4451c7319e3a072d118917957d6554Steve Block struct { 802bde8e466a4451c7319e3a072d118917957d6554Steve Block int32_t payload; 812bde8e466a4451c7319e3a072d118917957d6554Steve Block int32_t tag; 822bde8e466a4451c7319e3a072d118917957d6554Steve Block } asBits; 832bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 842bde8e466a4451c7319e3a072d118917957d6554Steve Block }; 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch double nonInlineNaN(); 8768513a70bcd92384395513322f1b801e7bf9c729Steve Block 8868513a70bcd92384395513322f1b801e7bf9c729Steve Block // This implements ToInt32, defined in ECMA-262 9.5. 8968513a70bcd92384395513322f1b801e7bf9c729Steve Block int32_t toInt32(double); 9068513a70bcd92384395513322f1b801e7bf9c729Steve Block 9168513a70bcd92384395513322f1b801e7bf9c729Steve Block // This implements ToUInt32, defined in ECMA-262 9.6. 9268513a70bcd92384395513322f1b801e7bf9c729Steve Block inline uint32_t toUInt32(double number) 9368513a70bcd92384395513322f1b801e7bf9c729Steve Block { 9468513a70bcd92384395513322f1b801e7bf9c729Steve Block // As commented in the spec, the operation of ToInt32 and ToUint32 only differ 9568513a70bcd92384395513322f1b801e7bf9c729Steve Block // in how the result is interpreted; see NOTEs in sections 9.5 and 9.6. 9668513a70bcd92384395513322f1b801e7bf9c729Steve Block return toInt32(number); 9768513a70bcd92384395513322f1b801e7bf9c729Steve Block } 98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian class JSValue { 1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch friend struct EncodedJSValueHashTraits; 1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch friend class JIT; 1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch friend class JITStubs; 1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch friend class JITStubCall; 10421939df44de1705786c545cd1bf519d47250322dBen Murdoch friend class JSInterfaceJIT; 10521939df44de1705786c545cd1bf519d47250322dBen Murdoch friend class SpecializedThunkJIT; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static EncodedJSValue encode(JSValue); 1092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static JSValue decode(EncodedJSValue); 1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian enum JSNullTag { JSNull }; 1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian enum JSUndefinedTag { JSUndefined }; 1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian enum JSTrueTag { JSTrue }; 1145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian enum JSFalseTag { JSFalse }; 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block enum EncodeAsDoubleTag { EncodeAsDouble }; 1165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue(); 1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue(JSNullTag); 1195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue(JSUndefinedTag); 1205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue(JSTrueTag); 1215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue(JSFalseTag); 1225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue(JSCell* ptr); 1235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue(const JSCell* ptr); 1245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Numbers 126e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue(EncodeAsDoubleTag, double); 127e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(double); 128e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(char); 129e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(unsigned char); 130e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(short); 131e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(unsigned short); 132e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(int); 133e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(unsigned); 134e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(long); 135e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(unsigned long); 136e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(long long); 137e14391e94c850b8bd03680c23b38978db68687a8John Reck explicit JSValue(unsigned long long); 1385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian operator bool() const; 1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool operator==(const JSValue& other) const; 1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool operator!=(const JSValue& other) const; 1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool isInt32() const; 1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool isUInt32() const; 1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool isDouble() const; 1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool isTrue() const; 1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool isFalse() const; 1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int32_t asInt32() const; 1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch uint32_t asUInt32() const; 1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch double asDouble() const; 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Querying the type. 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isUndefined() const; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isNull() const; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isUndefinedOrNull() const; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isBoolean() const; 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isNumber() const; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isString() const; 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isGetterSetter() const; 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isObject() const; 162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool inherits(const ClassInfo*) const; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Extracting the value. 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool getBoolean(bool&) const; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool getBoolean() const; // false if not a boolean 167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool getNumber(double&) const; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double uncheckedGetNumber() const; 169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool getString(ExecState* exec, UString&) const; 170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block UString getString(ExecState* exec) const; // null string if not a string 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObject* getObject() const; // 0 if not an object 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Extracting integer values. 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool getUInt32(uint32_t&) const; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Basic conversions. 1775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue toPrimitive(ExecState*, PreferredPrimitiveType = NoPreference) const; 1785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool getPrimitiveNumber(ExecState*, double& number, JSValue&); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool toBoolean(ExecState*) const; 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // toNumber conversion is expected to be side effect free if an exception has 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // been set in the ExecState already. 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double toNumber(ExecState*) const; 1855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue toJSNumber(ExecState*) const; // Fast path for when you expect that the value is an immediate number. 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UString toString(ExecState*) const; 187d0825bca7fe65beaee391d30da42e937db621564Steve Block UString toPrimitiveString(ExecState*) const; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObject* toObject(ExecState*) const; 1892bde8e466a4451c7319e3a072d118917957d6554Steve Block JSObject* toObject(ExecState*, JSGlobalObject*) const; 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Integer conversions. 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double toInteger(ExecState*) const; 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double toIntegerPreserveNaN(ExecState*) const; 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int32_t toInt32(ExecState*) const; 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uint32_t toUInt32(ExecState*) const; 196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(JSC_ZOMBIES) 198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool isZombie() const; 199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Floating point conversions (this is a convenience method for webcore; 202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // signle precision float is not a representation used in JS or JSC). 203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project float toFloat(ExecState* exec) const { return static_cast<float>(toNumber(exec)); } 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Object operations, with the toObject operation included. 2065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue get(ExecState*, const Identifier& propertyName) const; 2075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue get(ExecState*, const Identifier& propertyName, PropertySlot&) const; 2085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue get(ExecState*, unsigned propertyName) const; 2095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue get(ExecState*, unsigned propertyName, PropertySlot&) const; 2105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&); 211e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke void putDirect(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&); 2125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void put(ExecState*, unsigned propertyName, JSValue); 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool needsThisConversion() const; 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObject* toThisObject(ExecState*) const; 216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch JSValue toStrictThisObject(ExecState*) const; 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UString toThisString(ExecState*) const; 218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSString* toThisJSString(ExecState*) const; 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static bool equal(ExecState* exec, JSValue v1, JSValue v2); 2215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static bool equalSlowCase(ExecState* exec, JSValue v1, JSValue v2); 2225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static bool equalSlowCaseInline(ExecState* exec, JSValue v1, JSValue v2); 223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static bool strictEqual(ExecState* exec, JSValue v1, JSValue v2); 224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static bool strictEqualSlowCase(ExecState* exec, JSValue v1, JSValue v2); 225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static bool strictEqualSlowCaseInline(ExecState* exec, JSValue v1, JSValue v2); 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue getJSNumber(); // JSValue() if this is not a JSNumber or number object 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool isCell() const; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSCell* asCell() const; 231e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block bool isValidCallee(); 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NDEBUG 2340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch char* description(); 2350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block template <class T> JSValue(WriteBarrierBase<T>); 2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian enum HashTableDeletedValueTag { HashTableDeletedValue }; 2415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue(HashTableDeletedValueTag); 2425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian inline const JSValue asValue() const { return *this; } 2442bde8e466a4451c7319e3a072d118917957d6554Steve Block JSObject* toObjectSlowCase(ExecState*, JSGlobalObject*) const; 2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSObject* toThisObjectSlowCase(ExecState*) const; 2460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 24721939df44de1705786c545cd1bf519d47250322dBen Murdoch JSObject* synthesizePrototype(ExecState*) const; 24821939df44de1705786c545cd1bf519d47250322dBen Murdoch JSObject* synthesizeObject(ExecState*) const; 24921939df44de1705786c545cd1bf519d47250322dBen Murdoch 25021939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(JSVALUE32_64) 2512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch /* 2522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * On 32-bit platforms USE(JSVALUE32_64) should be defined, and we use a NaN-encoded 2532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * form for immediates. 2542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 2552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * The encoding makes use of unused NaN space in the IEEE754 representation. Any value 2562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * with the top 13 bits set represents a QNaN (with the sign bit set). QNaN values 2572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * can encode a 51-bit payload. Hardware produced and C-library payloads typically 2582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * have a payload of zero. We assume that non-zero payloads are available to encode 2592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * pointer and integer values. Since any 64-bit bit pattern where the top 15 bits are 2602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * all set represents a NaN with a non-zero payload, we can use this space in the NaN 2612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * ranges to encode other values (however there are also other ranges of NaN space that 2622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * could have been selected). 2632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 2642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * For JSValues that do not contain a double value, the high 32 bits contain the tag 2652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * values listed in the enums below, which all correspond to NaN-space. In the case of 2662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * cell, integer and bool values the lower 32 bits (the 'payload') contain the pointer 2672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * integer or boolean value; in the case of all other tags the payload is 0. 2682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */ 2692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch enum { Int32Tag = 0xffffffff }; 2702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch enum { BooleanTag = 0xfffffffe }; 2712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch enum { NullTag = 0xfffffffd }; 2722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch enum { UndefinedTag = 0xfffffffc }; 2732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch enum { CellTag = 0xfffffffb }; 2742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch enum { EmptyValueTag = 0xfffffffa }; 2752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch enum { DeletedValueTag = 0xfffffff9 }; 2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch enum { LowestTag = DeletedValueTag }; 2782bde8e466a4451c7319e3a072d118917957d6554Steve Block 2790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch uint32_t tag() const; 2800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int32_t payload() const; 2812bde8e466a4451c7319e3a072d118917957d6554Steve Block#elif USE(JSVALUE64) 2822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch /* 2832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * On 64-bit platforms USE(JSVALUE64) should be defined, and we use a NaN-encoded 2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * form for immediates. 2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * The encoding makes use of unused NaN space in the IEEE754 representation. Any value 2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * with the top 13 bits set represents a QNaN (with the sign bit set). QNaN values 2882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * can encode a 51-bit payload. Hardware produced and C-library payloads typically 2892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * have a payload of zero. We assume that non-zero payloads are available to encode 2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * pointer and integer values. Since any 64-bit bit pattern where the top 15 bits are 2912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * all set represents a NaN with a non-zero payload, we can use this space in the NaN 2922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * ranges to encode other values (however there are also other ranges of NaN space that 2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * could have been selected). 2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * This range of NaN space is represented by 64-bit numbers begining with the 16-bit 2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * hex patterns 0xFFFE and 0xFFFF - we rely on the fact that no valid double-precision 2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * numbers will begin fall in these ranges. 2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * The top 16-bits denote the type of the encoded JSValue: 3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Pointer { 0000:PPPP:PPPP:PPPP 3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * / 0001:****:****:**** 3032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Double { ... 3042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * \ FFFE:****:****:**** 3052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Integer { FFFF:0000:IIII:IIII 3062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 3072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * The scheme we have implemented encodes double precision values by performing a 3082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 64-bit integer addition of the value 2^48 to the number. After this manipulation 3092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * no encoded double-precision value will begin with the pattern 0x0000 or 0xFFFF. 3102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Values must be decoded by reversing this operation before subsequent floating point 3112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * operations my be peformed. 3122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 32-bit signed integers are marked with the 16-bit tag 0xFFFF. 3142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * The tag 0x0000 denotes a pointer, or another form of tagged immediate. Boolean, 3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * null and undefined values are represented by specific, invalid pointer values: 3172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * False: 0x06 3192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * True: 0x07 3202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Undefined: 0x0a 3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Null: 0x02 3222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 3232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * These values have the following properties: 3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * - Bit 1 (TagBitTypeOther) is set for all four values, allowing real pointers to be 3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * quickly distinguished from all immediate values, including these invalid pointers. 3262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * - With bit 3 is masked out (TagBitUndefined) Undefined and Null share the 3272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * same value, allowing null & undefined to be quickly detected. 3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * No valid JSValue will have the bit pattern 0x0, this is used to represent array 3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * holes, and as a C++ 'no value' result (e.g. JSValue() has an internal value of 0). 3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */ 3322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // These values are #defines since using static const integers here is a ~1% regression! 3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // This value is 2^48, used to encode doubles such that the encoded value will begin 3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // with a 16-bit pattern within the range 0x0001..0xFFFE. 3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define DoubleEncodeOffset 0x1000000000000ll 3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // If all bits in the mask are set, this indicates an integer number, 3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // if any but not all are set this value is a double precision number. 3402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define TagTypeNumber 0xffff000000000000ll 3412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // All non-numeric (bool, null, undefined) immediates have bit 2 set. 3432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define TagBitTypeOther 0x2ll 3442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define TagBitBool 0x4ll 3452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define TagBitUndefined 0x8ll 3462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Combined integer value for non-numeric immediates. 3472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define ValueFalse (TagBitTypeOther | TagBitBool | false) 3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define ValueTrue (TagBitTypeOther | TagBitBool | true) 3492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define ValueUndefined (TagBitTypeOther | TagBitUndefined) 3502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define ValueNull (TagBitTypeOther) 3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // TagMask is used to check for all types of immediate values (either number or 'other'). 3532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define TagMask (TagTypeNumber | TagBitTypeOther) 3542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // These special values are never visible to JavaScript code; Empty is used to represent 3562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Array holes, and for uninitialized JSValues. Deleted is used in hash table code. 3572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // These values would map to cell types in the JSValue encoding, but not valid GC cell 3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // pointer should have either of these values (Empty is null, deleted is at an invalid 3592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // alignment for a GC cell, and in the zero page). 3602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define ValueEmpty 0x0ll 3612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch #define ValueDeleted 0x4ll 3622bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 3632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch EncodedValueDescriptor u; 3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch }; 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64) 3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch typedef IntHash<EncodedJSValue> EncodedJSValueHash; 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch struct EncodedJSValueHashTraits : HashTraits<EncodedJSValue> { 3710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const bool emptyValueIsZero = false; 3720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static EncodedJSValue emptyValue() { return JSValue::encode(JSValue()); } 3730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void constructDeletedValue(EncodedJSValue& slot) { slot = JSValue::encode(JSValue(JSValue::HashTableDeletedValue)); } 3740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static bool isDeletedValue(EncodedJSValue value) { return value == JSValue::encode(JSValue(JSValue::HashTableDeletedValue)); } 375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 3760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 3770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch typedef PtrHash<EncodedJSValue> EncodedJSValueHash; 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch struct EncodedJSValueHashTraits : HashTraits<EncodedJSValue> { 3805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static void constructDeletedValue(EncodedJSValue& slot) { slot = JSValue::encode(JSValue(JSValue::HashTableDeletedValue)); } 3815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static bool isDeletedValue(EncodedJSValue value) { return value == JSValue::encode(JSValue(JSValue::HashTableDeletedValue)); } 3825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian }; 3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 3845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Stand-alone helper functions. 3865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian inline JSValue jsNull() 3875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 3885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return JSValue(JSValue::JSNull); 3895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 3905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian inline JSValue jsUndefined() 3925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 3935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return JSValue(JSValue::JSUndefined); 3945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 3955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian inline JSValue jsBoolean(bool b) 3975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 3985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return b ? JSValue(JSValue::JSTrue) : JSValue(JSValue::JSFalse); 3995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 401e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsDoubleNumber(double d) 402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 403e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(JSValue::EncodeAsDouble, d); 404643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 405643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 406e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(double d) 4075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 408e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(d); 4095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 411e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(char i) 4125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 413e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 416e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(unsigned char i) 4175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 418e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 421e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(short i) 4225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 423e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 426e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(unsigned short i) 4275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 428e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 431e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(int i) 4325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 433e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 436e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(unsigned i) 4375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 438e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 441e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(long i) 4425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 443e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 446e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(unsigned long i) 4475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 448e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 451e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(long long i) 4525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 453e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 456e14391e94c850b8bd03680c23b38978db68687a8John Reck ALWAYS_INLINE JSValue jsNumber(unsigned long long i) 4575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 458e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue(i); 4595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch inline bool operator==(const JSValue a, const JSCell* b) { return a == JSValue(b); } 4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch inline bool operator==(const JSCell* a, const JSValue b) { return JSValue(a) == b; } 4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch inline bool operator!=(const JSValue a, const JSCell* b) { return a != JSValue(b); } 4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch inline bool operator!=(const JSCell* a, const JSValue b) { return JSValue(a) != b; } 4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool isZombie(const JSCell*); 46865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // JSValue_h 472