Title: [100195] trunk/Source/_javascript_Core
Revision
100195
Author
msab...@apple.com
Date
2011-11-14 14:42:36 -0800 (Mon, 14 Nov 2011)

Log Message

Towards 8 bit strings - Add 8 bit paths to StringImpl methods
https://bugs.webkit.org/show_bug.cgi?id=72290

Added 8 bit patchs to StringImpl to number and find methods.

Reviewed by Oliver Hunt.

* wtf/text/StringImpl.cpp:
(WTF::StringImpl::toIntStrict):
(WTF::StringImpl::toUIntStrict):
(WTF::StringImpl::toInt64Strict):
(WTF::StringImpl::toUInt64Strict):
(WTF::StringImpl::toIntPtrStrict):
(WTF::StringImpl::toInt):
(WTF::StringImpl::toUInt):
(WTF::StringImpl::toInt64):
(WTF::StringImpl::toUInt64):
(WTF::StringImpl::toIntPtr):
(WTF::StringImpl::toDouble):
(WTF::StringImpl::toFloat):
(WTF::StringImpl::find):
(WTF::StringImpl::reverseFind):
* wtf/text/WTFString.cpp:
(WTF::toIntegralType):
(WTF::lengthOfCharactersAsInteger):
(WTF::charactersToIntStrict):
(WTF::charactersToUIntStrict):
(WTF::charactersToInt64Strict):
(WTF::charactersToUInt64Strict):
(WTF::charactersToIntPtrStrict):
(WTF::charactersToInt):
(WTF::charactersToUInt):
(WTF::charactersToInt64):
(WTF::charactersToUInt64):
(WTF::charactersToIntPtr):
(WTF::toDoubleType):
(WTF::charactersToDouble):
(WTF::charactersToFloat):
* wtf/text/WTFString.h:
(WTF::find):
(WTF::reverseFind):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (100194 => 100195)


--- trunk/Source/_javascript_Core/ChangeLog	2011-11-14 22:39:48 UTC (rev 100194)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-11-14 22:42:36 UTC (rev 100195)
@@ -1,3 +1,47 @@
+2011-11-14  Michael Saboff  <msab...@apple.com>
+
+        Towards 8 bit strings - Add 8 bit paths to StringImpl methods
+        https://bugs.webkit.org/show_bug.cgi?id=72290
+
+        Added 8 bit patchs to StringImpl to number and find methods.
+
+        Reviewed by Oliver Hunt.
+
+        * wtf/text/StringImpl.cpp:
+        (WTF::StringImpl::toIntStrict):
+        (WTF::StringImpl::toUIntStrict):
+        (WTF::StringImpl::toInt64Strict):
+        (WTF::StringImpl::toUInt64Strict):
+        (WTF::StringImpl::toIntPtrStrict):
+        (WTF::StringImpl::toInt):
+        (WTF::StringImpl::toUInt):
+        (WTF::StringImpl::toInt64):
+        (WTF::StringImpl::toUInt64):
+        (WTF::StringImpl::toIntPtr):
+        (WTF::StringImpl::toDouble):
+        (WTF::StringImpl::toFloat):
+        (WTF::StringImpl::find):
+        (WTF::StringImpl::reverseFind):
+        * wtf/text/WTFString.cpp:
+        (WTF::toIntegralType):
+        (WTF::lengthOfCharactersAsInteger):
+        (WTF::charactersToIntStrict):
+        (WTF::charactersToUIntStrict):
+        (WTF::charactersToInt64Strict):
+        (WTF::charactersToUInt64Strict):
+        (WTF::charactersToIntPtrStrict):
+        (WTF::charactersToInt):
+        (WTF::charactersToUInt):
+        (WTF::charactersToInt64):
+        (WTF::charactersToUInt64):
+        (WTF::charactersToIntPtr):
+        (WTF::toDoubleType):
+        (WTF::charactersToDouble):
+        (WTF::charactersToFloat):
+        * wtf/text/WTFString.h:
+        (WTF::find):
+        (WTF::reverseFind):
+
 2011-11-14  Vincent Scheib  <sch...@chromium.org>
 
         Mouse Lock: Renaming to 'Pointer Lock': ENABLE Flags

Modified: trunk/Source/_javascript_Core/wtf/text/StringImpl.cpp (100194 => 100195)


