Modified: trunk/Source/_javascript_Core/ChangeLog (106256 => 106257)
--- trunk/Source/_javascript_Core/ChangeLog 2012-01-30 18:36:18 UTC (rev 106256)
+++ trunk/Source/_javascript_Core/ChangeLog 2012-01-30 18:51:36 UTC (rev 106257)
@@ -1,3 +1,24 @@
+2012-01-30 Michael Saboff <msab...@apple.com>
+
+ stringProtoFuncReplace converts 8 bit strings to 16 bit during replacement
+ https://bugs.webkit.org/show_bug.cgi?id=76651
+
+ Reviewed by Geoffrey Garen.
+
+ Made local function substituteBackreferencesSlow a template function
+ based on character width. Cleaned up getCharacters() in both UString
+ and StringImpl. Changed getCharacters<UChar> to up convert an 8 bit
+ string to 16 bits if necessary.
+
+ * runtime/StringPrototype.cpp:
+ (JSC::substituteBackreferencesSlow):
+ (JSC::substituteBackreferences):
+ * runtime/UString.h:
+ (JSC::LChar):
+ (JSC::UChar):
+ * wtf/text/StringImpl.h:
+ (WTF::UChar):
+
2012-01-30 Gavin Barraclough <barraclo...@apple.com>
Clean up putDirect
Modified: trunk/Source/_javascript_Core/runtime/StringPrototype.cpp (106256 => 106257)
--- trunk/Source/_javascript_Core/runtime/StringPrototype.cpp 2012-01-30 18:36:18 UTC (rev 106256)
+++ trunk/Source/_javascript_Core/runtime/StringPrototype.cpp 2012-01-30 18:51:36 UTC (rev 106257)
@@ -170,9 +170,10 @@
return jsString(exec, string);
}
+template <typename CharType>
static NEVER_INLINE UString substituteBackreferencesSlow(const UString& replacement, const UString& source, const int* ovector, RegExp* reg, size_t i)
{
- Vector<UChar> substitutedReplacement;
+ Vector<CharType> substitutedReplacement;
int offset = 0;
do {
if (i + 1 == replacement.length())
@@ -182,7 +183,7 @@
if (ref == '$') {
// "$$" -> "$"
++i;
- substitutedReplacement.append(replacement.characters() + offset, i - offset);
+ substitutedReplacement.append(replacement.getCharacters<CharType>() + offset, i - offset);
offset = i + 1;
continue;
}
@@ -222,15 +223,15 @@
continue;
if (i - offset)
- substitutedReplacement.append(replacement.characters() + offset, i - offset);
+ substitutedReplacement.append(replacement.getCharacters<CharType>() + offset, i - offset);
i += 1 + advance;
offset = i + 1;
if (backrefStart >= 0)
- substitutedReplacement.append(source.characters() + backrefStart, backrefLength);
+ substitutedReplacement.append(source.getCharacters<CharType>() + backrefStart, backrefLength);
} while ((i = replacement.find('$', i + 1)) != notFound);
if (replacement.length() - offset)
- substitutedReplacement.append(replacement.characters() + offset, replacement.length() - offset);
+ substitutedReplacement.append(replacement.getCharacters<CharType>() + offset, replacement.length() - offset);
substitutedReplacement.shrinkToFit();
return UString::adopt(substitutedReplacement);
@@ -239,8 +240,11 @@
static inline UString substituteBackreferences(const UString& replacement, const UString& source, const int* ovector, RegExp* reg)
{
size_t i = replacement.find('$', 0);
- if (UNLIKELY(i != notFound))
- return substituteBackreferencesSlow(replacement, source, ovector, reg, i);
+ if (UNLIKELY(i != notFound)) {
+ if (replacement.is8Bit() && source.is8Bit())
+ return substituteBackreferencesSlow<LChar>(replacement, source, ovector, reg, i);
+ return substituteBackreferencesSlow<UChar>(replacement, source, ovector, reg, i);
+ }
return replacement;
}
Modified: trunk/Source/_javascript_Core/runtime/UString.h (106256 => 106257)
--- trunk/Source/_javascript_Core/runtime/UString.h 2012-01-30 18:36:18 UTC (rev 106256)
+++ trunk/Source/_javascript_Core/runtime/UString.h 2012-01-30 18:51:36 UTC (rev 106257)
@@ -139,18 +139,10 @@
};
template<>
-inline const LChar* UString::getCharacters<LChar>() const
-{
- ASSERT(is8Bit());
- return characters8();
-}
+inline const LChar* UString::getCharacters<LChar>() const { return characters8(); }
template<>
-inline const UChar* UString::getCharacters<UChar>() const
-{
- ASSERT(!is8Bit());
- return characters16();
-}
+inline const UChar* UString::getCharacters<UChar>() const { return characters(); }
NEVER_INLINE bool equalSlowCase(const UString& s1, const UString& s2);
Modified: trunk/Source/_javascript_Core/wtf/text/StringImpl.h (106256 => 106257)
--- trunk/Source/_javascript_Core/wtf/text/StringImpl.h 2012-01-30 18:36:18 UTC (rev 106256)
+++ trunk/Source/_javascript_Core/wtf/text/StringImpl.h 2012-01-30 18:51:36 UTC (rev 106257)
@@ -550,7 +550,7 @@
ALWAYS_INLINE const LChar* StringImpl::getCharacters<LChar>() const { return characters8(); }
template <>
-ALWAYS_INLINE const UChar* StringImpl::getCharacters<UChar>() const { return characters16(); }
+ALWAYS_INLINE const UChar* StringImpl::getCharacters<UChar>() const { return characters(); }
WTF_EXPORT_PRIVATE bool equal(const StringImpl*, const StringImpl*);
WTF_EXPORT_PRIVATE bool equal(const StringImpl*, const LChar*);