Title: [106257] trunk/Source/_javascript_Core
Revision
106257
Author
msab...@apple.com
Date
2012-01-30 10:51:36 -0800 (Mon, 30 Jan 2012)

Log Message

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):

Modified Paths

Diff

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*);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to