Changeset 168254 in webkit for trunk/Source/JavaScriptCore/runtime/JSString.cpp
- Timestamp:
- May 4, 2014, 9:54:19 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/runtime/JSString.cpp
r167336 r168254 83 83 void JSRopeString::visitFibers(SlotVisitor& visitor) 84 84 { 85 for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) 86 visitor.append(&m_fibers[i]); 85 if (isSubstring()) { 86 visitor.append(&substringBase()); 87 return; 88 } 89 for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) 90 visitor.append(&fiber(i)); 87 91 } 88 92 … … 90 94 { 91 95 ASSERT(isRope()); 92 96 97 if (isSubstring()) { 98 ASSERT(!substringBase()->isRope()); 99 m_value = substringBase()->m_value.substring(substringOffset(), m_length); 100 substringBase().clear(); 101 return; 102 } 103 93 104 if (is8Bit()) { 94 105 LChar* buffer; … … 100 111 return; 101 112 } 102 103 for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {104 if ( m_fibers[i]->isRope())113 114 for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) { 115 if (fiber(i)->isRope()) 105 116 return resolveRopeSlowCase8(buffer); 106 117 } 107 118 108 119 LChar* position = buffer; 109 for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {110 StringImpl* string = m_fibers[i]->m_value.impl();120 for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) { 121 StringImpl* string = fiber(i)->m_value.impl(); 111 122 unsigned length = string->length(); 112 123 StringImpl::copyChars(position, string->characters8(), length); 113 124 position += length; 114 m_fibers[i].clear();125 fiber(i).clear(); 115 126 } 116 127 ASSERT((buffer + m_length) == position); … … 129 140 } 130 141 131 for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {132 if ( m_fibers[i]->isRope())142 for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) { 143 if (fiber(i)->isRope()) 133 144 return resolveRopeSlowCase(buffer); 134 145 } 135 146 136 147 UChar* position = buffer; 137 for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {138 StringImpl* string = m_fibers[i]->m_value.impl();148 for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) { 149 StringImpl* string = fiber(i)->m_value.impl(); 139 150 unsigned length = string->length(); 140 151 if (string->is8Bit()) … … 143 154 StringImpl::copyChars(position, string->characters16(), length); 144 155 position += length; 145 m_fibers[i].clear();156 fiber(i).clear(); 146 157 } 147 158 ASSERT((buffer + m_length) == position); … … 164 175 Vector<JSString*, 32, UnsafeVectorOverflow> workQueue; // Putting strings into a Vector is only OK because there are no GC points in this method. 165 176 166 for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {167 workQueue.append( m_fibers[i].get());177 for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) { 178 workQueue.append(fiber(i).get()); 168 179 // Clearing here works only because there are no GC points in this method. 169 m_fibers[i].clear();180 fiber(i).clear(); 170 181 } 171 182 … … 173 184 JSString* currentFiber = workQueue.last(); 174 185 workQueue.removeLast(); 175 186 187 const LChar* characters; 188 176 189 if (currentFiber->isRope()) { 177 190 JSRopeString* currentFiberAsRope = static_cast<JSRopeString*>(currentFiber); 178 for (size_t i = 0; i < s_maxInternalRopeLength && currentFiberAsRope->m_fibers[i]; ++i) 179 workQueue.append(currentFiberAsRope->m_fibers[i].get()); 180 continue; 181 } 182 183 StringImpl* string = static_cast<StringImpl*>(currentFiber->m_value.impl()); 184 unsigned length = string->length(); 191 if (!currentFiberAsRope->isSubstring()) { 192 for (size_t i = 0; i < s_maxInternalRopeLength && currentFiberAsRope->fiber(i); ++i) 193 workQueue.append(currentFiberAsRope->fiber(i).get()); 194 continue; 195 } 196 ASSERT(!currentFiberAsRope->substringBase()->isRope()); 197 characters = 198 currentFiberAsRope->substringBase()->m_value.characters8() + 199 currentFiberAsRope->substringOffset(); 200 } else 201 characters = currentFiber->m_value.characters8(); 202 203 unsigned length = currentFiber->length(); 185 204 position -= length; 186 StringImpl::copyChars(position, string->characters8(), length);205 StringImpl::copyChars(position, characters, length); 187 206 } 188 207 … … 196 215 Vector<JSString*, 32, UnsafeVectorOverflow> workQueue; // These strings are kept alive by the parent rope, so using a Vector is OK. 197 216 198 for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i)199 workQueue.append( m_fibers[i].get());217 for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) 218 workQueue.append(fiber(i).get()); 200 219 201 220 while (!workQueue.isEmpty()) { … … 205 224 if (currentFiber->isRope()) { 206 225 JSRopeString* currentFiberAsRope = static_cast<JSRopeString*>(currentFiber); 207 for (size_t i = 0; i < s_maxInternalRopeLength && currentFiberAsRope->m_fibers[i]; ++i) 208 workQueue.append(currentFiberAsRope->m_fibers[i].get()); 226 if (currentFiberAsRope->isSubstring()) { 227 ASSERT(!currentFiberAsRope->substringBase()->isRope()); 228 StringImpl* string = static_cast<StringImpl*>( 229 currentFiberAsRope->substringBase()->m_value.impl()); 230 unsigned offset = currentFiberAsRope->substringOffset(); 231 unsigned length = currentFiberAsRope->length(); 232 position -= length; 233 if (string->is8Bit()) 234 StringImpl::copyChars(position, string->characters8() + offset, length); 235 else 236 StringImpl::copyChars(position, string->characters16() + offset, length); 237 continue; 238 } 239 for (size_t i = 0; i < s_maxInternalRopeLength && currentFiberAsRope->fiber(i); ++i) 240 workQueue.append(currentFiberAsRope->fiber(i).get()); 209 241 continue; 210 242 } … … 225 257 void JSRopeString::outOfMemory(ExecState* exec) const 226 258 { 227 for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i)228 m_fibers[i].clear();259 for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) 260 u[i].string.clear(); 229 261 ASSERT(isRope()); 230 262 ASSERT(m_value.isNull());
Note:
See TracChangeset
for help on using the changeset viewer.