Changeset 77151 in webkit for trunk/Source/JavaScriptCore/runtime/JSArray.cpp
- Timestamp:
- Jan 31, 2011, 12:07:21 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/runtime/JSArray.cpp
r77113 r77151 189 189 m_storage->m_length = initialLength; 190 190 m_storage->m_numValuesInVector = 0; 191 JSValue* vector = m_storage->m_vector;191 WriteBarrier<Unknown>* vector = m_storage->m_vector; 192 192 for (size_t i = 0; i < initialCapacity; ++i) 193 vector[i] = JSValue();193 vector[i].clear(); 194 194 } 195 195 … … 199 199 } 200 200 201 JSArray::JSArray( NonNullPassRefPtr<Structure> structure, const ArgList& list)201 JSArray::JSArray(JSGlobalData& globalData, NonNullPassRefPtr<Structure> structure, const ArgList& list) 202 202 : JSObject(structure) 203 203 { … … 226 226 227 227 size_t i = 0; 228 JSValue* vector = m_storage->m_vector;228 WriteBarrier<Unknown>* vector = m_storage->m_vector; 229 229 ArgList::const_iterator end = list.end(); 230 230 for (ArgList::const_iterator it = list.begin(); it != end; ++it, ++i) 231 vector[i] = *it;231 vector[i].set(globalData, this, *it); 232 232 for (; i < initialStorage; i++) 233 vector[i] = JSValue();233 vector[i].clear(); 234 234 235 235 checkConsistency(); … … 258 258 259 259 if (i < m_vectorLength) { 260 JSValue& valueSlot = storage->m_vector[i];260 WriteBarrier<Unknown>& valueSlot = storage->m_vector[i]; 261 261 if (valueSlot) { 262 slot.setValueSlot( &valueSlot);262 slot.setValueSlot(valueSlot.slot()); 263 263 return true; 264 264 } … … 267 267 SparseArrayValueMap::iterator it = map->find(i); 268 268 if (it != map->end()) { 269 slot.setValueSlot( &it->second);269 slot.setValueSlot(it->second.slot()); 270 270 return true; 271 271 } … … 306 306 return false; 307 307 if (i < m_vectorLength) { 308 JSValue& value = storage->m_vector[i];308 WriteBarrier<Unknown>& value = storage->m_vector[i]; 309 309 if (value) { 310 descriptor.setDescriptor(value , 0);310 descriptor.setDescriptor(value.get(), 0); 311 311 return true; 312 312 } … … 315 315 SparseArrayValueMap::iterator it = map->find(i); 316 316 if (it != map->end()) { 317 descriptor.setDescriptor(it->second , 0);317 descriptor.setDescriptor(it->second.get(), 0); 318 318 return true; 319 319 } … … 360 360 361 361 if (i < m_vectorLength) { 362 JSValue& valueSlot = storage->m_vector[i];362 WriteBarrier<Unknown>& valueSlot = storage->m_vector[i]; 363 363 if (valueSlot) { 364 valueSlot = value;364 valueSlot.set(exec->globalData(), this, value); 365 365 checkConsistency(); 366 366 return; 367 367 } 368 valueSlot = value;368 valueSlot.set(exec->globalData(), this, value); 369 369 ++storage->m_numValuesInVector; 370 370 checkConsistency(); … … 396 396 } 397 397 398 pair<SparseArrayValueMap::iterator, bool> result = map->add(i, value); 399 if (!result.second) { // pre-existing entry 400 result.first->second = value; 398 WriteBarrier<Unknown> temp; 399 pair<SparseArrayValueMap::iterator, bool> result = map->add(i, temp); 400 result.first->second.set(exec->globalData(), this, value); 401 if (!result.second) // pre-existing entry 401 402 return; 402 }403 403 404 404 size_t capacity = map->capacity(); … … 416 416 if (increaseVectorLength(i + 1)) { 417 417 storage = m_storage; 418 storage->m_vector[i] = value;418 storage->m_vector[i].set(exec->globalData(), this, value); 419 419 ++storage->m_numValuesInVector; 420 420 checkConsistency(); … … 458 458 459 459 unsigned vectorLength = m_vectorLength; 460 JSValue* vector = storage->m_vector;460 WriteBarrier<Unknown>* vector = storage->m_vector; 461 461 462 462 if (newNumValuesInVector == storage->m_numValuesInVector + 1) { 463 463 for (unsigned j = vectorLength; j < newVectorLength; ++j) 464 vector[j] = JSValue();464 vector[j].clear(); 465 465 if (i > MIN_SPARSE_ARRAY_INDEX) 466 466 map->remove(i); 467 467 } else { 468 468 for (unsigned j = vectorLength; j < max(vectorLength, MIN_SPARSE_ARRAY_INDEX); ++j) 469 vector[j] = JSValue(); 469 vector[j].clear(); 470 JSGlobalData& globalData = exec->globalData(); 470 471 for (unsigned j = max(vectorLength, MIN_SPARSE_ARRAY_INDEX); j < newVectorLength; ++j) 471 vector[j] = map->take(j);472 vector[j].set(globalData, this, map->take(j).get()); 472 473 } 473 474 … … 477 478 storage->m_numValuesInVector = newNumValuesInVector; 478 479 479 storage->m_vector[i] = value;480 storage->m_vector[i].set(exec->globalData(), this, value); 480 481 481 482 checkConsistency(); … … 504 505 505 506 if (i < m_vectorLength) { 506 JSValue& valueSlot = storage->m_vector[i];507 WriteBarrier<Unknown>& valueSlot = storage->m_vector[i]; 507 508 if (!valueSlot) { 508 509 checkConsistency(); 509 510 return false; 510 511 } 511 valueSlot = JSValue();512 valueSlot.clear(); 512 513 --storage->m_numValuesInVector; 513 514 checkConsistency(); … … 606 607 m_storage->m_allocBase = baseStorage; 607 608 608 JSValue* vector = storage->m_vector;609 WriteBarrier<Unknown>* vector = storage->m_vector; 609 610 for (unsigned i = vectorLength; i < newVectorLength; ++i) 610 vector[i] = JSValue();611 vector[i].clear(); 611 612 612 613 m_vectorLength = newVectorLength; … … 667 668 unsigned usedVectorLength = min(length, m_vectorLength); 668 669 for (unsigned i = newLength; i < usedVectorLength; ++i) { 669 JSValue& valueSlot = storage->m_vector[i];670 WriteBarrier<Unknown>& valueSlot = storage->m_vector[i]; 670 671 bool hadValue = valueSlot; 671 valueSlot = JSValue();672 valueSlot.clear(); 672 673 storage->m_numValuesInVector -= hadValue; 673 674 } … … 707 708 708 709 if (length < m_vectorLength) { 709 JSValue& valueSlot = storage->m_vector[length];710 WriteBarrier<Unknown>& valueSlot = storage->m_vector[length]; 710 711 if (valueSlot) { 711 712 --storage->m_numValuesInVector; 712 result = valueSlot ;713 valueSlot = JSValue();713 result = valueSlot.get(); 714 valueSlot.clear(); 714 715 } else 715 716 result = jsUndefined(); … … 719 720 SparseArrayValueMap::iterator it = map->find(length); 720 721 if (it != map->end()) { 721 result = it->second ;722 result = it->second.get(); 722 723 map->remove(it); 723 724 if (map->isEmpty()) { … … 743 744 744 745 if (storage->m_length < m_vectorLength) { 745 storage->m_vector[storage->m_length] = value;746 storage->m_vector[storage->m_length].set(exec->globalData(), this, value); 746 747 ++storage->m_numValuesInVector; 747 748 ++storage->m_length; … … 755 756 if (increaseVectorLength(storage->m_length + 1)) { 756 757 storage = m_storage; 757 storage->m_vector[storage->m_length] = value;758 storage->m_vector[storage->m_length].set(exec->globalData(), this, value); 758 759 ++storage->m_numValuesInVector; 759 760 ++storage->m_length; … … 858 859 } 859 860 860 JSValue* vector = m_storage->m_vector;861 WriteBarrier<Unknown>* vector = m_storage->m_vector; 861 862 for (int i = 0; i < count; i++) 862 vector[i] = JSValue();863 vector[i].clear(); 863 864 } 864 865 … … 942 943 943 944 for (size_t i = 0; i < lengthNotIncludingUndefined; i++) { 944 JSValue value = storage->m_vector[i] ;945 JSValue value = storage->m_vector[i].get(); 945 946 ASSERT(!value.isUndefined()); 946 947 values[i].first = value; … … 975 976 if (storage->m_length < lengthNotIncludingUndefined) 976 977 storage->m_length = lengthNotIncludingUndefined; 977 978 979 JSGlobalData& globalData = exec->globalData(); 978 980 for (size_t i = 0; i < lengthNotIncludingUndefined; i++) 979 storage->m_vector[i] = values[i].first;981 storage->m_vector[i].set(globalData, this, values[i].first); 980 982 981 983 Heap::heap(this)->popTempSortVector(&values); … … 1106 1108 // Iterate over the array, ignoring missing values, counting undefined ones, and inserting all other ones into the tree. 1107 1109 for (; numDefined < usedVectorLength; ++numDefined) { 1108 JSValue v = storage->m_vector[numDefined] ;1110 JSValue v = storage->m_vector[numDefined].get(); 1109 1111 if (!v || v.isUndefined()) 1110 1112 break; … … 1113 1115 } 1114 1116 for (unsigned i = numDefined; i < usedVectorLength; ++i) { 1115 JSValue v = storage->m_vector[i] ;1117 JSValue v = storage->m_vector[i].get(); 1116 1118 if (v) { 1117 1119 if (v.isUndefined()) … … 1141 1143 SparseArrayValueMap::iterator end = map->end(); 1142 1144 for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it) { 1143 tree.abstractor().m_nodes[numDefined].value = it->second ;1145 tree.abstractor().m_nodes[numDefined].value = it->second.get(); 1144 1146 tree.insert(numDefined); 1145 1147 ++numDefined; … … 1158 1160 AVLTree<AVLTreeAbstractorForArrayCompare, 44>::Iterator iter; 1159 1161 iter.start_iter_least(tree); 1162 JSGlobalData& globalData = exec->globalData(); 1160 1163 for (unsigned i = 0; i < numDefined; ++i) { 1161 storage->m_vector[i] = tree.abstractor().m_nodes[*iter].value;1164 storage->m_vector[i].set(globalData, this, tree.abstractor().m_nodes[*iter].value); 1162 1165 ++iter; 1163 1166 } … … 1165 1168 // Put undefined values back in. 1166 1169 for (unsigned i = numDefined; i < newUsedVectorLength; ++i) 1167 storage->m_vector[i] = jsUndefined();1170 storage->m_vector[i].setUndefined(); 1168 1171 1169 1172 // Ensure that unused values in the vector are zeroed out. 1170 1173 for (unsigned i = newUsedVectorLength; i < usedVectorLength; ++i) 1171 storage->m_vector[i] = JSValue();1174 storage->m_vector[i].clear(); 1172 1175 1173 1176 storage->m_numValuesInVector = newUsedVectorLength; … … 1180 1183 ArrayStorage* storage = m_storage; 1181 1184 1182 JSValue* vector = storage->m_vector;1185 WriteBarrier<Unknown>* vector = storage->m_vector; 1183 1186 unsigned vectorEnd = min(storage->m_length, m_vectorLength); 1184 1187 unsigned i = 0; 1185 1188 for (; i < vectorEnd; ++i) { 1186 JSValue& v = vector[i];1189 WriteBarrier<Unknown>& v = vector[i]; 1187 1190 if (!v) 1188 1191 break; 1189 args.append(v );1192 args.append(v.get()); 1190 1193 } 1191 1194 … … 1198 1201 ASSERT(m_storage->m_length >= maxSize); 1199 1202 UNUSED_PARAM(maxSize); 1200 JSValue* vector = m_storage->m_vector;1203 WriteBarrier<Unknown>* vector = m_storage->m_vector; 1201 1204 unsigned vectorEnd = min(maxSize, m_vectorLength); 1202 1205 unsigned i = 0; 1203 1206 for (; i < vectorEnd; ++i) { 1204 JSValue& v = vector[i];1207 WriteBarrier<Unknown>& v = vector[i]; 1205 1208 if (!v) 1206 1209 break; 1207 buffer[i] = v ;1210 buffer[i] = v.get(); 1208 1211 } 1209 1212 … … 1224 1227 1225 1228 for (; numDefined < usedVectorLength; ++numDefined) { 1226 JSValue v = storage->m_vector[numDefined] ;1229 JSValue v = storage->m_vector[numDefined].get(); 1227 1230 if (!v || v.isUndefined()) 1228 1231 break; 1229 1232 } 1233 1230 1234 for (unsigned i = numDefined; i < usedVectorLength; ++i) { 1231 JSValue v = storage->m_vector[i] ;1235 JSValue v = storage->m_vector[i].get(); 1232 1236 if (v) { 1233 1237 if (v.isUndefined()) 1234 1238 ++numUndefined; 1235 1239 else 1236 storage->m_vector[numDefined++] = v;1240 storage->m_vector[numDefined++].setWithoutWriteBarrier(v); 1237 1241 } 1238 1242 } … … 1253 1257 SparseArrayValueMap::iterator end = map->end(); 1254 1258 for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it) 1255 storage->m_vector[numDefined++] = it->second;1259 storage->m_vector[numDefined++].setWithoutWriteBarrier(it->second.get()); 1256 1260 1257 1261 delete map; … … 1260 1264 1261 1265 for (unsigned i = numDefined; i < newUsedVectorLength; ++i) 1262 storage->m_vector[i] = jsUndefined();1266 storage->m_vector[i].setUndefined(); 1263 1267 for (unsigned i = newUsedVectorLength; i < usedVectorLength; ++i) 1264 storage->m_vector[i] = JSValue();1268 storage->m_vector[i].clear(); 1265 1269 1266 1270 storage->m_numValuesInVector = newUsedVectorLength;
Note:
See TracChangeset
for help on using the changeset viewer.