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)