Changeset 49065 in webkit for trunk/JavaScriptCore/runtime/JSArray.cpp
- Timestamp:
- Oct 3, 2009, 10:01:14 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/JSArray.cpp
r48836 r49065 137 137 138 138 m_storage = static_cast<ArrayStorage*>(fastZeroedMalloc(storageSize(initialCapacity))); 139 m_storage->m_vectorLength = initialCapacity; 140 141 m_fastAccessCutoff = 0; 139 m_vectorLength = initialCapacity; 142 140 143 141 checkConsistency(); … … 151 149 m_storage = static_cast<ArrayStorage*>(fastMalloc(storageSize(initialCapacity))); 152 150 m_storage->m_length = initialLength; 153 m_ storage->m_vectorLength = initialCapacity;151 m_vectorLength = initialCapacity; 154 152 m_storage->m_numValuesInVector = 0; 155 153 m_storage->m_sparseValueMap = 0; … … 160 158 vector[i] = JSValue(); 161 159 162 m_fastAccessCutoff = 0;163 164 160 checkConsistency(); 165 161 … … 174 170 m_storage = static_cast<ArrayStorage*>(fastMalloc(storageSize(initialCapacity))); 175 171 m_storage->m_length = initialCapacity; 176 m_ storage->m_vectorLength = initialCapacity;172 m_vectorLength = initialCapacity; 177 173 m_storage->m_numValuesInVector = initialCapacity; 178 174 m_storage->m_sparseValueMap = 0; … … 183 179 m_storage->m_vector[i] = *it; 184 180 185 m_fastAccessCutoff = initialCapacity;186 187 181 checkConsistency(); 188 182 … … 208 202 } 209 203 210 if (i < storage->m_vectorLength) {204 if (i < m_vectorLength) { 211 205 JSValue& valueSlot = storage->m_vector[i]; 212 206 if (valueSlot) { … … 254 248 if (i >= m_storage->m_length) 255 249 return false; 256 if (i < m_ storage->m_vectorLength) {257 JSValue value = m_storage->m_vector[i];250 if (i < m_vectorLength) { 251 JSValue& value = m_storage->m_vector[i]; 258 252 if (value) { 259 253 descriptor.setDescriptor(value, 0); … … 306 300 } 307 301 308 if (i < m_ storage->m_vectorLength) {302 if (i < m_vectorLength) { 309 303 JSValue& valueSlot = m_storage->m_vector[i]; 310 304 if (valueSlot) { … … 314 308 } 315 309 valueSlot = value; 316 if (++m_storage->m_numValuesInVector == m_storage->m_length) 317 m_fastAccessCutoff = m_storage->m_length; 310 ++m_storage->m_numValuesInVector; 318 311 checkConsistency(); 319 312 return; … … 353 346 storage = m_storage; 354 347 storage->m_vector[i] = value; 355 if (++storage->m_numValuesInVector == storage->m_length) 356 m_fastAccessCutoff = storage->m_length; 348 ++storage->m_numValuesInVector; 357 349 checkConsistency(); 358 350 } else … … 364 356 unsigned newNumValuesInVector = storage->m_numValuesInVector + 1; 365 357 unsigned newVectorLength = increasedVectorLength(i + 1); 366 for (unsigned j = max( storage->m_vectorLength, MIN_SPARSE_ARRAY_INDEX); j < newVectorLength; ++j)358 for (unsigned j = max(m_vectorLength, MIN_SPARSE_ARRAY_INDEX); j < newVectorLength; ++j) 367 359 newNumValuesInVector += map->contains(j); 368 360 if (i >= MIN_SPARSE_ARRAY_INDEX) … … 387 379 } 388 380 389 unsigned vectorLength = storage->m_vectorLength;381 unsigned vectorLength = m_vectorLength; 390 382 391 383 Heap::heap(this)->reportExtraMemoryCost(storageSize(newVectorLength) - storageSize(vectorLength)); … … 405 397 storage->m_vector[i] = value; 406 398 407 storage->m_vectorLength = newVectorLength;399 m_vectorLength = newVectorLength; 408 400 storage->m_numValuesInVector = newNumValuesInVector; 409 401 … … 432 424 ArrayStorage* storage = m_storage; 433 425 434 if (i < storage->m_vectorLength) {426 if (i < m_vectorLength) { 435 427 JSValue& valueSlot = storage->m_vector[i]; 436 428 if (!valueSlot) { … … 440 432 valueSlot = JSValue(); 441 433 --storage->m_numValuesInVector; 442 if (m_fastAccessCutoff > i)443 m_fastAccessCutoff = i;444 434 checkConsistency(); 445 435 return true; … … 473 463 ArrayStorage* storage = m_storage; 474 464 475 unsigned usedVectorLength = min(storage->m_length, storage->m_vectorLength);465 unsigned usedVectorLength = min(storage->m_length, m_vectorLength); 476 466 for (unsigned i = 0; i < usedVectorLength; ++i) { 477 467 if (storage->m_vector[i]) … … 495 485 ArrayStorage* storage = m_storage; 496 486 497 unsigned vectorLength = storage->m_vectorLength;487 unsigned vectorLength = m_vectorLength; 498 488 ASSERT(newLength > vectorLength); 499 489 ASSERT(newLength <= MAX_STORAGE_VECTOR_INDEX); … … 504 494 505 495 Heap::heap(this)->reportExtraMemoryCost(storageSize(newVectorLength) - storageSize(vectorLength)); 506 storage->m_vectorLength = newVectorLength;496 m_vectorLength = newVectorLength; 507 497 508 498 for (unsigned i = vectorLength; i < newVectorLength; ++i) … … 522 512 523 513 if (newLength < length) { 524 if (m_fastAccessCutoff > newLength) 525 m_fastAccessCutoff = newLength; 526 527 unsigned usedVectorLength = min(length, storage->m_vectorLength); 514 unsigned usedVectorLength = min(length, m_vectorLength); 528 515 for (unsigned i = newLength; i < usedVectorLength; ++i) { 529 516 JSValue& valueSlot = storage->m_vector[i]; … … 564 551 JSValue result; 565 552 566 if ( m_fastAccessCutoff > length) {553 if (length < m_vectorLength) { 567 554 JSValue& valueSlot = m_storage->m_vector[length]; 568 result = valueSlot; 569 ASSERT(result); 570 valueSlot = JSValue(); 571 --m_storage->m_numValuesInVector; 572 m_fastAccessCutoff = length; 573 } else if (length < m_storage->m_vectorLength) { 574 JSValue& valueSlot = m_storage->m_vector[length]; 575 result = valueSlot; 576 valueSlot = JSValue(); 577 if (result) 555 if (valueSlot) { 578 556 --m_storage->m_numValuesInVector; 579 else 557 result = valueSlot; 558 valueSlot = JSValue(); 559 } else 580 560 result = jsUndefined(); 581 561 } else { … … 605 585 checkConsistency(); 606 586 607 if (m_storage->m_length < m_storage->m_vectorLength) { 608 ASSERT(!m_storage->m_vector[m_storage->m_length]); 587 if (m_storage->m_length < m_vectorLength) { 609 588 m_storage->m_vector[m_storage->m_length] = value; 610 if (++m_storage->m_numValuesInVector == ++m_storage->m_length)611 m_fastAccessCutoff =m_storage->m_length;589 ++m_storage->m_numValuesInVector; 590 ++m_storage->m_length; 612 591 checkConsistency(); 613 592 return; … … 619 598 if (increaseVectorLength(m_storage->m_length + 1)) { 620 599 m_storage->m_vector[m_storage->m_length] = value; 621 if (++m_storage->m_numValuesInVector == ++m_storage->m_length)622 m_fastAccessCutoff =m_storage->m_length;600 ++m_storage->m_numValuesInVector; 601 ++m_storage->m_length; 623 602 checkConsistency(); 624 603 return; … … 838 817 return; 839 818 840 unsigned usedVectorLength = min(m_storage->m_length, m_ storage->m_vectorLength);819 unsigned usedVectorLength = min(m_storage->m_length, m_vectorLength); 841 820 842 821 AVLTree<AVLTreeAbstractorForArrayCompare, 44> tree; // Depth 44 is enough for 2^31 items … … 887 866 if (SparseArrayValueMap* map = m_storage->m_sparseValueMap) { 888 867 newUsedVectorLength += map->size(); 889 if (newUsedVectorLength > m_ storage->m_vectorLength) {868 if (newUsedVectorLength > m_vectorLength) { 890 869 // Check that it is possible to allocate an array large enough to hold all the entries. 891 870 if ((newUsedVectorLength > MAX_STORAGE_VECTOR_LENGTH) || !increaseVectorLength(newUsedVectorLength)) { … … 927 906 m_storage->m_vector[i] = JSValue(); 928 907 929 m_fastAccessCutoff = newUsedVectorLength;930 908 m_storage->m_numValuesInVector = newUsedVectorLength; 931 909 … … 935 913 void JSArray::fillArgList(ExecState* exec, MarkedArgumentBuffer& args) 936 914 { 937 unsigned fastAccessLength = min(m_storage->m_length, m_fastAccessCutoff); 915 JSValue* vector = m_storage->m_vector; 916 unsigned vectorEnd = min(m_storage->m_length, m_vectorLength); 938 917 unsigned i = 0; 939 for (; i < fastAccessLength; ++i) 940 args.append(getIndex(i)); 918 for (; i < vectorEnd; ++i) { 919 JSValue& v = vector[i]; 920 if (!v) 921 break; 922 args.append(v); 923 } 924 941 925 for (; i < m_storage->m_length; ++i) 942 926 args.append(get(exec, i)); … … 947 931 ASSERT(m_storage->m_length == maxSize); 948 932 UNUSED_PARAM(maxSize); 949 unsigned fastAccessLength = min(m_storage->m_length, m_fastAccessCutoff); 933 JSValue* vector = m_storage->m_vector; 934 unsigned vectorEnd = min(m_storage->m_length, m_vectorLength); 950 935 unsigned i = 0; 951 for (; i < fastAccessLength; ++i) 952 buffer[i] = getIndex(i); 953 uint32_t size = m_storage->m_length; 954 for (; i < size; ++i) 936 for (; i < vectorEnd; ++i) { 937 JSValue& v = vector[i]; 938 if (!v) 939 break; 940 buffer[i] = v; 941 } 942 943 for (; i < m_storage->m_length; ++i) 955 944 buffer[i] = get(exec, i); 956 945 } … … 962 951 ArrayStorage* storage = m_storage; 963 952 964 unsigned usedVectorLength = min(m_storage->m_length, storage->m_vectorLength);953 unsigned usedVectorLength = min(m_storage->m_length, m_vectorLength); 965 954 966 955 unsigned numDefined = 0; … … 986 975 if (SparseArrayValueMap* map = storage->m_sparseValueMap) { 987 976 newUsedVectorLength += map->size(); 988 if (newUsedVectorLength > storage->m_vectorLength) {977 if (newUsedVectorLength > m_vectorLength) { 989 978 // Check that it is possible to allocate an array large enough to hold all the entries - if not, 990 979 // exception is thrown by caller. … … 1007 996 storage->m_vector[i] = JSValue(); 1008 997 1009 m_fastAccessCutoff = newUsedVectorLength;1010 998 storage->m_numValuesInVector = newUsedVectorLength; 1011 999 … … 1033 1021 ASSERT(!m_storage->m_sparseValueMap); 1034 1022 1035 ASSERT(m_fastAccessCutoff <= m_storage->m_length);1036 ASSERT(m_fastAccessCutoff <= m_storage->m_numValuesInVector);1037 1038 1023 unsigned numValuesInVector = 0; 1039 for (unsigned i = 0; i < m_ storage->m_vectorLength; ++i) {1024 for (unsigned i = 0; i < m_vectorLength; ++i) { 1040 1025 if (JSValue value = m_storage->m_vector[i]) { 1041 1026 ASSERT(i < m_storage->m_length); … … 1044 1029 ++numValuesInVector; 1045 1030 } else { 1046 ASSERT(i >= m_fastAccessCutoff);1047 1031 if (type == SortConsistencyCheck) 1048 1032 ASSERT(i >= m_storage->m_numValuesInVector); … … 1050 1034 } 1051 1035 ASSERT(numValuesInVector == m_storage->m_numValuesInVector); 1036 ASSERT(numValuesInVector <= m_storage->m_length); 1052 1037 1053 1038 if (m_storage->m_sparseValueMap) { … … 1056 1041 unsigned index = it->first; 1057 1042 ASSERT(index < m_storage->m_length); 1058 ASSERT(index >= m_ storage->m_vectorLength);1043 ASSERT(index >= m_vectorLength); 1059 1044 ASSERT(index <= MAX_ARRAY_INDEX); 1060 1045 ASSERT(it->second);
Note:
See TracChangeset
for help on using the changeset viewer.