Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 124 | 124 |
| 125 | 125 |
| 126 static Failure* ThrowArrayLengthRangeError(Heap* heap) { | 126 static Failure* ThrowArrayLengthRangeError(Heap* heap) { |
| 127 HandleScope scope(heap->isolate()); | 127 HandleScope scope(heap->isolate()); |
| 128 return heap->isolate()->Throw( | 128 return heap->isolate()->Throw( |
| 129 *heap->isolate()->factory()->NewRangeError("invalid_array_length", | 129 *heap->isolate()->factory()->NewRangeError("invalid_array_length", |
| 130 HandleVector<Object>(NULL, 0))); | 130 HandleVector<Object>(NULL, 0))); |
| 131 } | 131 } |
| 132 | 132 |
| 133 | 133 |
| 134 void CopyObjectToObjectElements(AssertNoAllocation* no_gc, | 134 void CopyObjectToObjectElements(FixedArray* from, |
| 135 FixedArray* from_obj, | |
| 136 ElementsKind from_kind, | 135 ElementsKind from_kind, |
| 137 uint32_t from_start, | 136 uint32_t from_start, |
| 138 FixedArray* to_obj, | 137 FixedArray* to, |
| 139 ElementsKind to_kind, | 138 ElementsKind to_kind, |
| 140 uint32_t to_start, | 139 uint32_t to_start, |
| 141 int copy_size) { | 140 int raw_copy_size, |
| 142 ASSERT(to_obj->map() != HEAP->fixed_cow_array_map()); | 141 WriteBarrierMode mode) { |
| 142 ASSERT(to->map() != HEAP->fixed_cow_array_map()); | |
| 143 ASSERT(from_kind == FAST_ELEMENTS || from_kind == FAST_SMI_ONLY_ELEMENTS); | 143 ASSERT(from_kind == FAST_ELEMENTS || from_kind == FAST_SMI_ONLY_ELEMENTS); |
| 144 ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); | 144 ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); |
| 145 if (copy_size == -1) { | 145 int copy_size = raw_copy_size; |
| 146 copy_size = Min(from_obj->length() - from_start, | 146 if (raw_copy_size < 0) { |
| 147 to_obj->length() - to_start); | 147 ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || |
| 148 raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | |
| 149 copy_size = Min(from->length() - from_start, | |
| 150 to->length() - to_start); | |
| 151 #if DEBUG | |
|
Jakob Kummerow
2012/03/12 15:33:28
s/#if/#ifdef/
Again below.
danno
2012/03/12 20:35:03
Done.
| |
| 152 // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already | |
| 153 // marked with the hole. | |
| 154 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | |
| 155 Object* hole = from->GetHeap()->the_hole_value(); | |
| 156 for (int i = to_start + copy_size; i < to->length(); ++i) { | |
| 157 ASSERT(to->get(i) == hole); | |
|
Jakob Kummerow
2012/03/12 15:33:28
ASSERT(to->is_the_hole(i))?
danno
2012/03/12 20:35:03
Done.
| |
| 158 } | |
| 159 } | |
| 160 #endif | |
| 148 } | 161 } |
| 149 ASSERT(((copy_size + static_cast<int>(to_start)) <= to_obj->length() && | 162 ASSERT(((copy_size + static_cast<int>(to_start)) <= to->length() && |
|
Jakob Kummerow
2012/03/12 15:33:28
nit: you can remove at least one pair of parenthes
danno
2012/03/12 20:35:03
Done.
| |
| 150 (copy_size + static_cast<int>(from_start)) <= from_obj->length())); | 163 (copy_size + static_cast<int>(from_start)) <= from->length())); |
| 151 if (copy_size == 0) return; | 164 if (copy_size == 0) return; |
| 152 Address to = to_obj->address() + FixedArray::kHeaderSize; | 165 Address to_address = to->address() + FixedArray::kHeaderSize; |
| 153 Address from = from_obj->address() + FixedArray::kHeaderSize; | 166 Address from_address = from->address() + FixedArray::kHeaderSize; |
| 154 CopyWords(reinterpret_cast<Object**>(to) + to_start, | 167 CopyWords(reinterpret_cast<Object**>(to_address) + to_start, |
| 155 reinterpret_cast<Object**>(from) + from_start, | 168 reinterpret_cast<Object**>(from_address) + from_start, |
| 156 copy_size); | 169 copy_size); |
| 157 if (from_kind == FAST_ELEMENTS && to_kind == FAST_ELEMENTS) { | 170 if (from_kind == FAST_ELEMENTS && to_kind == FAST_ELEMENTS && |
| 158 Heap* heap = from_obj->GetHeap(); | 171 mode == UPDATE_WRITE_BARRIER) { |
| 159 WriteBarrierMode mode = to_obj->GetWriteBarrierMode(*no_gc); | 172 Heap* heap = from->GetHeap(); |
| 160 if (mode == UPDATE_WRITE_BARRIER) { | 173 if (!heap->InNewSpace(to)) { |
| 161 heap->RecordWrites(to_obj->address(), | 174 heap->RecordWrites(to->address(), |
| 162 to_obj->OffsetOfElementAt(to_start), | 175 to->OffsetOfElementAt(to_start), |
| 163 copy_size); | 176 copy_size); |
| 164 } | 177 } |
| 165 heap->incremental_marking()->RecordWrites(to_obj); | 178 heap->incremental_marking()->RecordWrites(to); |
| 166 } | 179 } |
| 167 } | 180 } |
| 168 | 181 |
| 169 | 182 |
| 170 | |
| 171 | |
| 172 static void CopyDictionaryToObjectElements(SeededNumberDictionary* from, | 183 static void CopyDictionaryToObjectElements(SeededNumberDictionary* from, |
| 173 uint32_t from_start, | 184 uint32_t from_start, |
| 174 FixedArray* to, | 185 FixedArray* to, |
| 175 ElementsKind to_kind, | 186 ElementsKind to_kind, |
| 176 uint32_t to_start, | 187 uint32_t to_start, |
| 177 int copy_size) { | 188 int raw_copy_size, |
| 189 WriteBarrierMode mode) { | |
| 190 int copy_size = raw_copy_size; | |
| 191 Heap* heap = from->GetHeap(); | |
| 192 Object* hole = heap->the_hole_value(); | |
| 193 if (raw_copy_size < 0) { | |
| 194 ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || | |
| 195 raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | |
| 196 copy_size = from->max_number_key() + 1 - from_start; | |
| 197 #if DEBUG | |
| 198 // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already | |
| 199 // marked with the hole. | |
| 200 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | |
| 201 for (int i = to_start + copy_size; i < to->length(); ++i) { | |
| 202 ASSERT(to->get(i) == hole); | |
|
Jakob Kummerow
2012/03/12 15:33:28
ASSERT(to->is_the_hole(i))?
danno
2012/03/12 20:35:03
Done.
| |
| 203 } | |
| 204 } | |
| 205 #endif | |
| 206 } | |
| 207 ASSERT((copy_size + static_cast<int>(to_start)) <= to->length()); | |
| 178 ASSERT(to != from); | 208 ASSERT(to != from); |
| 179 ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); | 209 ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); |
| 180 ASSERT(copy_size == -1 || | 210 ASSERT(copy_size > 0 || copy_size == ElementsAccessor::kCopyToEnd || |
|
Jakob Kummerow
2012/03/12 15:33:28
I don't see how copy_size can ever be < 0 at this
danno
2012/03/12 20:35:03
Done.
| |
| 181 (copy_size + static_cast<int>(to_start)) <= to->length()); | 211 copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); |
| 182 WriteBarrierMode mode = to_kind == FAST_ELEMENTS | 212 ASSERT(copy_size + static_cast<int>(to_start) <= to->length()); |
|
Jakob Kummerow
2012/03/12 15:33:28
Duplicate assertion (see line 207).
danno
2012/03/12 20:35:03
Done.
| |
| 183 ? UPDATE_WRITE_BARRIER | 213 if (copy_size == 0) return; |
| 184 : SKIP_WRITE_BARRIER; | 214 for (int i = 0; i < copy_size; i++) { |
| 185 uint32_t copy_limit = (copy_size == -1) | 215 int entry = from->FindEntry(i + from_start); |
| 186 ? to->length() | 216 if (entry != SeededNumberDictionary::kNotFound) { |
| 187 : Min(to_start + copy_size, static_cast<uint32_t>(to->length())); | 217 Object* value = from->ValueAt(entry); |
| 188 for (int i = 0; i < from->Capacity(); ++i) { | 218 ASSERT(!value->IsTheHole()); |
| 189 Object* key = from->KeyAt(i); | 219 to->set(i + to_start, value, SKIP_WRITE_BARRIER); |
| 190 if (key->IsNumber()) { | 220 } else { |
| 191 uint32_t entry = static_cast<uint32_t>(key->Number()); | 221 to->set(i + to_start, hole, SKIP_WRITE_BARRIER); |
|
Jakob Kummerow
2012/03/12 15:33:28
to->set_the_hole(i + to_start)?
danno
2012/03/12 20:35:03
Done.
| |
| 192 if (entry >= to_start && entry < copy_limit) { | |
| 193 Object* value = from->ValueAt(i); | |
| 194 ASSERT(to_kind == FAST_ELEMENTS || value->IsSmi()); | |
| 195 to->set(entry, value, mode); | |
| 196 } | |
| 197 } | 222 } |
| 198 } | 223 } |
| 224 if (to_kind == FAST_ELEMENTS) { | |
| 225 if (!heap->InNewSpace(to)) { | |
| 226 heap->RecordWrites(to->address(), | |
| 227 to->OffsetOfElementAt(to_start), | |
| 228 copy_size); | |
| 229 } | |
| 230 heap->incremental_marking()->RecordWrites(to); | |
| 231 } | |
| 199 } | 232 } |
| 200 | 233 |
| 201 | 234 |
| 202 MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements( | 235 MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements( |
| 203 FixedDoubleArray* from_obj, | 236 FixedDoubleArray* from, |
| 204 uint32_t from_start, | 237 uint32_t from_start, |
| 205 FixedArray* to_obj, | 238 FixedArray* to, |
| 206 ElementsKind to_kind, | 239 ElementsKind to_kind, |
| 207 uint32_t to_start, | 240 uint32_t to_start, |
| 208 int copy_size) { | 241 int raw_copy_size) { |
| 209 ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); | 242 ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); |
| 210 if (copy_size == -1) { | 243 int copy_size = raw_copy_size; |
| 211 copy_size = Min(from_obj->length() - from_start, | 244 if (raw_copy_size < 0) { |
| 212 to_obj->length() - to_start); | 245 ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || |
| 246 raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | |
| 247 copy_size = Min(from->length() - from_start, | |
| 248 to->length() - to_start); | |
| 249 #if DEBUG | |
| 250 // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already | |
| 251 // marked with the hole. | |
| 252 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | |
| 253 Object* hole = from->GetHeap()->the_hole_value(); | |
| 254 for (int i = to_start + copy_size; i < to->length(); ++i) { | |
| 255 ASSERT(to->get(i) == hole); | |
|
Jakob Kummerow
2012/03/12 15:33:28
ASSERT(to->is_the_hole(i))?
danno
2012/03/12 20:35:03
Done.
| |
| 256 } | |
| 257 } | |
| 258 #endif | |
| 213 } | 259 } |
| 214 ASSERT(((copy_size + static_cast<int>(to_start)) <= to_obj->length() && | 260 ASSERT(((copy_size + static_cast<int>(to_start)) <= to->length() && |
|
Jakob Kummerow
2012/03/12 15:33:28
nit: you can remove at least one pair of parenthes
danno
2012/03/12 20:35:03
Done.
| |
| 215 (copy_size + static_cast<int>(from_start)) <= from_obj->length())); | 261 (copy_size + static_cast<int>(from_start)) <= from->length())); |
| 216 if (copy_size == 0) return from_obj; | 262 if (copy_size == 0) return from; |
| 217 for (int i = 0; i < copy_size; ++i) { | 263 for (int i = 0; i < copy_size; ++i) { |
| 218 if (to_kind == FAST_SMI_ONLY_ELEMENTS) { | 264 if (to_kind == FAST_SMI_ONLY_ELEMENTS) { |
| 219 UNIMPLEMENTED(); | 265 UNIMPLEMENTED(); |
| 220 return Failure::Exception(); | 266 return Failure::Exception(); |
| 221 } else { | 267 } else { |
| 222 MaybeObject* maybe_value = from_obj->get(i + from_start); | 268 MaybeObject* maybe_value = from->get(i + from_start); |
| 223 Object* value; | 269 Object* value; |
| 224 ASSERT(to_kind == FAST_ELEMENTS); | 270 ASSERT(to_kind == FAST_ELEMENTS); |
| 225 // Because FAST_DOUBLE_ELEMENTS -> FAST_ELEMENT allocate HeapObjects | 271 // Because FAST_DOUBLE_ELEMENTS -> FAST_ELEMENT allocate HeapObjects |
| 226 // iteratively, the allocate must succeed within a single GC cycle, | 272 // iteratively, the allocate must succeed within a single GC cycle, |
| 227 // otherwise the retry after the GC will also fail. In order to ensure | 273 // otherwise the retry after the GC will also fail. In order to ensure |
| 228 // that no GC is triggered, allocate HeapNumbers from old space if they | 274 // that no GC is triggered, allocate HeapNumbers from old space if they |
| 229 // can't be taken from new space. | 275 // can't be taken from new space. |
| 230 if (!maybe_value->ToObject(&value)) { | 276 if (!maybe_value->ToObject(&value)) { |
| 231 ASSERT(maybe_value->IsRetryAfterGC() || maybe_value->IsOutOfMemory()); | 277 ASSERT(maybe_value->IsRetryAfterGC() || maybe_value->IsOutOfMemory()); |
| 232 Heap* heap = from_obj->GetHeap(); | 278 Heap* heap = from->GetHeap(); |
| 233 MaybeObject* maybe_value_object = | 279 MaybeObject* maybe_value_object = |
| 234 heap->AllocateHeapNumber(from_obj->get_scalar(i + from_start), | 280 heap->AllocateHeapNumber(from->get_scalar(i + from_start), |
| 235 TENURED); | 281 TENURED); |
| 236 if (!maybe_value_object->ToObject(&value)) return maybe_value_object; | 282 if (!maybe_value_object->ToObject(&value)) return maybe_value_object; |
| 237 } | 283 } |
| 238 to_obj->set(i + to_start, value, UPDATE_WRITE_BARRIER); | 284 to->set(i + to_start, value, UPDATE_WRITE_BARRIER); |
| 239 } | 285 } |
| 240 } | 286 } |
| 241 return to_obj; | 287 return to; |
| 242 } | 288 } |
| 243 | 289 |
| 244 | 290 |
| 245 static void CopyDoubleToDoubleElements(FixedDoubleArray* from_obj, | 291 static void CopyDoubleToDoubleElements(FixedDoubleArray* from, |
| 246 uint32_t from_start, | 292 uint32_t from_start, |
| 247 FixedDoubleArray* to_obj, | 293 FixedDoubleArray* to, |
| 248 uint32_t to_start, | 294 uint32_t to_start, |
| 249 int copy_size) { | 295 int raw_copy_size) { |
| 250 if (copy_size == -1) { | 296 int copy_size = raw_copy_size; |
| 251 copy_size = Min(from_obj->length() - from_start, | 297 if (raw_copy_size < 0) { |
| 252 to_obj->length() - to_start); | 298 ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || |
| 299 raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | |
| 300 copy_size = Min(from->length() - from_start, | |
| 301 to->length() - to_start); | |
| 302 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | |
| 303 for (int i = to_start + copy_size; i < to->length(); ++i) { | |
| 304 to->set_the_hole(i); | |
| 305 } | |
| 306 } | |
| 253 } | 307 } |
| 254 ASSERT(((copy_size + static_cast<int>(to_start)) <= to_obj->length() && | 308 ASSERT(((copy_size + static_cast<int>(to_start)) <= to->length() && |
| 255 (copy_size + static_cast<int>(from_start)) <= from_obj->length())); | 309 (copy_size + static_cast<int>(from_start)) <= from->length())); |
| 256 if (copy_size == 0) return; | 310 if (copy_size == 0) return; |
| 257 Address to = to_obj->address() + FixedDoubleArray::kHeaderSize; | 311 Address to_address = to->address() + FixedDoubleArray::kHeaderSize; |
| 258 Address from = from_obj->address() + FixedDoubleArray::kHeaderSize; | 312 Address from_address = from->address() + FixedDoubleArray::kHeaderSize; |
| 259 to += kDoubleSize * to_start; | 313 to_address += kDoubleSize * to_start; |
| 260 from += kDoubleSize * from_start; | 314 from_address += kDoubleSize * from_start; |
| 261 int words_per_double = (kDoubleSize / kPointerSize); | 315 int words_per_double = (kDoubleSize / kPointerSize); |
| 262 CopyWords(reinterpret_cast<Object**>(to), | 316 CopyWords(reinterpret_cast<Object**>(to_address), |
| 263 reinterpret_cast<Object**>(from), | 317 reinterpret_cast<Object**>(from_address), |
| 264 words_per_double * copy_size); | 318 words_per_double * copy_size); |
| 265 } | 319 } |
| 266 | 320 |
| 267 | 321 |
| 322 static void CopyObjectToDoubleElements(FixedArray* from, | |
| 323 uint32_t from_start, | |
| 324 FixedDoubleArray* to, | |
| 325 uint32_t to_start, | |
| 326 int raw_copy_size) { | |
| 327 int copy_size = raw_copy_size; | |
| 328 if (raw_copy_size < 0) { | |
| 329 ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || | |
| 330 raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | |
| 331 copy_size = from->length() - from_start; | |
| 332 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | |
| 333 for (int i = to_start + copy_size; i < to->length(); ++i) { | |
| 334 to->set_the_hole(i); | |
| 335 } | |
| 336 } | |
| 337 } | |
| 338 ASSERT(((copy_size + static_cast<int>(to_start)) <= to->length() && | |
|
Jakob Kummerow
2012/03/12 15:33:28
nit: you can remove at least one pair of parenthes
danno
2012/03/12 20:35:03
Done.
| |
| 339 (copy_size + static_cast<int>(from_start)) <= from->length())); | |
| 340 if (copy_size == 0) return; | |
| 341 for (int i = 0; i < copy_size; i++) { | |
| 342 Object* hole_or_object = from->get(i + from_start); | |
| 343 if (hole_or_object->IsTheHole()) { | |
| 344 to->set_the_hole(i + to_start); | |
| 345 } else { | |
| 346 to->set(i + to_start, hole_or_object->Number()); | |
| 347 } | |
| 348 } | |
| 349 } | |
| 350 | |
| 351 | |
| 352 static void CopyDictionaryToDoubleElements(SeededNumberDictionary* from, | |
| 353 uint32_t from_start, | |
| 354 FixedDoubleArray* to, | |
| 355 uint32_t to_start, | |
| 356 int raw_copy_size) { | |
| 357 int copy_size = raw_copy_size; | |
| 358 if (copy_size < 0) { | |
| 359 ASSERT(copy_size == ElementsAccessor::kCopyToEnd || | |
| 360 copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | |
| 361 copy_size = from->max_number_key() + 1 - from_start; | |
| 362 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | |
| 363 for (int i = to_start + copy_size; i < to->length(); ++i) { | |
| 364 to->set_the_hole(i); | |
| 365 } | |
| 366 } | |
| 367 } | |
| 368 ASSERT(copy_size + static_cast<int>(to_start) <= to->length()); | |
| 369 if (copy_size == 0) return; | |
| 370 for (int i = 0; i < copy_size; i++) { | |
| 371 int entry = from->FindEntry(i + from_start); | |
| 372 if (entry != SeededNumberDictionary::kNotFound) { | |
| 373 to->set(i + to_start, from->ValueAt(entry)->Number()); | |
| 374 } else { | |
| 375 to->set_the_hole(i + to_start); | |
| 376 } | |
| 377 } | |
| 378 } | |
| 379 | |
| 380 | |
| 268 // Base class for element handler implementations. Contains the | 381 // Base class for element handler implementations. Contains the |
| 269 // the common logic for objects with different ElementsKinds. | 382 // the common logic for objects with different ElementsKinds. |
| 270 // Subclasses must specialize method for which the element | 383 // Subclasses must specialize method for which the element |
| 271 // implementation differs from the base class implementation. | 384 // implementation differs from the base class implementation. |
| 272 // | 385 // |
| 273 // This class is intended to be used in the following way: | 386 // This class is intended to be used in the following way: |
| 274 // | 387 // |
| 275 // class SomeElementsAccessor : | 388 // class SomeElementsAccessor : |
| 276 // public ElementsAccessorBase<SomeElementsAccessor, | 389 // public ElementsAccessorBase<SomeElementsAccessor, |
| 277 // BackingStoreClass> { | 390 // BackingStoreClass> { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 362 | 475 |
| 363 virtual MaybeObject* Delete(JSObject* obj, | 476 virtual MaybeObject* Delete(JSObject* obj, |
| 364 uint32_t key, | 477 uint32_t key, |
| 365 JSReceiver::DeleteMode mode) = 0; | 478 JSReceiver::DeleteMode mode) = 0; |
| 366 | 479 |
| 367 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 480 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
| 368 uint32_t from_start, | 481 uint32_t from_start, |
| 369 FixedArrayBase* to, | 482 FixedArrayBase* to, |
| 370 ElementsKind to_kind, | 483 ElementsKind to_kind, |
| 371 uint32_t to_start, | 484 uint32_t to_start, |
| 372 int copy_size) { | 485 int copy_size, |
| 486 WriteBarrierMode mode) { | |
| 373 UNREACHABLE(); | 487 UNREACHABLE(); |
| 374 return NULL; | 488 return NULL; |
| 375 } | 489 } |
| 376 | 490 |
| 377 virtual MaybeObject* CopyElements(JSObject* from_holder, | 491 virtual MaybeObject* CopyElements(JSObject* from_holder, |
| 378 uint32_t from_start, | 492 uint32_t from_start, |
| 379 FixedArrayBase* to, | 493 FixedArrayBase* to, |
| 380 ElementsKind to_kind, | 494 ElementsKind to_kind, |
| 381 uint32_t to_start, | 495 uint32_t to_start, |
| 382 int copy_size, | 496 int copy_size, |
| 497 WriteBarrierMode mode, | |
| 383 FixedArrayBase* from) { | 498 FixedArrayBase* from) { |
| 384 if (from == NULL) { | 499 if (from == NULL) { |
| 385 from = from_holder->elements(); | 500 from = from_holder->elements(); |
| 386 } | 501 } |
| 502 if (from->length() == 0) { | |
| 503 return from; | |
| 504 } | |
| 387 return ElementsAccessorSubclass::CopyElementsImpl( | 505 return ElementsAccessorSubclass::CopyElementsImpl( |
| 388 from, from_start, to, to_kind, to_start, copy_size); | 506 from, from_start, to, to_kind, to_start, copy_size, mode); |
| 389 } | 507 } |
| 390 | 508 |
| 391 virtual MaybeObject* AddElementsToFixedArray(Object* receiver, | 509 virtual MaybeObject* AddElementsToFixedArray(Object* receiver, |
| 392 JSObject* holder, | 510 JSObject* holder, |
| 393 FixedArray* to, | 511 FixedArray* to, |
| 394 FixedArrayBase* from) { | 512 FixedArrayBase* from) { |
| 395 int len0 = to->length(); | 513 int len0 = to->length(); |
| 396 #ifdef DEBUG | 514 #ifdef DEBUG |
| 397 if (FLAG_enable_slow_asserts) { | 515 if (FLAG_enable_slow_asserts) { |
| 398 for (int i = 0; i < len0; i++) { | 516 for (int i = 0; i < len0; i++) { |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 615 } | 733 } |
| 616 } | 734 } |
| 617 return heap->true_value(); | 735 return heap->true_value(); |
| 618 } | 736 } |
| 619 | 737 |
| 620 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 738 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
| 621 uint32_t from_start, | 739 uint32_t from_start, |
| 622 FixedArrayBase* to, | 740 FixedArrayBase* to, |
| 623 ElementsKind to_kind, | 741 ElementsKind to_kind, |
| 624 uint32_t to_start, | 742 uint32_t to_start, |
| 625 int copy_size) { | 743 int copy_size, |
| 744 WriteBarrierMode mode) { | |
| 626 switch (to_kind) { | 745 switch (to_kind) { |
| 627 case FAST_SMI_ONLY_ELEMENTS: | 746 case FAST_SMI_ONLY_ELEMENTS: |
| 628 case FAST_ELEMENTS: { | 747 case FAST_ELEMENTS: { |
| 629 AssertNoAllocation no_gc; | |
| 630 CopyObjectToObjectElements( | 748 CopyObjectToObjectElements( |
| 631 &no_gc, FixedArray::cast(from), ElementsTraits::Kind, from_start, | 749 FixedArray::cast(from), ElementsTraits::Kind, from_start, |
| 632 FixedArray::cast(to), to_kind, to_start, copy_size); | 750 FixedArray::cast(to), to_kind, to_start, copy_size, mode); |
| 633 return from; | 751 return from; |
| 634 } | 752 } |
| 753 case FAST_DOUBLE_ELEMENTS: | |
| 754 CopyObjectToDoubleElements( | |
| 755 FixedArray::cast(from), from_start, | |
| 756 FixedDoubleArray::cast(to), to_start, copy_size); | |
| 757 return from; | |
| 635 default: | 758 default: |
| 636 UNREACHABLE(); | 759 UNREACHABLE(); |
| 637 } | 760 } |
| 638 return to->GetHeap()->undefined_value(); | 761 return to->GetHeap()->undefined_value(); |
| 639 } | 762 } |
| 640 | 763 |
| 641 | 764 |
| 642 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj, | 765 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj, |
| 643 uint32_t capacity, | 766 uint32_t capacity, |
| 644 uint32_t length) { | 767 uint32_t length) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 685 ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >; | 808 ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >; |
| 686 friend class FastElementsAccessor<FastDoubleElementsAccessor, | 809 friend class FastElementsAccessor<FastDoubleElementsAccessor, |
| 687 ElementsKindTraits<FAST_DOUBLE_ELEMENTS>, | 810 ElementsKindTraits<FAST_DOUBLE_ELEMENTS>, |
| 688 kDoubleSize>; | 811 kDoubleSize>; |
| 689 | 812 |
| 690 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 813 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
| 691 uint32_t from_start, | 814 uint32_t from_start, |
| 692 FixedArrayBase* to, | 815 FixedArrayBase* to, |
| 693 ElementsKind to_kind, | 816 ElementsKind to_kind, |
| 694 uint32_t to_start, | 817 uint32_t to_start, |
| 695 int copy_size) { | 818 int copy_size, |
| 819 WriteBarrierMode mode) { | |
| 696 switch (to_kind) { | 820 switch (to_kind) { |
| 697 case FAST_SMI_ONLY_ELEMENTS: | 821 case FAST_SMI_ONLY_ELEMENTS: |
| 698 case FAST_ELEMENTS: | 822 case FAST_ELEMENTS: |
| 699 return CopyDoubleToObjectElements( | 823 return CopyDoubleToObjectElements( |
| 700 FixedDoubleArray::cast(from), from_start, FixedArray::cast(to), | 824 FixedDoubleArray::cast(from), from_start, FixedArray::cast(to), |
| 701 to_kind, to_start, copy_size); | 825 to_kind, to_start, copy_size); |
| 702 case FAST_DOUBLE_ELEMENTS: | 826 case FAST_DOUBLE_ELEMENTS: |
| 703 CopyDoubleToDoubleElements(FixedDoubleArray::cast(from), from_start, | 827 CopyDoubleToDoubleElements(FixedDoubleArray::cast(from), from_start, |
| 704 FixedDoubleArray::cast(to), | 828 FixedDoubleArray::cast(to), |
| 705 to_start, copy_size); | 829 to_start, copy_size); |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 982 } | 1106 } |
| 983 } | 1107 } |
| 984 return heap->true_value(); | 1108 return heap->true_value(); |
| 985 } | 1109 } |
| 986 | 1110 |
| 987 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 1111 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
| 988 uint32_t from_start, | 1112 uint32_t from_start, |
| 989 FixedArrayBase* to, | 1113 FixedArrayBase* to, |
| 990 ElementsKind to_kind, | 1114 ElementsKind to_kind, |
| 991 uint32_t to_start, | 1115 uint32_t to_start, |
| 992 int copy_size) { | 1116 int copy_size, |
| 1117 WriteBarrierMode mode) { | |
| 993 switch (to_kind) { | 1118 switch (to_kind) { |
| 994 case FAST_SMI_ONLY_ELEMENTS: | 1119 case FAST_SMI_ONLY_ELEMENTS: |
| 995 case FAST_ELEMENTS: | 1120 case FAST_ELEMENTS: |
| 996 CopyDictionaryToObjectElements( | 1121 CopyDictionaryToObjectElements( |
| 997 SeededNumberDictionary::cast(from), from_start, | 1122 SeededNumberDictionary::cast(from), from_start, |
| 998 FixedArray::cast(to), to_kind, to_start, copy_size); | 1123 FixedArray::cast(to), to_kind, to_start, copy_size, mode); |
| 1124 return from; | |
| 1125 case FAST_DOUBLE_ELEMENTS: | |
| 1126 CopyDictionaryToDoubleElements( | |
| 1127 SeededNumberDictionary::cast(from), from_start, | |
| 1128 FixedDoubleArray::cast(to), to_start, copy_size); | |
| 999 return from; | 1129 return from; |
| 1000 default: | 1130 default: |
| 1001 UNREACHABLE(); | 1131 UNREACHABLE(); |
| 1002 } | 1132 } |
| 1003 return to->GetHeap()->undefined_value(); | 1133 return to->GetHeap()->undefined_value(); |
| 1004 } | 1134 } |
| 1005 | 1135 |
| 1006 | 1136 |
| 1007 protected: | 1137 protected: |
| 1008 friend class ElementsAccessorBase<DictionaryElementsAccessor, | 1138 friend class ElementsAccessorBase<DictionaryElementsAccessor, |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1121 } | 1251 } |
| 1122 } | 1252 } |
| 1123 return obj->GetHeap()->true_value(); | 1253 return obj->GetHeap()->true_value(); |
| 1124 } | 1254 } |
| 1125 | 1255 |
| 1126 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 1256 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
| 1127 uint32_t from_start, | 1257 uint32_t from_start, |
| 1128 FixedArrayBase* to, | 1258 FixedArrayBase* to, |
| 1129 ElementsKind to_kind, | 1259 ElementsKind to_kind, |
| 1130 uint32_t to_start, | 1260 uint32_t to_start, |
| 1131 int copy_size) { | 1261 int copy_size, |
| 1262 WriteBarrierMode mode) { | |
| 1132 FixedArray* parameter_map = FixedArray::cast(from); | 1263 FixedArray* parameter_map = FixedArray::cast(from); |
| 1133 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); | 1264 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| 1134 ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments); | 1265 ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments); |
| 1135 return accessor->CopyElements(NULL, from_start, to, to_kind, | 1266 return accessor->CopyElements(NULL, from_start, to, to_kind, |
| 1136 to_start, copy_size, arguments); | 1267 to_start, copy_size, mode, arguments); |
| 1137 } | 1268 } |
| 1138 | 1269 |
| 1139 static uint32_t GetCapacityImpl(FixedArray* parameter_map) { | 1270 static uint32_t GetCapacityImpl(FixedArray* parameter_map) { |
| 1140 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); | 1271 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); |
| 1141 return Max(static_cast<uint32_t>(parameter_map->length() - 2), | 1272 return Max(static_cast<uint32_t>(parameter_map->length() - 2), |
| 1142 ForArray(arguments)->GetCapacity(arguments)); | 1273 ForArray(arguments)->GetCapacity(arguments)); |
| 1143 } | 1274 } |
| 1144 | 1275 |
| 1145 static uint32_t GetKeyForIndexImpl(FixedArray* dict, | 1276 static uint32_t GetKeyForIndexImpl(FixedArray* dict, |
| 1146 uint32_t index) { | 1277 uint32_t index) { |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1287 if (!maybe_obj->To(&new_backing_store)) return maybe_obj; | 1418 if (!maybe_obj->To(&new_backing_store)) return maybe_obj; |
| 1288 new_backing_store->set(0, length); | 1419 new_backing_store->set(0, length); |
| 1289 { MaybeObject* result = array->SetContent(new_backing_store); | 1420 { MaybeObject* result = array->SetContent(new_backing_store); |
| 1290 if (result->IsFailure()) return result; | 1421 if (result->IsFailure()) return result; |
| 1291 } | 1422 } |
| 1292 return array; | 1423 return array; |
| 1293 } | 1424 } |
| 1294 | 1425 |
| 1295 | 1426 |
| 1296 } } // namespace v8::internal | 1427 } } // namespace v8::internal |
| OLD | NEW |