void JSRopeString::resolveRope(ExecState* exec) const { ASSERT(isRope()); if (is8Bit()) { LChar* buffer; if (RefPtr<StringImpl> newImpl = StringImpl::tryCreateUninitialized(m_length, buffer)) { Heap::heap(this)->reportExtraMemoryCost(newImpl->cost()); m_value = newImpl.release(); } else { outOfMemory(exec); return; } for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) { if (m_fibers[i]->isRope()) return resolveRopeSlowCase8(buffer); } LChar* position = buffer; for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) { StringImpl* string = m_fibers[i]->m_value.impl(); unsigned length = string->length(); StringImpl::copyChars(position, string->characters8(), length); position += length; m_fibers[i].clear(); } ASSERT((buffer + m_length) == position); ASSERT(!isRope()); return; } UChar* buffer; if (RefPtr<StringImpl> newImpl = StringImpl::tryCreateUninitialized(m_length, buffer)) { Heap::heap(this)->reportExtraMemoryCost(newImpl->cost()); m_value = newImpl.release(); } else { outOfMemory(exec); return; } for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) { if (m_fibers[i]->isRope()) return resolveRopeSlowCase(buffer); } UChar* position = buffer; for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) { StringImpl* string = m_fibers[i]->m_value.impl(); unsigned length = string->length(); StringImpl::copyChars(position, string->characters(), length); position += length; m_fibers[i].clear(); } ASSERT((buffer + m_length) == position); ASSERT(!isRope()); }
void JSRopeString::resolveRopeInternal8NoSubstring(LChar* buffer) const { for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) { if (fiber(i)->isRope()) { resolveRopeSlowCase8(buffer); return; } } LChar* position = buffer; for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) { const StringImpl& fiberString = *fiber(i)->m_value.impl(); unsigned length = fiberString.length(); StringImpl::copyChars(position, fiberString.characters8(), length); position += length; } ASSERT((buffer + length()) == position); }