--- trunk/Source/_javascript_Core/wtf/text/StringImpl.cpp	2011-11-14 22:39:48 UTC (rev 100194)
+++ trunk/Source/_javascript_Core/wtf/text/StringImpl.cpp	2011-11-14 22:42:36 UTC (rev 100195)
@@ -611,63 +611,85 @@
 
 int StringImpl::toIntStrict(bool* ok, int base)
 {
+    if (is8Bit())
+        return charactersToIntStrict(characters8(), m_length, ok, base);
     return charactersToIntStrict(characters16(), m_length, ok, base);
 }
 
 unsigned StringImpl::toUIntStrict(bool* ok, int base)
 {
+    if (is8Bit())
+        return charactersToUIntStrict(characters8(), m_length, ok, base);
     return charactersToUIntStrict(characters16(), m_length, ok, base);
 }
 
 int64_t StringImpl::toInt64Strict(bool* ok, int base)
 {
+    if (is8Bit())
+        return charactersToInt64Strict(characters8(), m_length, ok, base);
     return charactersToInt64Strict(characters16(), m_length, ok, base);
-
 }
 
 uint64_t StringImpl::toUInt64Strict(bool* ok, int base)
 {
+    if (is8Bit())
+        return charactersToUInt64Strict(characters8(), m_length, ok, base);
     return charactersToUInt64Strict(characters16(), m_length, ok, base);
 }
 
 intptr_t StringImpl::toIntPtrStrict(bool* ok, int base)
 {
+    if (is8Bit())
+        return charactersToIntPtrStrict(characters8(), m_length, ok, base);
     return charactersToIntPtrStrict(characters16(), m_length, ok, base);
 }
 
 int StringImpl::toInt(bool* ok)
 {
+    if (is8Bit())
+        return charactersToInt(characters8(), m_length, ok);
     return charactersToInt(characters16(), m_length, ok);
 }
 
 unsigned StringImpl::toUInt(bool* ok)
 {
+    if (is8Bit())
+        return charactersToUInt(characters8(), m_length, ok);
     return charactersToUInt(characters16(), m_length, ok);
 }
 
 int64_t StringImpl::toInt64(bool* ok)
 {
+    if (is8Bit())
+        return charactersToInt64(characters8(), m_length, ok);
     return charactersToInt64(characters16(), m_length, ok);
 }
 
 uint64_t StringImpl::toUInt64(bool* ok)
 {
+    if (is8Bit())
+        return charactersToUInt64(characters8(), m_length, ok);
     return charactersToUInt64(characters16(), m_length, ok);
 }
 
 intptr_t StringImpl::toIntPtr(bool* ok)
 {
+    if (is8Bit())
+        return charactersToIntPtr(characters8(), m_length, ok);
     return charactersToIntPtr(characters16(), m_length, ok);
-
 }
 
 double StringImpl::toDouble(bool* ok, bool* didReadNumber)
 {
+    if (is8Bit())
+        return charactersToDouble(characters8(), m_length, ok, didReadNumber);
     return charactersToDouble(characters16(), m_length, ok, didReadNumber);
 }
 
 float StringImpl::toFloat(bool* ok, bool* didReadNumber)
 {
+    if (is8Bit())
+        return charactersToFloat(characters8(), m_length, ok, didReadNumber);
     return charactersToFloat(characters16(), m_length, ok, didReadNumber);
 }
 
@@ -723,11 +745,15 @@
 
 size_t StringImpl::find(UChar c, unsigned start)
 {
+    if (is8Bit())
+        return WTF::find(characters8(), m_length, c, start);
     return WTF::find(characters16(), m_length, c, start);
 }
 
 size_t StringImpl::find(CharacterMatchFunctionPtr matchFunction, unsigned start)
 {
+    if (is8Bit())
+        return WTF::find(characters8(), m_length, matchFunction, start);
     return WTF::find(characters16(), m_length, matchFunction, start);
 }
 
@@ -822,8 +848,11 @@
         return min(index, length());
 
     // Optimization 1: fast case for strings of length 1.
-    if (matchLength == 1)
-        return WTF::find(characters16(), length(), matchString->characters16()[0], index);
+    if (matchLength == 1) {
+        if (is8Bit() && matchString->is8Bit())
+            return WTF::find(characters8(), length(), matchString->characters8()[0], index);
+        return WTF::find(characters(), length(), matchString->characters()[0], index);
+    }
 
     // Check index & matchLength are in range.
     if (index > length())
