OLD | NEW |
1 // Copyright 2006-2010 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2010 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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 void HeapObjectIterator::Initialize(Address cur, Address end, | 67 void HeapObjectIterator::Initialize(Address cur, Address end, |
68 HeapObjectCallback size_f) { | 68 HeapObjectCallback size_f) { |
69 cur_addr_ = cur; | 69 cur_addr_ = cur; |
70 end_addr_ = end; | 70 end_addr_ = end; |
71 end_page_ = Page::FromAllocationTop(end); | 71 end_page_ = Page::FromAllocationTop(end); |
72 size_func_ = size_f; | 72 size_func_ = size_f; |
73 Page* p = Page::FromAllocationTop(cur_addr_); | 73 Page* p = Page::FromAllocationTop(cur_addr_); |
74 cur_limit_ = (p == end_page_) ? end_addr_ : p->AllocationTop(); | 74 cur_limit_ = (p == end_page_) ? end_addr_ : p->AllocationTop(); |
75 | 75 |
76 if (!p->IsFlagSet(Page::IS_CONTINUOUS)) { | 76 if (!p->IsFlagSet(Page::IS_CONTINUOUS)) { |
| 77 ASSERT(IncrementalMarking::state() == IncrementalMarking::STOPPED); |
77 cur_addr_ = Marking::FirstLiveObject(cur_addr_, cur_limit_); | 78 cur_addr_ = Marking::FirstLiveObject(cur_addr_, cur_limit_); |
78 if (cur_addr_ > cur_limit_) cur_addr_ = cur_limit_; | 79 if (cur_addr_ > cur_limit_) cur_addr_ = cur_limit_; |
79 } | 80 } |
80 | 81 |
81 #ifdef DEBUG | 82 #ifdef DEBUG |
82 Verify(); | 83 Verify(); |
83 #endif | 84 #endif |
84 } | 85 } |
85 | 86 |
86 | 87 |
87 HeapObject* HeapObjectIterator::FromNextPage() { | 88 HeapObject* HeapObjectIterator::FromNextPage() { |
88 if (cur_addr_ == end_addr_) return NULL; | 89 if (cur_addr_ == end_addr_) return NULL; |
89 | 90 |
90 Page* cur_page = Page::FromAllocationTop(cur_addr_); | 91 Page* cur_page = Page::FromAllocationTop(cur_addr_); |
91 cur_page = cur_page->next_page(); | 92 cur_page = cur_page->next_page(); |
92 ASSERT(cur_page->is_valid()); | 93 ASSERT(cur_page->is_valid()); |
93 | 94 |
94 cur_addr_ = cur_page->ObjectAreaStart(); | 95 cur_addr_ = cur_page->ObjectAreaStart(); |
95 cur_limit_ = (cur_page == end_page_) ? end_addr_ : cur_page->AllocationTop(); | 96 cur_limit_ = (cur_page == end_page_) ? end_addr_ : cur_page->AllocationTop(); |
96 | 97 |
97 if (!cur_page->IsFlagSet(Page::IS_CONTINUOUS)) { | 98 if (!cur_page->IsFlagSet(Page::IS_CONTINUOUS)) { |
| 99 ASSERT(IncrementalMarking::state() == IncrementalMarking::STOPPED); |
98 cur_addr_ = Marking::FirstLiveObject(cur_addr_, cur_limit_); | 100 cur_addr_ = Marking::FirstLiveObject(cur_addr_, cur_limit_); |
99 if (cur_addr_ > cur_limit_) cur_addr_ = cur_limit_; | 101 if (cur_addr_ > cur_limit_) cur_addr_ = cur_limit_; |
100 } | 102 } |
101 | 103 |
102 if (cur_addr_ == end_addr_) return NULL; | 104 if (cur_addr_ == end_addr_) return NULL; |
103 ASSERT(cur_addr_ < cur_limit_); | 105 ASSERT(cur_addr_ < cur_limit_); |
104 #ifdef DEBUG | 106 #ifdef DEBUG |
105 Verify(); | 107 Verify(); |
106 #endif | 108 #endif |
107 return FromCurrentPage(); | 109 return FromCurrentPage(); |
108 } | 110 } |
109 | 111 |
110 | 112 |
111 void HeapObjectIterator::AdvanceUsingMarkbits() { | 113 void HeapObjectIterator::AdvanceUsingMarkbits() { |
| 114 ASSERT(IncrementalMarking::state() == IncrementalMarking::STOPPED); |
112 HeapObject* obj = HeapObject::FromAddress(cur_addr_); | 115 HeapObject* obj = HeapObject::FromAddress(cur_addr_); |
113 int obj_size = (size_func_ == NULL) ? obj->Size() : size_func_(obj); | 116 int obj_size = (size_func_ == NULL) ? obj->Size() : size_func_(obj); |
114 ASSERT_OBJECT_SIZE(obj_size); | 117 ASSERT_OBJECT_SIZE(obj_size); |
115 cur_addr_ = Marking::NextLiveObject(obj, | 118 cur_addr_ = Marking::NextLiveObject(obj, |
116 obj_size, | 119 obj_size, |
117 cur_limit_); | 120 cur_limit_); |
118 if (cur_addr_ > cur_limit_) cur_addr_ = cur_limit_; | 121 if (cur_addr_ > cur_limit_) cur_addr_ = cur_limit_; |
119 } | 122 } |
120 | 123 |
121 | 124 |
(...skipping 2181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2303 this); | 2306 this); |
2304 if (page == NULL) return Failure::RetryAfterGC(identity()); | 2307 if (page == NULL) return Failure::RetryAfterGC(identity()); |
2305 ASSERT(page->body_size() >= object_size); | 2308 ASSERT(page->body_size() >= object_size); |
2306 | 2309 |
2307 size_ += static_cast<int>(page->size()); | 2310 size_ += static_cast<int>(page->size()); |
2308 objects_size_ += object_size; | 2311 objects_size_ += object_size; |
2309 page_count_++; | 2312 page_count_++; |
2310 page->set_next_page(first_page_); | 2313 page->set_next_page(first_page_); |
2311 first_page_ = page; | 2314 first_page_ = page; |
2312 | 2315 |
| 2316 |
| 2317 IncrementalMarking::Step(object_size); |
2313 return page->GetObject(); | 2318 return page->GetObject(); |
2314 } | 2319 } |
2315 | 2320 |
2316 | 2321 |
2317 MaybeObject* LargeObjectSpace::AllocateRawCode(int size_in_bytes) { | 2322 MaybeObject* LargeObjectSpace::AllocateRawCode(int size_in_bytes) { |
2318 ASSERT(0 < size_in_bytes); | 2323 ASSERT(0 < size_in_bytes); |
2319 return AllocateRawInternal(size_in_bytes, EXECUTABLE); | 2324 return AllocateRawInternal(size_in_bytes, EXECUTABLE); |
2320 } | 2325 } |
2321 | 2326 |
2322 | 2327 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2507 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { | 2512 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { |
2508 if (obj->IsCode()) { | 2513 if (obj->IsCode()) { |
2509 Code* code = Code::cast(obj); | 2514 Code* code = Code::cast(obj); |
2510 code_kind_statistics[code->kind()] += code->Size(); | 2515 code_kind_statistics[code->kind()] += code->Size(); |
2511 } | 2516 } |
2512 } | 2517 } |
2513 } | 2518 } |
2514 #endif // DEBUG | 2519 #endif // DEBUG |
2515 | 2520 |
2516 } } // namespace v8::internal | 2521 } } // namespace v8::internal |
OLD | NEW |