Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 299 | 299 |
| 300 | 300 |
| 301 static void FillWithHoles(FixedArray* dst, int from, int to) { | 301 static void FillWithHoles(FixedArray* dst, int from, int to) { |
| 302 ASSERT(dst->map() != Heap::fixed_cow_array_map()); | 302 ASSERT(dst->map() != Heap::fixed_cow_array_map()); |
| 303 MemsetPointer(dst->data_start() + from, Heap::the_hole_value(), to - from); | 303 MemsetPointer(dst->data_start() + from, Heap::the_hole_value(), to - from); |
| 304 } | 304 } |
| 305 | 305 |
| 306 | 306 |
| 307 static FixedArray* LeftTrimFixedArray(FixedArray* elms, int to_trim) { | 307 static FixedArray* LeftTrimFixedArray(FixedArray* elms, int to_trim) { |
| 308 ASSERT(elms->map() != Heap::fixed_cow_array_map()); | 308 ASSERT(elms->map() != Heap::fixed_cow_array_map()); |
| 309 // For now this trick is only applied to fixed arrays in new space. | 309 // For now this trick is only applied to fixed arrays in new and paged space. |
| 310 // In large object space the object's start must coincide with chunk | 310 // In large object space the object's start must coincide with chunk |
| 311 // and thus the trick is just not applicable. | 311 // and thus the trick is just not applicable. |
| 312 // In old space we do not use this trick to avoid dealing with | 312 ASSERT(!Heap::lo_space()->Contains(elms)); |
| 313 // region dirty marks. | |
| 314 ASSERT(Heap::new_space()->Contains(elms)); | |
| 315 | 313 |
| 316 STATIC_ASSERT(FixedArray::kMapOffset == 0); | 314 STATIC_ASSERT(FixedArray::kMapOffset == 0); |
| 317 STATIC_ASSERT(FixedArray::kLengthOffset == kPointerSize); | 315 STATIC_ASSERT(FixedArray::kLengthOffset == kPointerSize); |
| 318 STATIC_ASSERT(FixedArray::kHeaderSize == 2 * kPointerSize); | 316 STATIC_ASSERT(FixedArray::kHeaderSize == 2 * kPointerSize); |
| 319 | 317 |
| 320 Object** former_start = HeapObject::RawField(elms, 0); | 318 Object** former_start = HeapObject::RawField(elms, 0); |
| 321 | 319 |
| 322 const int len = elms->length(); | 320 const int len = elms->length(); |
| 323 | 321 |
| 322 if (to_trim > FixedArray::kHeaderSize / kPointerSize && | |
| 323 !Heap::new_space()->Contains(elms)) { | |
| 324 // If we are doing a big trim in old space then we zap the space that was | |
| 325 // formerly part of the array so that the GC (aided by the card-based | |
| 326 // remembered set) won't find pointers to new-space there. | |
| 327 Object** zap = reinterpret_cast<Object**>(elms->address()); | |
| 328 for (int i = 0; i < to_trim; i++) { | |
|
antonm
2010/08/20 11:50:30
you may save one store here as elms->address() wou
| |
| 329 *zap++ = Smi::FromInt(0); | |
| 330 } | |
| 331 } | |
| 324 // Technically in new space this write might be omitted (except for | 332 // Technically in new space this write might be omitted (except for |
| 325 // debug mode which iterates through the heap), but to play safer | 333 // debug mode which iterates through the heap), but to play safer |
| 326 // we still do it. | 334 // we still do it. |
| 327 Heap::CreateFillerObjectAt(elms->address(), to_trim * kPointerSize); | 335 Heap::CreateFillerObjectAt(elms->address(), to_trim * kPointerSize); |
| 328 | 336 |
| 329 former_start[to_trim] = Heap::fixed_array_map(); | 337 former_start[to_trim] = Heap::fixed_array_map(); |
| 330 former_start[to_trim + 1] = Smi::FromInt(len - to_trim); | 338 former_start[to_trim + 1] = Smi::FromInt(len - to_trim); |
| 331 | 339 |
| 332 ASSERT_EQ(elms->address() + to_trim * kPointerSize, | 340 return FixedArray::cast(HeapObject::FromAddress( |
| 333 (elms + to_trim * kPointerSize)->address()); | 341 elms->address() + to_trim * kPointerSize)); |
| 334 return elms + to_trim * kPointerSize; | |
| 335 } | 342 } |
| 336 | 343 |
| 337 | 344 |
| 338 static bool ArrayPrototypeHasNoElements(Context* global_context, | 345 static bool ArrayPrototypeHasNoElements(Context* global_context, |
| 339 JSObject* array_proto) { | 346 JSObject* array_proto) { |
| 340 // This method depends on non writability of Object and Array prototype | 347 // This method depends on non writability of Object and Array prototype |
| 341 // fields. | 348 // fields. |
| 342 if (array_proto->elements() != Heap::empty_fixed_array()) return false; | 349 if (array_proto->elements() != Heap::empty_fixed_array()) return false; |
| 343 // Hidden prototype | 350 // Hidden prototype |
| 344 array_proto = JSObject::cast(array_proto->GetPrototype()); | 351 array_proto = JSObject::cast(array_proto->GetPrototype()); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 490 | 497 |
| 491 int len = Smi::cast(array->length())->value(); | 498 int len = Smi::cast(array->length())->value(); |
| 492 if (len == 0) return Heap::undefined_value(); | 499 if (len == 0) return Heap::undefined_value(); |
| 493 | 500 |
| 494 // Get first element | 501 // Get first element |
| 495 Object* first = elms->get(0); | 502 Object* first = elms->get(0); |
| 496 if (first->IsTheHole()) { | 503 if (first->IsTheHole()) { |
| 497 first = Heap::undefined_value(); | 504 first = Heap::undefined_value(); |
| 498 } | 505 } |
| 499 | 506 |
| 500 if (Heap::new_space()->Contains(elms)) { | 507 if (!Heap::lo_space()->Contains(elms)) { |
| 501 // As elms still in the same space they used to be (new space), | 508 // As elms still in the same space they used to be, |
| 502 // there is no need to update region dirty mark. | 509 // there is no need to update region dirty mark. |
| 503 array->set_elements(LeftTrimFixedArray(elms, 1), SKIP_WRITE_BARRIER); | 510 array->set_elements(LeftTrimFixedArray(elms, 1), SKIP_WRITE_BARRIER); |
| 504 } else { | 511 } else { |
| 505 // Shift the elements. | 512 // Shift the elements. |
| 506 AssertNoAllocation no_gc; | 513 AssertNoAllocation no_gc; |
| 507 MoveElements(&no_gc, elms, 0, elms, 1, len - 1); | 514 MoveElements(&no_gc, elms, 0, elms, 1, len - 1); |
| 508 elms->set(len - 1, Heap::the_hole_value()); | 515 elms->set(len - 1, Heap::the_hole_value()); |
| 509 } | 516 } |
| 510 | 517 |
| 511 // Set the length. | 518 // Set the length. |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 717 // Set the length. | 724 // Set the length. |
| 718 result_array->set_length(Smi::FromInt(actual_delete_count)); | 725 result_array->set_length(Smi::FromInt(actual_delete_count)); |
| 719 } | 726 } |
| 720 | 727 |
| 721 int item_count = (n_arguments > 1) ? (n_arguments - 2) : 0; | 728 int item_count = (n_arguments > 1) ? (n_arguments - 2) : 0; |
| 722 | 729 |
| 723 int new_length = len - actual_delete_count + item_count; | 730 int new_length = len - actual_delete_count + item_count; |
| 724 | 731 |
| 725 if (item_count < actual_delete_count) { | 732 if (item_count < actual_delete_count) { |
| 726 // Shrink the array. | 733 // Shrink the array. |
| 727 const bool trim_array = Heap::new_space()->Contains(elms) && | 734 const bool trim_array = !Heap::lo_space()->Contains(elms) && |
| 728 ((actual_start + item_count) < | 735 ((actual_start + item_count) < |
| 729 (len - actual_delete_count - actual_start)); | 736 (len - actual_delete_count - actual_start)); |
| 730 if (trim_array) { | 737 if (trim_array) { |
| 731 const int delta = actual_delete_count - item_count; | 738 const int delta = actual_delete_count - item_count; |
| 732 | 739 |
| 733 if (actual_start > 0) { | 740 if (actual_start > 0) { |
| 734 Object** start = elms->data_start(); | 741 Object** start = elms->data_start(); |
| 735 memmove(start + delta, start, actual_start * kPointerSize); | 742 memmove(start + delta, start, actual_start * kPointerSize); |
| 736 } | 743 } |
| 737 | 744 |
| (...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1527 if (entry->contains(pc)) { | 1534 if (entry->contains(pc)) { |
| 1528 return names_[i]; | 1535 return names_[i]; |
| 1529 } | 1536 } |
| 1530 } | 1537 } |
| 1531 } | 1538 } |
| 1532 return NULL; | 1539 return NULL; |
| 1533 } | 1540 } |
| 1534 | 1541 |
| 1535 | 1542 |
| 1536 } } // namespace v8::internal | 1543 } } // namespace v8::internal |
| OLD | NEW |