• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Library General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Library General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Library General Public License
15  *  along with this library; see the file COPYING.LIB.  If not, write to
16  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  *  Boston, MA 02110-1301, USA.
18  *
19  */
20 
21 #ifndef Identifier_h
22 #define Identifier_h
23 
24 #include "JSGlobalData.h"
25 #include "UString.h"
26 
27 namespace JSC {
28 
29     class ExecState;
30 
31     class Identifier {
32         friend class Structure;
33     public:
Identifier()34         Identifier() { }
35 
Identifier(ExecState * exec,const char * s)36         Identifier(ExecState* exec, const char* s) : _ustring(add(exec, s)) { } // Only to be used with string literals.
Identifier(ExecState * exec,const UChar * s,int length)37         Identifier(ExecState* exec, const UChar* s, int length) : _ustring(add(exec, s, length)) { }
Identifier(ExecState * exec,UString::Rep * rep)38         Identifier(ExecState* exec, UString::Rep* rep) : _ustring(add(exec, rep)) { }
Identifier(ExecState * exec,const UString & s)39         Identifier(ExecState* exec, const UString& s) : _ustring(add(exec, s.rep())) { }
40 
Identifier(JSGlobalData * globalData,const char * s)41         Identifier(JSGlobalData* globalData, const char* s) : _ustring(add(globalData, s)) { } // Only to be used with string literals.
Identifier(JSGlobalData * globalData,const UChar * s,int length)42         Identifier(JSGlobalData* globalData, const UChar* s, int length) : _ustring(add(globalData, s, length)) { }
Identifier(JSGlobalData * globalData,UString::Rep * rep)43         Identifier(JSGlobalData* globalData, UString::Rep* rep) : _ustring(add(globalData, rep)) { }
Identifier(JSGlobalData * globalData,const UString & s)44         Identifier(JSGlobalData* globalData, const UString& s) : _ustring(add(globalData, s.rep())) { }
45 
46         // Special constructor for cases where we overwrite an object in place.
Identifier(PlacementNewAdoptType)47         Identifier(PlacementNewAdoptType) : _ustring(PlacementNewAdopt) { }
48 
ustring()49         const UString& ustring() const { return _ustring; }
50 
data()51         const UChar* data() const { return _ustring.data(); }
size()52         int size() const { return _ustring.size(); }
53 
ascii()54         const char* ascii() const { return _ustring.ascii(); }
55 
from(ExecState * exec,unsigned y)56         static Identifier from(ExecState* exec, unsigned y) { return Identifier(exec, UString::from(y)); }
57 
isNull()58         bool isNull() const { return _ustring.isNull(); }
isEmpty()59         bool isEmpty() const { return _ustring.isEmpty(); }
60 
toUInt32(bool * ok)61         uint32_t toUInt32(bool* ok) const { return _ustring.toUInt32(ok); }
toUInt32(bool * ok,bool tolerateEmptyString)62         uint32_t toUInt32(bool* ok, bool tolerateEmptyString) const { return _ustring.toUInt32(ok, tolerateEmptyString); };
toStrictUInt32(bool * ok)63         uint32_t toStrictUInt32(bool* ok) const { return _ustring.toStrictUInt32(ok); }
toArrayIndex(bool * ok)64         unsigned toArrayIndex(bool* ok) const { return _ustring.toArrayIndex(ok); }
toDouble()65         double toDouble() const { return _ustring.toDouble(); }
66 
67         friend bool operator==(const Identifier&, const Identifier&);
68         friend bool operator!=(const Identifier&, const Identifier&);
69 
70         friend bool operator==(const Identifier&, const char*);
71         friend bool operator!=(const Identifier&, const char*);
72 
73         static void remove(UString::Rep*);
74 
75         static bool equal(const UString::Rep*, const char*);
76         static bool equal(const UString::Rep*, const UChar*, int length);
equal(const UString::Rep * a,const UString::Rep * b)77         static bool equal(const UString::Rep* a, const UString::Rep* b) { return JSC::equal(a, b); }
78 
79         static PassRefPtr<UString::Rep> add(ExecState*, const char*); // Only to be used with string literals.
80         static PassRefPtr<UString::Rep> add(JSGlobalData*, const char*); // Only to be used with string literals.
81 
82     private:
83         UString _ustring;
84 
equal(const Identifier & a,const Identifier & b)85         static bool equal(const Identifier& a, const Identifier& b) { return a._ustring.rep() == b._ustring.rep(); }
equal(const Identifier & a,const char * b)86         static bool equal(const Identifier& a, const char* b) { return equal(a._ustring.rep(), b); }
87 
88         static PassRefPtr<UString::Rep> add(ExecState*, const UChar*, int length);
89         static PassRefPtr<UString::Rep> add(JSGlobalData*, const UChar*, int length);
90 
add(ExecState * exec,UString::Rep * r)91         static PassRefPtr<UString::Rep> add(ExecState* exec, UString::Rep* r)
92         {
93             if (r->identifierTable()) {
94 #ifndef NDEBUG
95                 checkSameIdentifierTable(exec, r);
96 #endif
97                 return r;
98             }
99             return addSlowCase(exec, r);
100         }
add(JSGlobalData * globalData,UString::Rep * r)101         static PassRefPtr<UString::Rep> add(JSGlobalData* globalData, UString::Rep* r)
102         {
103             if (r->identifierTable()) {
104 #ifndef NDEBUG
105                 checkSameIdentifierTable(globalData, r);
106 #endif
107                 return r;
108             }
109             return addSlowCase(globalData, r);
110         }
111 
112         static PassRefPtr<UString::Rep> addSlowCase(ExecState*, UString::Rep* r);
113         static PassRefPtr<UString::Rep> addSlowCase(JSGlobalData*, UString::Rep* r);
114 
115         static void checkSameIdentifierTable(ExecState*, UString::Rep*);
116         static void checkSameIdentifierTable(JSGlobalData*, UString::Rep*);
117     };
118 
119     inline bool operator==(const Identifier& a, const Identifier& b)
120     {
121         return Identifier::equal(a, b);
122     }
123 
124     inline bool operator!=(const Identifier& a, const Identifier& b)
125     {
126         return !Identifier::equal(a, b);
127     }
128 
129     inline bool operator==(const Identifier& a, const char* b)
130     {
131         return Identifier::equal(a, b);
132     }
133 
134     inline bool operator!=(const Identifier& a, const char* b)
135     {
136         return !Identifier::equal(a, b);
137     }
138 
139     IdentifierTable* createIdentifierTable();
140     void deleteIdentifierTable(IdentifierTable*);
141 
142 } // namespace JSC
143 
144 #endif // Identifier_h
145