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