18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *  Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Library General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  along with this library; see the file COPYING.LIB.  If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef Identifier_h
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define Identifier_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSGlobalData.h"
25d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "ThreadSpecific.h"
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "UString.h"
27f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/CString.h>
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class ExecState;
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class Identifier {
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        friend class Structure;
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Identifier() { }
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Identifier(ExecState* exec, const char* s) : m_string(add(exec, s)) { } // Only to be used with string literals.
39f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Identifier(ExecState* exec, const UChar* s, int length) : m_string(add(exec, s, length)) { }
40f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Identifier(ExecState* exec, StringImpl* rep) : m_string(add(exec, rep)) { }
41f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Identifier(ExecState* exec, const UString& s) : m_string(add(exec, s.impl())) { }
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Identifier(JSGlobalData* globalData, const char* s) : m_string(add(globalData, s)) { } // Only to be used with string literals.
44f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Identifier(JSGlobalData* globalData, const UChar* s, int length) : m_string(add(globalData, s, length)) { }
45f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Identifier(JSGlobalData* globalData, StringImpl* rep) : m_string(add(globalData, rep)) { }
46f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Identifier(JSGlobalData* globalData, const UString& s) : m_string(add(globalData, s.impl())) { }
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const UString& ustring() const { return m_string; }
49f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        StringImpl* impl() const { return m_string.impl(); }
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const UChar* characters() const { return m_string.characters(); }
52f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int length() const { return m_string.length(); }
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        CString ascii() const { return m_string.ascii(); }
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static Identifier from(ExecState* exec, unsigned y);
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static Identifier from(ExecState* exec, int y);
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static Identifier from(ExecState* exec, double y);
59545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        static Identifier from(JSGlobalData*, unsigned y);
60545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        static Identifier from(JSGlobalData*, int y);
61545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        static Identifier from(JSGlobalData*, double y);
62f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
63f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static uint32_t toUInt32(const UString&, bool& ok);
64f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        uint32_t toUInt32(bool& ok) const { return toUInt32(m_string, ok); }
65f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        unsigned toArrayIndex(bool& ok) const;
66f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
67f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        bool isNull() const { return m_string.isNull(); }
68f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        bool isEmpty() const { return m_string.isEmpty(); }
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        friend bool operator==(const Identifier&, const Identifier&);
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        friend bool operator!=(const Identifier&, const Identifier&);
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        friend bool operator==(const Identifier&, const char*);
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        friend bool operator!=(const Identifier&, const char*);
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
76f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static bool equal(const StringImpl*, const char*);
77f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static bool equal(const StringImpl*, const UChar*, unsigned length);
78f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static bool equal(const StringImpl* a, const StringImpl* b) { return ::equal(a, b); }
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
80f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<StringImpl> add(ExecState*, const char*); // Only to be used with string literals.
81f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<StringImpl> add(JSGlobalData*, const char*); // Only to be used with string literals.
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
84f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        UString m_string;
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
86f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static bool equal(const Identifier& a, const Identifier& b) { return a.m_string.impl() == b.m_string.impl(); }
87f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static bool equal(const Identifier& a, const char* b) { return equal(a.m_string.impl(), b); }
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
89f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<StringImpl> add(ExecState*, const UChar*, int length);
90f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<StringImpl> add(JSGlobalData*, const UChar*, int length);
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
92f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<StringImpl> add(ExecState* exec, StringImpl* r)
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            checkCurrentIdentifierTable(exec);
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (r->isIdentifier())
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return r;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return addSlowCase(exec, r);
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
101f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<StringImpl> add(JSGlobalData* globalData, StringImpl* r)
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            checkCurrentIdentifierTable(globalData);
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (r->isIdentifier())
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return r;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return addSlowCase(globalData, r);
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
111f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<StringImpl> addSlowCase(ExecState*, StringImpl* r);
112f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<StringImpl> addSlowCase(JSGlobalData*, StringImpl* r);
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static void checkCurrentIdentifierTable(ExecState*);
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static void checkCurrentIdentifierTable(JSGlobalData*);
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline bool operator==(const Identifier& a, const Identifier& b)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return Identifier::equal(a, b);
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline bool operator!=(const Identifier& a, const Identifier& b)
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return !Identifier::equal(a, b);
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline bool operator==(const Identifier& a, const char* b)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return Identifier::equal(a, b);
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    inline bool operator!=(const Identifier& a, const char* b)
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return !Identifier::equal(a, b);
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IdentifierTable* createIdentifierTable();
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void deleteIdentifierTable(IdentifierTable*);
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
141f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    struct IdentifierRepHash : PtrHash<RefPtr<StringImpl> > {
142f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static unsigned hash(const RefPtr<StringImpl>& key) { return key->existingHash(); }
143f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static unsigned hash(StringImpl* key) { return key->existingHash(); }
144f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    };
145f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // Identifier_h
149