12daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/* 22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2011 Apple Inc. All rights reserved. 32daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 42daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Redistribution and use in source and binary forms, with or without 52daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * modification, are permitted provided that the following conditions 62daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * are met: 72daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 1. Redistributions of source code must retain the above copyright 82daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * notice, this list of conditions and the following disclaimer. 92daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * notice, this list of conditions and the following disclaimer in the 112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * documentation and/or other materials provided with the distribution. 122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */ 252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifndef JSValueInlineMethods_h 272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define JSValueInlineMethods_h 282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "JSValue.h" 302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochnamespace JSC { 322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ALWAYS_INLINE int32_t JSValue::toInt32(ExecState* exec) const 342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (isInt32()) 362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return asInt32(); 372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return JSC::toInt32(toNumber(exec)); 382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline uint32_t JSValue::toUInt32(ExecState* exec) const 412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // See comment on JSC::toUInt32, above. 432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return toInt32(exec); 442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isUInt32() const 472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return isInt32() && asInt32() >= 0; 492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline uint32_t JSValue::asUInt32() const 522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isUInt32()); 542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return asInt32(); 552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline double JSValue::uncheckedGetNumber() const 582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isNumber()); 602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return isInt32() ? asInt32() : asDouble(); 612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ALWAYS_INLINE JSValue JSValue::toJSNumber(ExecState* exec) const 642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return isNumber() ? asValue() : jsNumber(this->toNumber(exec)); 662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue jsNaN() 692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return JSValue(nonInlineNaN()); 712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::getNumber(double& result) const 742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (isInt32()) { 762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch result = asInt32(); 772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (isDouble()) { 802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch result = asDouble(); 812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return false; 842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::getBoolean(bool& v) const 872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (isTrue()) { 892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch v = true; 902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (isFalse()) { 932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch v = false; 942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return false; 982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(char i) 1012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<int32_t>(i)); 1032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(unsigned char i) 1062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<int32_t>(i)); 1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(short i) 1112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<int32_t>(i)); 1132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(unsigned short i) 1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<int32_t>(i)); 1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(unsigned i) 1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (static_cast<int32_t>(i) < 0) { 1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(EncodeAsDouble, static_cast<double>(i)); 1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<int32_t>(i)); 1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(long i) 1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (static_cast<int32_t>(i) != i) { 1322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(EncodeAsDouble, static_cast<double>(i)); 1332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 1342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<int32_t>(i)); 1362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(unsigned long i) 1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (static_cast<uint32_t>(i) != i) { 1412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(EncodeAsDouble, static_cast<double>(i)); 1422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<uint32_t>(i)); 1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(long long i) 1482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (static_cast<int32_t>(i) != i) { 1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(EncodeAsDouble, static_cast<double>(i)); 1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<int32_t>(i)); 1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(unsigned long long i) 1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (static_cast<uint32_t>(i) != i) { 1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(EncodeAsDouble, static_cast<double>(i)); 1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<uint32_t>(i)); 1632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(double d) 1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch const int32_t asInt32 = static_cast<int32_t>(d); 1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (asInt32 != d || (!asInt32 && signbit(d))) { // true for -0.0 1692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(EncodeAsDouble, d); 1702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 1712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *this = JSValue(static_cast<int32_t>(d)); 1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(JSVALUE32_64) 1762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline EncodedJSValue JSValue::encode(JSValue value) 1772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return value.u.asInt64; 1792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue JSValue::decode(EncodedJSValue encodedJSValue) 1822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch JSValue v; 1842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch v.u.asInt64 = encodedJSValue; 1852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return v; 1862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue() 1892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = EmptyValueTag; 1912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.payload = 0; 1922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSNullTag) 1952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = NullTag; 1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.payload = 0; 1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSUndefinedTag) 2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = UndefinedTag; 2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.payload = 0; 2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSTrueTag) 2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = BooleanTag; 2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.payload = 1; 2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSFalseTag) 2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = BooleanTag; 2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.payload = 0; 2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(HashTableDeletedValueTag) 2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = DeletedValueTag; 2212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.payload = 0; 2222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSCell* ptr) 2252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (ptr) 2272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = CellTag; 2282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else 2292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = EmptyValueTag; 2302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.payload = reinterpret_cast<int32_t>(ptr); 2312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(JSC_ZOMBIES) 2322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!isZombie()); 2332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 2342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(const JSCell* ptr) 2372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (ptr) 2392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = CellTag; 2402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else 2412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = EmptyValueTag; 2422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.payload = reinterpret_cast<int32_t>(const_cast<JSCell*>(ptr)); 2432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(JSC_ZOMBIES) 2442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!isZombie()); 2452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 2462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::operator bool() const 2492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(tag() != DeletedValueTag); 2512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return tag() != EmptyValueTag; 2522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::operator==(const JSValue& other) const 2552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.asInt64 == other.u.asInt64; 2572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::operator!=(const JSValue& other) const 2602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.asInt64 != other.u.asInt64; 2622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isUndefined() const 2652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return tag() == UndefinedTag; 2672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isNull() const 2702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return tag() == NullTag; 2722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isUndefinedOrNull() const 2752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return isUndefined() || isNull(); 2772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isCell() const 2802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return tag() == CellTag; 2822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isInt32() const 2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return tag() == Int32Tag; 2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isDouble() const 2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return tag() < LowestTag; 2922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isTrue() const 2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return tag() == BooleanTag && payload(); 2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isFalse() const 3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return tag() == BooleanTag && !payload(); 3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline uint32_t JSValue::tag() const 3052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.asBits.tag; 3072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline int32_t JSValue::payload() const 3102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.asBits.payload; 3122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline int32_t JSValue::asInt32() const 3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isInt32()); 3172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.asBits.payload; 3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline double JSValue::asDouble() const 3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isDouble()); 3232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.asDouble; 3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ALWAYS_INLINE JSCell* JSValue::asCell() const 3272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isCell()); 3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return reinterpret_cast<JSCell*>(u.asBits.payload); 3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ALWAYS_INLINE JSValue::JSValue(EncodeAsDoubleTag, double d) 3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asDouble = d; 3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(int i) 3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.tag = Int32Tag; 3402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asBits.payload = i; 3412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isNumber() const 3442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return isInt32() || isDouble(); 3462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isBoolean() const 3492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return isTrue() || isFalse(); 3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::getBoolean() const 3542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isBoolean()); 3562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return payload(); 3572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else // USE(JSVALUE32_64) 3602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // JSValue member functions. 3622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline EncodedJSValue JSValue::encode(JSValue value) 3632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return value.u.ptr; 3652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue JSValue::decode(EncodedJSValue ptr) 3682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return JSValue(reinterpret_cast<JSCell*>(ptr)); 3702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // 0x0 can never occur naturally because it has a tag of 00, indicating a pointer value, but a payload of 0x0, which is in the (invalid) zero page. 3732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue() 3742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asInt64 = ValueEmpty; 3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // 0x4 can never occur naturally because it has a tag of 00, indicating a pointer value, but a payload of 0x4, which is in the (invalid) zero page. 3792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(HashTableDeletedValueTag) 3802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asInt64 = ValueDeleted; 3822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSCell* ptr) 3852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.ptr = ptr; 3872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(JSC_ZOMBIES) 3882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!isZombie()); 3892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 3902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(const JSCell* ptr) 3932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.ptr = const_cast<JSCell*>(ptr); 3952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(JSC_ZOMBIES) 3962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!isZombie()); 3972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 3982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::operator bool() const 4012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.ptr; 4032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::operator==(const JSValue& other) const 4062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.ptr == other.u.ptr; 4082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::operator!=(const JSValue& other) const 4112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.ptr != other.u.ptr; 4132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isUndefined() const 4162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return asValue() == jsUndefined(); 4182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isNull() const 4212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return asValue() == jsNull(); 4232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isTrue() const 4262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return asValue() == JSValue(JSTrue); 4282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isFalse() const 4312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return asValue() == JSValue(JSFalse); 4332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::getBoolean() const 4362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(asValue() == jsBoolean(true) || asValue() == jsBoolean(false)); 4382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return asValue() == jsBoolean(true); 4392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline int32_t JSValue::asInt32() const 4422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isInt32()); 4442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return static_cast<int32_t>(u.asInt64); 4452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isDouble() const 4482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return isNumber() && !isInt32(); 4502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSNullTag) 4532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asInt64 = ValueNull; 4552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSUndefinedTag) 4582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asInt64 = ValueUndefined; 4602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSTrueTag) 4632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asInt64 = ValueTrue; 4652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(JSFalseTag) 4682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asInt64 = ValueFalse; 4702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isUndefinedOrNull() const 4732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Undefined and null share the same value, bar the 'undefined' bit in the extended tag. 4752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return (u.asInt64 & ~TagBitUndefined) == ValueNull; 4762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isBoolean() const 4792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return (u.asInt64 & ~1) == ValueFalse; 4812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isCell() const 4842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return !(u.asInt64 & TagMask); 4862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isInt32() const 4892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return (u.asInt64 & TagTypeNumber) == TagTypeNumber; 4912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline intptr_t reinterpretDoubleToIntptr(double value) 4942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return bitwise_cast<intptr_t>(value); 4962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline double reinterpretIntptrToDouble(intptr_t value) 4982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 4992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return bitwise_cast<double>(value); 5002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 5012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ALWAYS_INLINE JSValue::JSValue(EncodeAsDoubleTag, double d) 5032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 5042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asInt64 = reinterpretDoubleToIntptr(d) + DoubleEncodeOffset; 5052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 5062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline JSValue::JSValue(int i) 5082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 5092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch u.asInt64 = TagTypeNumber | static_cast<uint32_t>(i); 5102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 5112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline double JSValue::asDouble() const 5132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 5142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return reinterpretIntptrToDouble(u.asInt64 - DoubleEncodeOffset); 5152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 5162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::isNumber() const 5182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 5192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.asInt64 & TagTypeNumber; 5202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 5212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ALWAYS_INLINE JSCell* JSValue::asCell() const 5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 5242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isCell()); 5252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return u.ptr; 5262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 5272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif // USE(JSVALUE64) 5292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} // namespace JSC 5312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif // JSValueInlineMethods_h 533