@@ -891,6 +920,8 @@
 
 size_t StringImpl::reverseFind(UChar c, unsigned index)
 {
+    if (is8Bit())
+        return WTF::reverseFind(characters8(), m_length, c, index);
     return WTF::reverseFind(characters16(), m_length, c, index);
 }
 
@@ -904,8 +935,11 @@
         return min(index, length());
 
     // Optimization 1: fast case for strings of length 1.
-    if (matchLength == 1)
-        return WTF::reverseFind(characters16(), length(), matchString->characters()[0], index);
+    if (matchLength == 1) {
+        if (is8Bit() && matchString->is8Bit())
+            return WTF::reverseFind(characters8(), length(), matchString->characters8()[0], index);
+        return WTF::reverseFind(characters(), length(), matchString->characters()[0], index);
+    }
 
     // Check index & matchLength are in range.
     if (matchLength > length())

Modified: trunk/Source/_javascript_Core/wtf/text/WTFString.cpp (100194 => 100195)


--- trunk/Source/_javascript_Core/wtf/text/WTFString.cpp	2011-11-14 22:39:48 UTC (rev 100194)
+++ trunk/Source/_javascript_Core/wtf/text/WTFString.cpp	2011-11-14 22:42:36 UTC (rev 100195)
@@ -788,8 +788,8 @@
     return false;
 }
 
-template <typename IntegralType>
-static inline IntegralType toIntegralType(const UChar* data, size_t length, bool* ok, int base)
+template <typename IntegralType, typename CharType>
+static inline IntegralType toIntegralType(const CharType* data, size_t length, bool* ok, int base)
 {
     static const IntegralType integralMax = numeric_limits<IntegralType>::max();
     static const bool isSigned = numeric_limits<IntegralType>::is_signed;
@@ -823,7 +823,7 @@
     while (length && isCharacterAllowedInBase(*data, base)) {
         length--;
         IntegralType digitValue;
-        UChar c = *data;
+        CharType c = *data;
         if (isASCIIDigit(c))
             digitValue = c - '0';
         else if (c >= 'a')
@@ -864,7 +864,8 @@
     return isOk ? value : 0;
 }
 
-static unsigned lengthOfCharactersAsInteger(const UChar* data, size_t length)
+template <typename CharType>
+static unsigned lengthOfCharactersAsInteger(const CharType* data, size_t length)
 {
     size_t i = 0;
 
@@ -887,57 +888,108 @@
     return i;
 }
 
+int charactersToIntStrict(const LChar* data, size_t length, bool* ok, int base)
+{
+    return toIntegralType<int, LChar>(data, length, ok, base);
+}
+
 int charactersToIntStrict(const UChar* data, size_t length, bool* ok, int base)
 {
-    return toIntegralType<int>(data, length, ok, base);
+    return toIntegralType<int, UChar>(data, length, ok, base);
 }
 
+unsigned charactersToUIntStrict(const LChar* data, size_t length, bool* ok, int base)
+{
+    return toIntegralType<unsigned, LChar>(data, length, ok, base);
+}
+
 unsigned charactersToUIntStrict(const UChar* data, size_t length, bool* ok, int base)
 {
-    return toIntegralType<unsigned>(data, length, ok, base);
+    return toIntegralType<unsigned, UChar>(data, length, ok, base);
 }
 
+int64_t charactersToInt64Strict(const LChar* data, size_t length, bool* ok, int base)
+{
+    return toIntegralType<int64_t, LChar>(data, length, ok, base);
+}
+
 int64_t charactersToInt64Strict(const UChar* data, size_t length, bool* ok, int base)
 {
-    return toIntegralType<int64_t>(data, length, ok, base);
+    return toIntegralType<int64_t, UChar>(data, length, ok, base);
 }
 
+uint64_t charactersToUInt64Strict(const LChar* data, size_t length, bool* ok, int base)
+{
+    return toIntegralType<uint64_t, LChar>(data, length, ok, base);
+}
+
 uint64_t charactersToUInt64Strict(const UChar* data, size_t length, bool* ok, int base)
 {
-    return toIntegralType<uint64_t>(data, length, ok, base);
+    return toIntegralType<uint64_t, UChar>(data, length, ok, base);
 }
 
+intptr_t charactersToIntPtrStrict(const LChar* data, size_t length, bool* ok, int base)
+{
+    return toIntegralType<intptr_t, LChar>(data, length, ok, base);
+}
+
 intptr_t charactersToIntPtrStrict(const UChar* data, size_t length, bool* ok, int base)
 {
-    return toIntegralType<intptr_t>(data, length, ok, base);
+    return toIntegralType<intptr_t, UChar>(data, length, ok, base);
 }
 
+int charactersToInt(const LChar* data, size_t length, bool* ok)
+{
+    return toIntegralType<int, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10);
+}
+
 int charactersToInt(const UChar* data, size_t length, bool* ok)
 {
-    return toIntegralType<int>(data, lengthOfCharactersAsInteger(data, length), ok, 10);
+    return toIntegralType<int, UChar>(data, lengthOfCharactersAsInteger(data, length), ok, 10);
 }
 
