2 * Copyright (C) 2008, 2010 Apple Inc. All Rights Reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "SmallStrings.h"
29 #include "HeapRootVisitor.h"
30 #include "JSGlobalObject.h"
32 #include <wtf/Noncopyable.h>
33 #include <wtf/PassOwnPtr.h>
37 static inline void finalize(JSString
*& string
)
39 if (!string
|| Heap::isMarked(string
))
44 class SmallStringsStorage
{
45 WTF_MAKE_NONCOPYABLE(SmallStringsStorage
); WTF_MAKE_FAST_ALLOCATED
;
47 SmallStringsStorage();
49 StringImpl
* rep(unsigned char character
)
51 return m_reps
[character
].get();
55 static const unsigned singleCharacterStringCount
= maxSingleCharacterString
+ 1;
57 RefPtr
<StringImpl
> m_reps
[singleCharacterStringCount
];
60 SmallStringsStorage::SmallStringsStorage()
62 LChar
* characterBuffer
= 0;
63 RefPtr
<StringImpl
> baseString
= StringImpl::createUninitialized(singleCharacterStringCount
, characterBuffer
);
64 for (unsigned i
= 0; i
< singleCharacterStringCount
; ++i
) {
65 characterBuffer
[i
] = i
;
66 m_reps
[i
] = StringImpl::create(baseString
, i
, 1);
70 SmallStrings::SmallStrings()
72 #define JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE(name) , m_##name(0)
73 JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE
)
74 #undef JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE
76 COMPILE_ASSERT(singleCharacterStringCount
== sizeof(m_singleCharacterStrings
) / sizeof(m_singleCharacterStrings
[0]), IsNumCharactersConstInSyncWithClassUsage
);
78 for (unsigned i
= 0; i
< singleCharacterStringCount
; ++i
)
79 m_singleCharacterStrings
[i
] = 0;
82 SmallStrings::~SmallStrings()
86 void SmallStrings::finalizeSmallStrings()
88 finalize(m_emptyString
);
89 for (unsigned i
= 0; i
< singleCharacterStringCount
; ++i
)
90 finalize(m_singleCharacterStrings
[i
]);
91 #define JSC_COMMON_STRINGS_ATTRIBUTE_FINALIZE(name) finalize(m_##name);
92 JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_FINALIZE
)
93 #undef JSC_COMMON_STRINGS_ATTRIBUTE_FINALIZE
96 void SmallStrings::createEmptyString(JSGlobalData
* globalData
)
98 ASSERT(!m_emptyString
);
99 m_emptyString
= JSString::createHasOtherOwner(*globalData
, StringImpl::empty());
102 void SmallStrings::createSingleCharacterString(JSGlobalData
* globalData
, unsigned char character
)
105 m_storage
= adoptPtr(new SmallStringsStorage
);
106 ASSERT(!m_singleCharacterStrings
[character
]);
107 m_singleCharacterStrings
[character
] = JSString::createHasOtherOwner(*globalData
, PassRefPtr
<StringImpl
>(m_storage
->rep(character
)));
110 StringImpl
* SmallStrings::singleCharacterStringRep(unsigned char character
)
113 m_storage
= adoptPtr(new SmallStringsStorage
);
114 return m_storage
->rep(character
);
117 void SmallStrings::initialize(JSGlobalData
* globalData
, JSString
*& string
, const char* value
) const
119 string
= JSString::create(*globalData
, StringImpl::create(value
));