594RefPtr<StringImpl> StringImpl::upper(const AtomicString& localeIdentifier)
595{
596#if !USE(ICU_UNICODE)
597 UNUSED_PARAM(localeIdentifier);
598 return upper();
599#else
600 // Use the more-optimized code path most of the time.
601 if (!(localeIdentifier == "tr" || localeIdentifier == "az") || find('i') == notFound)
602 return upper();
603
604 if (m_length > static_cast<unsigned>(numeric_limits<int32_t>::max()))
605 CRASH();
606 int length = m_length;
607
608 const UChar* source16 = characters();
609 UChar* data16;
610 RefPtr<StringImpl> newString = createUninitialized(length, data16);
611 UErrorCode status = U_ZERO_ERROR;
612 int realLength = u_strToUpper(data16, length, source16, length, "tr", &status);
613 if (U_SUCCESS(status) && realLength == length)
614 return newString;
615 newString = createUninitialized(realLength, data16);
616 u_strToUpper(data16, realLength, source16, length, "tr", &status);
617 if (U_FAILURE(status))
618 return this;
619 return newString.release();
620#endif
621}
622
623PassRefPtr<StringImpl> StringImpl::fill(UChar character)
624{