+unsigned charactersToUInt(const LChar* data, size_t length, bool* ok)
+{
+    return toIntegralType<unsigned, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10);
+}
+
 unsigned charactersToUInt(const UChar* data, size_t length, bool* ok)
 {
-    return toIntegralType<unsigned>(data, lengthOfCharactersAsInteger(data, length), ok, 10);
+    return toIntegralType<unsigned, UChar>(data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10);
 }
 
+int64_t charactersToInt64(const LChar* data, size_t length, bool* ok)
+{
+    return toIntegralType<int64_t, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10);
+}
+
 int64_t charactersToInt64(const UChar* data, size_t length, bool* ok)
 {
-    return toIntegralType<int64_t>(data, lengthOfCharactersAsInteger(data, length), ok, 10);
+    return toIntegralType<int64_t, UChar>(data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10);
 }
 
+uint64_t charactersToUInt64(const LChar* data, size_t length, bool* ok)
+{
+    return toIntegralType<uint64_t, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10);
+}
+
 uint64_t charactersToUInt64(const UChar* data, size_t length, bool* ok)
 {
-    return toIntegralType<uint64_t>(data, lengthOfCharactersAsInteger(data, length), ok, 10);
+    return toIntegralType<uint64_t, UChar>(data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10);
 }
 
+intptr_t charactersToIntPtr(const LChar* data, size_t length, bool* ok)
+{
+    return toIntegralType<intptr_t, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10);
+}
+
 intptr_t charactersToIntPtr(const UChar* data, size_t length, bool* ok)
 {
-    return toIntegralType<intptr_t>(data, lengthOfCharactersAsInteger(data, length), ok, 10);
+    return toIntegralType<intptr_t, UChar>(data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10);
 }
 
