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