]>
git.saurik.com Git - apple/javascriptcore.git/blob - runtime/Identifier.h
631cf42f7edfb4f3ffeca857fe88cbe94e14e615
2 * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
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.
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.
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.
24 #include "JSGlobalData.h"
32 friend class Structure
;
36 Identifier(ExecState
* exec
, const char* s
) : _ustring(add(exec
, s
)) { } // Only to be used with string literals.
37 Identifier(ExecState
* exec
, const UChar
* s
, int length
) : _ustring(add(exec
, s
, length
)) { }
38 Identifier(ExecState
* exec
, UString::Rep
* rep
) : _ustring(add(exec
, rep
)) { }
39 Identifier(ExecState
* exec
, const UString
& s
) : _ustring(add(exec
, s
.rep())) { }
41 Identifier(JSGlobalData
* globalData
, const char* s
) : _ustring(add(globalData
, s
)) { } // Only to be used with string literals.
42 Identifier(JSGlobalData
* globalData
, const UChar
* s
, int length
) : _ustring(add(globalData
, s
, length
)) { }
43 Identifier(JSGlobalData
* globalData
, UString::Rep
* rep
) : _ustring(add(globalData
, rep
)) { }
44 Identifier(JSGlobalData
* globalData
, const UString
& s
) : _ustring(add(globalData
, s
.rep())) { }
46 // Special constructor for cases where we overwrite an object in place.
47 Identifier(PlacementNewAdoptType
) : _ustring(PlacementNewAdopt
) { }
49 const UString
& ustring() const { return _ustring
; }
51 const UChar
* data() const { return _ustring
.data(); }
52 int size() const { return _ustring
.size(); }
54 const char* ascii() const { return _ustring
.ascii(); }
56 static Identifier
from(ExecState
* exec
, unsigned y
) { return Identifier(exec
, UString::from(y
)); }
58 bool isNull() const { return _ustring
.isNull(); }
59 bool isEmpty() const { return _ustring
.isEmpty(); }
61 uint32_t toUInt32(bool* ok
) const { return _ustring
.toUInt32(ok
); }
62 uint32_t toUInt32(bool* ok
, bool tolerateEmptyString
) const { return _ustring
.toUInt32(ok
, tolerateEmptyString
); };
63 uint32_t toStrictUInt32(bool* ok
) const { return _ustring
.toStrictUInt32(ok
); }
64 unsigned toArrayIndex(bool* ok
) const { return _ustring
.toArrayIndex(ok
); }
65 double toDouble() const { return _ustring
.toDouble(); }
67 friend bool operator==(const Identifier
&, const Identifier
&);
68 friend bool operator!=(const Identifier
&, const Identifier
&);
70 friend bool operator==(const Identifier
&, const char*);
71 friend bool operator!=(const Identifier
&, const char*);
73 static void remove(UString::Rep
*);
75 static bool equal(const UString::Rep
*, const char*);
76 static bool equal(const UString::Rep
*, const UChar
*, int length
);
77 static bool equal(const UString::Rep
* a
, const UString::Rep
* b
) { return JSC::equal(a
, b
); }
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.
85 static bool equal(const Identifier
& a
, const Identifier
& b
) { return a
._ustring
.rep() == b
._ustring
.rep(); }
86 static bool equal(const Identifier
& a
, const char* b
) { return equal(a
._ustring
.rep(), b
); }
88 static PassRefPtr
<UString::Rep
> add(ExecState
*, const UChar
*, int length
);
89 static PassRefPtr
<UString::Rep
> add(JSGlobalData
*, const UChar
*, int length
);
91 static PassRefPtr
<UString::Rep
> add(ExecState
* exec
, UString::Rep
* r
)
93 if (r
->identifierTable()) {
95 checkSameIdentifierTable(exec
, r
);
99 return addSlowCase(exec
, r
);
101 static PassRefPtr
<UString::Rep
> add(JSGlobalData
* globalData
, UString::Rep
* r
)
103 if (r
->identifierTable()) {
105 checkSameIdentifierTable(globalData
, r
);
109 return addSlowCase(globalData
, r
);
112 static PassRefPtr
<UString::Rep
> addSlowCase(ExecState
*, UString::Rep
* r
);
113 static PassRefPtr
<UString::Rep
> addSlowCase(JSGlobalData
*, UString::Rep
* r
);
115 static void checkSameIdentifierTable(ExecState
*, UString::Rep
*);
116 static void checkSameIdentifierTable(JSGlobalData
*, UString::Rep
*);
119 inline bool operator==(const Identifier
& a
, const Identifier
& b
)
121 return Identifier::equal(a
, b
);
124 inline bool operator!=(const Identifier
& a
, const Identifier
& b
)
126 return !Identifier::equal(a
, b
);
129 inline bool operator==(const Identifier
& a
, const char* b
)
131 return Identifier::equal(a
, b
);
134 inline bool operator!=(const Identifier
& a
, const char* b
)
136 return !Identifier::equal(a
, b
);
139 IdentifierTable
* createIdentifierTable();
140 void deleteIdentifierTable(IdentifierTable
*);
144 #endif // Identifier_h