-double charactersToDouble(const UChar* data, size_t length, bool* ok, bool* didReadNumber)
+template <typename CharType>
+static inline double toDoubleType(const CharType* data, size_t length, bool* ok, bool* didReadNumber)
 {
     if (!length) {
         if (ok)
@@ -961,10 +1013,26 @@
     return val;
 }
 
+double charactersToDouble(const LChar* data, size_t length, bool* ok, bool* didReadNumber)
+{
+    return toDoubleType<LChar>(data, length, ok, didReadNumber);
+}
+
+double charactersToDouble(const UChar* data, size_t length, bool* ok, bool* didReadNumber)
+{
+    return toDoubleType<UChar>(data, length, ok, didReadNumber);
+}
+
+float charactersToFloat(const LChar* data, size_t length, bool* ok, bool* didReadNumber)
+{
+    // FIXME: This will return ok even when the string fits into a double but not a float.
+    return static_cast<float>(toDoubleType<LChar>(data, length, ok, didReadNumber));
+}
+
 float charactersToFloat(const UChar* data, size_t length, bool* ok, bool* didReadNumber)
 {
     // FIXME: This will return ok even when the string fits into a double but not a float.
-    return static_cast<float>(charactersToDouble(data, length, ok, didReadNumber));
+    return static_cast<float>(toDoubleType<UChar>(data, length, ok, didReadNumber));
 }
 
 const String& emptyString()

Modified: trunk/Source/_javascript_Core/wtf/text/WTFString.h (100194 => 100195)


--- trunk/Source/_javascript_Core/wtf/text/WTFString.h	2011-11-14 22:39:48 UTC (rev 100194)
+++ trunk/Source/_javascript_Core/wtf/text/WTFString.h	2011-11-14 22:42:36 UTC (rev 100195)
@@ -55,19 +55,31 @@
 
 bool charactersAreAllASCII(const UChar*, size_t);
 bool charactersAreAllLatin1(const UChar*, size_t);
+WTF_EXPORT_PRIVATE int charactersToIntStrict(const LChar*, size_t, bool* ok = 0, int base = 10);
 WTF_EXPORT_PRIVATE int charactersToIntStrict(const UChar*, size_t, bool* ok = 0, int base = 10);
+WTF_EXPORT_PRIVATE unsigned charactersToUIntStrict(const LChar*, size_t, bool* ok = 0, int base = 10);
 WTF_EXPORT_PRIVATE unsigned charactersToUIntStrict(const UChar*, size_t, bool* ok = 0, int base = 10);
+int64_t charactersToInt64Strict(const LChar*, size_t, bool* ok = 0, int base = 10);
 int64_t charactersToInt64Strict(const UChar*, size_t, bool* ok = 0, int base = 10);
+uint64_t charactersToUInt64Strict(const LChar*, size_t, bool* ok = 0, int base = 10);
 uint64_t charactersToUInt64Strict(const UChar*, size_t, bool* ok = 0, int base = 10);
+intptr_t charactersToIntPtrStrict(const LChar*, size_t, bool* ok = 0, int base = 10);
 intptr_t charactersToIntPtrStrict(const UChar*, size_t, bool* ok = 0, int base = 10);
 
+int charactersToInt(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage
 int charactersToInt(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage
+unsigned charactersToUInt(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage
 unsigned charactersToUInt(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage
+int64_t charactersToInt64(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage
 int64_t charactersToInt64(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage
+uint64_t charactersToUInt64(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage
 uint64_t charactersToUInt64(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage
+intptr_t charactersToIntPtr(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage
 intptr_t charactersToIntPtr(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage
 
+WTF_EXPORT_PRIVATE double charactersToDouble(const LChar*, size_t, bool* ok = 0, bool* didReadNumber = 0);
 WTF_EXPORT_PRIVATE double charactersToDouble(const UChar*, size_t, bool* ok = 0, bool* didReadNumber = 0);
+float charactersToFloat(const LChar*, size_t, bool* ok = 0, bool* didReadNumber = 0);
 float charactersToFloat(const UChar*, size_t, bool* ok = 0, bool* didReadNumber = 0);
 
 template<bool isSpecialCharacter(UChar)> bool isAllSpecialCharacters(const UChar*, size_t);
@@ -409,6 +421,16 @@
 
 WTF_EXPORT_PRIVATE int codePointCompare(const String&, const String&);
 
+inline size_t find(const LChar* characters, unsigned length, LChar matchCharacter, unsigned index = 0)
+{
+    while (index < length) {
+        if (characters[index] == matchCharacter)
+            return index;
+        ++index;
+    }
+    return notFound;
+}
+
 inline size_t find(const UChar* characters, unsigned length, UChar matchCharacter, unsigned index = 0)
 {
     while (index < length) {
@@ -419,6 +441,16 @@
     return notFound;
 }
 
+inline size_t find(const LChar* characters, unsigned length, CharacterMatchFunctionPtr matchFunction, unsigned index = 0)
+{
+    while (index < length) {
+        if (matchFunction(characters[index]))
+            return index;
+        ++index;
+    }
+    return notFound;
+}
+
 inline size_t find(const UChar* characters, unsigned length, CharacterMatchFunctionPtr matchFunction, unsigned index = 0)
 {
     while (index < length) {
@@ -429,6 +461,19 @@
     return notFound;
 }
 
+inline size_t reverseFind(const LChar* characters, unsigned length, LChar matchCharacter, unsigned index = UINT_MAX)
+{
+    if (!length)
+        return notFound;
+    if (index >= length)
+        index = length - 1;
+    while (characters[index] != matchCharacter) {
+        if (!index--)
+            return notFound;
+    }
+    return index;
+}
+
 inline size_t reverseFind(const UChar* characters, unsigned length, UChar matchCharacter, unsigned index = UINT_MAX)
 {
     if (!length)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to