| 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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 Initialize(start, space->top(), NULL); | 61 Initialize(start, space->top(), NULL); |
| 62 } | 62 } |
| 63 | 63 |
| 64 | 64 |
| 65 HeapObjectIterator::HeapObjectIterator(PagedSpace* space, Address start, | 65 HeapObjectIterator::HeapObjectIterator(PagedSpace* space, Address start, |
| 66 HeapObjectCallback size_func) { | 66 HeapObjectCallback size_func) { |
| 67 Initialize(start, space->top(), size_func); | 67 Initialize(start, space->top(), size_func); |
| 68 } | 68 } |
| 69 | 69 |
| 70 | 70 |
| 71 HeapObjectIterator::HeapObjectIterator(Page* page, |
| 72 HeapObjectCallback size_func) { |
| 73 Initialize(page->ObjectAreaStart(), page->AllocationTop(), size_func); |
| 74 } |
| 75 |
| 76 |
| 71 void HeapObjectIterator::Initialize(Address cur, Address end, | 77 void HeapObjectIterator::Initialize(Address cur, Address end, |
| 72 HeapObjectCallback size_f) { | 78 HeapObjectCallback size_f) { |
| 73 cur_addr_ = cur; | 79 cur_addr_ = cur; |
| 74 end_addr_ = end; | 80 end_addr_ = end; |
| 75 end_page_ = Page::FromAllocationTop(end); | 81 end_page_ = Page::FromAllocationTop(end); |
| 76 size_func_ = size_f; | 82 size_func_ = size_f; |
| 77 Page* p = Page::FromAllocationTop(cur_addr_); | 83 Page* p = Page::FromAllocationTop(cur_addr_); |
| 78 cur_limit_ = (p == end_page_) ? end_addr_ : p->AllocationTop(); | 84 cur_limit_ = (p == end_page_) ? end_addr_ : p->AllocationTop(); |
| 79 | 85 |
| 80 #ifdef DEBUG | 86 #ifdef DEBUG |
| (...skipping 2633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2714 chunk != NULL; | 2720 chunk != NULL; |
| 2715 chunk = chunk->next()) { | 2721 chunk = chunk->next()) { |
| 2716 Address chunk_address = chunk->address(); | 2722 Address chunk_address = chunk->address(); |
| 2717 if (chunk_address <= a && a < chunk_address + chunk->size()) { | 2723 if (chunk_address <= a && a < chunk_address + chunk->size()) { |
| 2718 return chunk->GetObject(); | 2724 return chunk->GetObject(); |
| 2719 } | 2725 } |
| 2720 } | 2726 } |
| 2721 return Failure::Exception(); | 2727 return Failure::Exception(); |
| 2722 } | 2728 } |
| 2723 | 2729 |
| 2730 |
| 2731 LargeObjectChunk* LargeObjectSpace::FindChunkContainingPc(Address pc) { |
| 2732 // TODO(853): Change this implementation to only find executable |
| 2733 // chunks and use some kind of hash-based approach to speed it up. |
| 2734 for (LargeObjectChunk* chunk = first_chunk_; |
| 2735 chunk != NULL; |
| 2736 chunk = chunk->next()) { |
| 2737 Address chunk_address = chunk->address(); |
| 2738 if (chunk_address <= pc && pc < chunk_address + chunk->size()) { |
| 2739 return chunk; |
| 2740 } |
| 2741 } |
| 2742 return NULL; |
| 2743 } |
| 2744 |
| 2745 |
| 2724 void LargeObjectSpace::IterateDirtyRegions(ObjectSlotCallback copy_object) { | 2746 void LargeObjectSpace::IterateDirtyRegions(ObjectSlotCallback copy_object) { |
| 2725 LargeObjectIterator it(this); | 2747 LargeObjectIterator it(this); |
| 2726 for (HeapObject* object = it.next(); object != NULL; object = it.next()) { | 2748 for (HeapObject* object = it.next(); object != NULL; object = it.next()) { |
| 2727 // We only have code, sequential strings, or fixed arrays in large | 2749 // We only have code, sequential strings, or fixed arrays in large |
| 2728 // object space, and only fixed arrays can possibly contain pointers to | 2750 // object space, and only fixed arrays can possibly contain pointers to |
| 2729 // the young generation. | 2751 // the young generation. |
| 2730 if (object->IsFixedArray()) { | 2752 if (object->IsFixedArray()) { |
| 2731 Page* page = Page::FromAddress(object->address()); | 2753 Page* page = Page::FromAddress(object->address()); |
| 2732 uint32_t marks = page->GetRegionMarks(); | 2754 uint32_t marks = page->GetRegionMarks(); |
| 2733 uint32_t newmarks = Page::kAllRegionsCleanMarks; | 2755 uint32_t newmarks = Page::kAllRegionsCleanMarks; |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2921 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { | 2943 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { |
| 2922 if (obj->IsCode()) { | 2944 if (obj->IsCode()) { |
| 2923 Code* code = Code::cast(obj); | 2945 Code* code = Code::cast(obj); |
| 2924 code_kind_statistics[code->kind()] += code->Size(); | 2946 code_kind_statistics[code->kind()] += code->Size(); |
| 2925 } | 2947 } |
| 2926 } | 2948 } |
| 2927 } | 2949 } |
| 2928 #endif // DEBUG | 2950 #endif // DEBUG |
| 2929 | 2951 |
| 2930 } } // namespace v8::internal | 2952 } } // namespace v8::internal |
| OLD | NEW |