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