summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/text/StringImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/text/StringImpl.cpp')
-rw-r--r--WebCore/platform/text/StringImpl.cpp58
1 files changed, 41 insertions, 17 deletions
diff --git a/WebCore/platform/text/StringImpl.cpp b/WebCore/platform/text/StringImpl.cpp
index 8bc4dde..8b749c7 100644
--- a/WebCore/platform/text/StringImpl.cpp
+++ b/WebCore/platform/text/StringImpl.cpp
@@ -205,24 +205,26 @@ bool StringImpl::containsOnlyWhitespace()
return true;
}
-PassRefPtr<StringImpl> StringImpl::substring(unsigned pos, unsigned len)
+PassRefPtr<StringImpl> StringImpl::substring(unsigned start, unsigned length)
{
- if (pos >= m_length)
+ if (start >= m_length)
return empty();
- if (len > m_length - pos)
- len = m_length - pos;
- return create(m_data + pos, len);
+ unsigned maxLength = m_length - start;
+ if (length >= maxLength) {
+ if (!start)
+ return this;
+ length = maxLength;
+ }
+ return create(m_data + start, length);
}
-PassRefPtr<StringImpl> StringImpl::substringCopy(unsigned pos, unsigned len)
+PassRefPtr<StringImpl> StringImpl::substringCopy(unsigned start, unsigned length)
{
- if (pos >= m_length)
- pos = m_length;
- if (len > m_length - pos)
- len = m_length - pos;
- if (!len)
+ start = min(start, m_length);
+ length = min(length, m_length - start);
+ if (!length)
return adoptRef(new StringImpl);
- return substring(pos, len);
+ return create(m_data + start, length);
}
UChar32 StringImpl::characterStartingAt(unsigned i)
@@ -486,6 +488,11 @@ uint64_t StringImpl::toUInt64Strict(bool* ok, int base)
return charactersToUInt64Strict(m_data, m_length, ok, base);
}
+intptr_t StringImpl::toIntPtrStrict(bool* ok, int base)
+{
+ return charactersToIntPtrStrict(m_data, m_length, ok, base);
+}
+
int StringImpl::toInt(bool* ok)
{
return charactersToInt(m_data, m_length, ok);
@@ -506,6 +513,11 @@ uint64_t StringImpl::toUInt64(bool* ok)
return charactersToUInt64(m_data, m_length, ok);
}
+intptr_t StringImpl::toIntPtr(bool* ok)
+{
+ return charactersToIntPtr(m_data, m_length, ok);
+}
+
double StringImpl::toDouble(bool* ok)
{
return charactersToDouble(m_data, m_length, ok);
@@ -527,9 +539,8 @@ static bool equal(const UChar* a, const char* b, int length)
return true;
}
-static bool equalIgnoringCase(const UChar* a, const char* b, int length)
+bool equalIgnoringCase(const UChar* a, const char* b, unsigned length)
{
- ASSERT(length >= 0);
while (length--) {
unsigned char bc = *b++;
if (foldCase(*a++) != foldCase(bc))
@@ -917,6 +928,18 @@ bool equalIgnoringCase(StringImpl* a, const char* b)
return equal && !b[length];
}
+bool equalIgnoringNullity(StringImpl* a, StringImpl* b)
+{
+ if (StringHash::equal(a, b))
+ return true;
+ if (!a && b && !b->length())
+ return true;
+ if (!b && a && !a->length())
+ return true;
+
+ return false;
+}
+
Vector<char> StringImpl::ascii()
{
Vector<char> buffer(m_length + 1);
@@ -1026,7 +1049,7 @@ PassRefPtr<StringImpl> StringImpl::create(const char* string)
#if USE(JSC)
PassRefPtr<StringImpl> StringImpl::create(const JSC::UString& str)
{
- SharedUChar* sharedBuffer = const_cast<JSC::UString*>(&str)->rep()->baseString()->sharedBuffer();
+ SharedUChar* sharedBuffer = const_cast<JSC::UString*>(&str)->rep()->sharedBuffer();
if (sharedBuffer) {
PassRefPtr<StringImpl> impl = adoptRef(new StringImpl(const_cast<UChar*>(str.data()), str.size(), AdoptBuffer()));
sharedBuffer->ref();
@@ -1038,7 +1061,7 @@ PassRefPtr<StringImpl> StringImpl::create(const JSC::UString& str)
JSC::UString StringImpl::ustring()
{
- SharedUChar* sharedBuffer = StringImpl::sharedBuffer();
+ SharedUChar* sharedBuffer = this->sharedBuffer();
if (sharedBuffer)
return JSC::UString::Rep::create(const_cast<UChar*>(m_data), m_length, sharedBuffer);
@@ -1053,7 +1076,8 @@ PassRefPtr<StringImpl> StringImpl::createWithTerminatingNullCharacter(const Stri
PassRefPtr<StringImpl> StringImpl::copy()
{
- return create(m_data, m_length);
+ // Using the constructor directly to make sure that per-thread empty string instance isn't returned.
+ return adoptRef(new StringImpl(m_data, m_length));
}
StringImpl::SharedUChar* StringImpl::sharedBuffer()