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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 VerifyMarking(p->area_start(), p->area_end()); | 141 VerifyMarking(p->area_start(), p->area_end()); |
142 } | 142 } |
143 } | 143 } |
144 | 144 |
145 | 145 |
146 static void VerifyMarking(Heap* heap) { | 146 static void VerifyMarking(Heap* heap) { |
147 VerifyMarking(heap->old_pointer_space()); | 147 VerifyMarking(heap->old_pointer_space()); |
148 VerifyMarking(heap->old_data_space()); | 148 VerifyMarking(heap->old_data_space()); |
149 VerifyMarking(heap->code_space()); | 149 VerifyMarking(heap->code_space()); |
150 VerifyMarking(heap->cell_space()); | 150 VerifyMarking(heap->cell_space()); |
| 151 VerifyMarking(heap->property_cell_space()); |
151 VerifyMarking(heap->map_space()); | 152 VerifyMarking(heap->map_space()); |
152 VerifyMarking(heap->new_space()); | 153 VerifyMarking(heap->new_space()); |
153 | 154 |
154 VerifyMarkingVisitor visitor; | 155 VerifyMarkingVisitor visitor; |
155 | 156 |
156 LargeObjectIterator it(heap->lo_space()); | 157 LargeObjectIterator it(heap->lo_space()); |
157 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { | 158 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { |
158 if (MarkCompactCollector::IsMarked(obj)) { | 159 if (MarkCompactCollector::IsMarked(obj)) { |
159 obj->Iterate(&visitor); | 160 obj->Iterate(&visitor); |
160 } | 161 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 VerifyEvacuation(p->area_start(), p->area_end()); | 223 VerifyEvacuation(p->area_start(), p->area_end()); |
223 } | 224 } |
224 } | 225 } |
225 | 226 |
226 | 227 |
227 static void VerifyEvacuation(Heap* heap) { | 228 static void VerifyEvacuation(Heap* heap) { |
228 VerifyEvacuation(heap->old_pointer_space()); | 229 VerifyEvacuation(heap->old_pointer_space()); |
229 VerifyEvacuation(heap->old_data_space()); | 230 VerifyEvacuation(heap->old_data_space()); |
230 VerifyEvacuation(heap->code_space()); | 231 VerifyEvacuation(heap->code_space()); |
231 VerifyEvacuation(heap->cell_space()); | 232 VerifyEvacuation(heap->cell_space()); |
| 233 VerifyEvacuation(heap->property_cell_space()); |
232 VerifyEvacuation(heap->map_space()); | 234 VerifyEvacuation(heap->map_space()); |
233 VerifyEvacuation(heap->new_space()); | 235 VerifyEvacuation(heap->new_space()); |
234 | 236 |
235 VerifyEvacuationVisitor visitor; | 237 VerifyEvacuationVisitor visitor; |
236 heap->IterateStrongRoots(&visitor, VISIT_ALL); | 238 heap->IterateStrongRoots(&visitor, VISIT_ALL); |
237 } | 239 } |
238 #endif // VERIFY_HEAP | 240 #endif // VERIFY_HEAP |
239 | 241 |
240 | 242 |
241 #ifdef DEBUG | 243 #ifdef DEBUG |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 FixedArray* array = FixedArray::cast(object); | 278 FixedArray* array = FixedArray::cast(object); |
277 int length = array->length(); | 279 int length = array->length(); |
278 // Set array length to zero to prevent cycles while iterating | 280 // Set array length to zero to prevent cycles while iterating |
279 // over array bodies, this is easier than intrusive marking. | 281 // over array bodies, this is easier than intrusive marking. |
280 array->set_length(0); | 282 array->set_length(0); |
281 array->IterateBody( | 283 array->IterateBody( |
282 FIXED_ARRAY_TYPE, FixedArray::SizeFor(length), this); | 284 FIXED_ARRAY_TYPE, FixedArray::SizeFor(length), this); |
283 array->set_length(length); | 285 array->set_length(length); |
284 } | 286 } |
285 break; | 287 break; |
286 case JS_GLOBAL_PROPERTY_CELL_TYPE: | 288 case CELL_TYPE: |
287 case JS_PROXY_TYPE: | 289 case JS_PROXY_TYPE: |
288 case JS_VALUE_TYPE: | 290 case JS_VALUE_TYPE: |
289 case TYPE_FEEDBACK_INFO_TYPE: | 291 case TYPE_FEEDBACK_INFO_TYPE: |
290 object->Iterate(this); | 292 object->Iterate(this); |
291 break; | 293 break; |
292 case DECLARED_ACCESSOR_INFO_TYPE: | 294 case DECLARED_ACCESSOR_INFO_TYPE: |
293 case EXECUTABLE_ACCESSOR_INFO_TYPE: | 295 case EXECUTABLE_ACCESSOR_INFO_TYPE: |
294 case BYTE_ARRAY_TYPE: | 296 case BYTE_ARRAY_TYPE: |
295 case CALL_HANDLER_INFO_TYPE: | 297 case CALL_HANDLER_INFO_TYPE: |
296 case CODE_TYPE: | 298 case CODE_TYPE: |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 (mode == NON_INCREMENTAL_COMPACTION || | 370 (mode == NON_INCREMENTAL_COMPACTION || |
369 FLAG_incremental_code_compaction)) { | 371 FLAG_incremental_code_compaction)) { |
370 CollectEvacuationCandidates(heap()->code_space()); | 372 CollectEvacuationCandidates(heap()->code_space()); |
371 } else if (FLAG_trace_fragmentation) { | 373 } else if (FLAG_trace_fragmentation) { |
372 TraceFragmentation(heap()->code_space()); | 374 TraceFragmentation(heap()->code_space()); |
373 } | 375 } |
374 | 376 |
375 if (FLAG_trace_fragmentation) { | 377 if (FLAG_trace_fragmentation) { |
376 TraceFragmentation(heap()->map_space()); | 378 TraceFragmentation(heap()->map_space()); |
377 TraceFragmentation(heap()->cell_space()); | 379 TraceFragmentation(heap()->cell_space()); |
| 380 TraceFragmentation(heap()->property_cell_space()); |
378 } | 381 } |
379 | 382 |
380 heap()->old_pointer_space()->EvictEvacuationCandidatesFromFreeLists(); | 383 heap()->old_pointer_space()->EvictEvacuationCandidatesFromFreeLists(); |
381 heap()->old_data_space()->EvictEvacuationCandidatesFromFreeLists(); | 384 heap()->old_data_space()->EvictEvacuationCandidatesFromFreeLists(); |
382 heap()->code_space()->EvictEvacuationCandidatesFromFreeLists(); | 385 heap()->code_space()->EvictEvacuationCandidatesFromFreeLists(); |
383 | 386 |
384 compacting_ = evacuation_candidates_.length() > 0; | 387 compacting_ = evacuation_candidates_.length() > 0; |
385 } | 388 } |
386 | 389 |
387 return compacting_; | 390 return compacting_; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 CHECK_EQ(0, p->LiveBytes()); | 464 CHECK_EQ(0, p->LiveBytes()); |
462 } | 465 } |
463 } | 466 } |
464 | 467 |
465 | 468 |
466 void MarkCompactCollector::VerifyMarkbitsAreClean() { | 469 void MarkCompactCollector::VerifyMarkbitsAreClean() { |
467 VerifyMarkbitsAreClean(heap_->old_pointer_space()); | 470 VerifyMarkbitsAreClean(heap_->old_pointer_space()); |
468 VerifyMarkbitsAreClean(heap_->old_data_space()); | 471 VerifyMarkbitsAreClean(heap_->old_data_space()); |
469 VerifyMarkbitsAreClean(heap_->code_space()); | 472 VerifyMarkbitsAreClean(heap_->code_space()); |
470 VerifyMarkbitsAreClean(heap_->cell_space()); | 473 VerifyMarkbitsAreClean(heap_->cell_space()); |
| 474 VerifyMarkbitsAreClean(heap_->property_cell_space()); |
471 VerifyMarkbitsAreClean(heap_->map_space()); | 475 VerifyMarkbitsAreClean(heap_->map_space()); |
472 VerifyMarkbitsAreClean(heap_->new_space()); | 476 VerifyMarkbitsAreClean(heap_->new_space()); |
473 | 477 |
474 LargeObjectIterator it(heap_->lo_space()); | 478 LargeObjectIterator it(heap_->lo_space()); |
475 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { | 479 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { |
476 MarkBit mark_bit = Marking::MarkBitFrom(obj); | 480 MarkBit mark_bit = Marking::MarkBitFrom(obj); |
477 CHECK(Marking::IsWhite(mark_bit)); | 481 CHECK(Marking::IsWhite(mark_bit)); |
478 CHECK_EQ(0, Page::FromAddress(obj->address())->LiveBytes()); | 482 CHECK_EQ(0, Page::FromAddress(obj->address())->LiveBytes()); |
479 } | 483 } |
480 } | 484 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 } | 526 } |
523 } | 527 } |
524 | 528 |
525 | 529 |
526 void MarkCompactCollector::ClearMarkbits() { | 530 void MarkCompactCollector::ClearMarkbits() { |
527 ClearMarkbitsInPagedSpace(heap_->code_space()); | 531 ClearMarkbitsInPagedSpace(heap_->code_space()); |
528 ClearMarkbitsInPagedSpace(heap_->map_space()); | 532 ClearMarkbitsInPagedSpace(heap_->map_space()); |
529 ClearMarkbitsInPagedSpace(heap_->old_pointer_space()); | 533 ClearMarkbitsInPagedSpace(heap_->old_pointer_space()); |
530 ClearMarkbitsInPagedSpace(heap_->old_data_space()); | 534 ClearMarkbitsInPagedSpace(heap_->old_data_space()); |
531 ClearMarkbitsInPagedSpace(heap_->cell_space()); | 535 ClearMarkbitsInPagedSpace(heap_->cell_space()); |
| 536 ClearMarkbitsInPagedSpace(heap_->property_cell_space()); |
532 ClearMarkbitsInNewSpace(heap_->new_space()); | 537 ClearMarkbitsInNewSpace(heap_->new_space()); |
533 | 538 |
534 LargeObjectIterator it(heap_->lo_space()); | 539 LargeObjectIterator it(heap_->lo_space()); |
535 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { | 540 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { |
536 MarkBit mark_bit = Marking::MarkBitFrom(obj); | 541 MarkBit mark_bit = Marking::MarkBitFrom(obj); |
537 mark_bit.Clear(); | 542 mark_bit.Clear(); |
538 mark_bit.Next().Clear(); | 543 mark_bit.Next().Clear(); |
539 Page::FromAddress(obj->address())->ResetProgressBar(); | 544 Page::FromAddress(obj->address())->ResetProgressBar(); |
540 Page::FromAddress(obj->address())->ResetLiveBytes(); | 545 Page::FromAddress(obj->address())->ResetLiveBytes(); |
541 } | 546 } |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641 | 646 |
642 | 647 |
643 const char* AllocationSpaceName(AllocationSpace space) { | 648 const char* AllocationSpaceName(AllocationSpace space) { |
644 switch (space) { | 649 switch (space) { |
645 case NEW_SPACE: return "NEW_SPACE"; | 650 case NEW_SPACE: return "NEW_SPACE"; |
646 case OLD_POINTER_SPACE: return "OLD_POINTER_SPACE"; | 651 case OLD_POINTER_SPACE: return "OLD_POINTER_SPACE"; |
647 case OLD_DATA_SPACE: return "OLD_DATA_SPACE"; | 652 case OLD_DATA_SPACE: return "OLD_DATA_SPACE"; |
648 case CODE_SPACE: return "CODE_SPACE"; | 653 case CODE_SPACE: return "CODE_SPACE"; |
649 case MAP_SPACE: return "MAP_SPACE"; | 654 case MAP_SPACE: return "MAP_SPACE"; |
650 case CELL_SPACE: return "CELL_SPACE"; | 655 case CELL_SPACE: return "CELL_SPACE"; |
| 656 case PROPERTY_CELL_SPACE: |
| 657 return "PROPERTY_CELL_SPACE"; |
651 case LO_SPACE: return "LO_SPACE"; | 658 case LO_SPACE: return "LO_SPACE"; |
652 default: | 659 default: |
653 UNREACHABLE(); | 660 UNREACHABLE(); |
654 } | 661 } |
655 | 662 |
656 return NULL; | 663 return NULL; |
657 } | 664 } |
658 | 665 |
659 | 666 |
660 // Returns zero for pages that have so little fragmentation that it is not | 667 // Returns zero for pages that have so little fragmentation that it is not |
(...skipping 1457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2118 DiscoverGreyObjectsInSpace(heap(), | 2125 DiscoverGreyObjectsInSpace(heap(), |
2119 &marking_deque_, | 2126 &marking_deque_, |
2120 heap()->map_space()); | 2127 heap()->map_space()); |
2121 if (marking_deque_.IsFull()) return; | 2128 if (marking_deque_.IsFull()) return; |
2122 | 2129 |
2123 DiscoverGreyObjectsInSpace(heap(), | 2130 DiscoverGreyObjectsInSpace(heap(), |
2124 &marking_deque_, | 2131 &marking_deque_, |
2125 heap()->cell_space()); | 2132 heap()->cell_space()); |
2126 if (marking_deque_.IsFull()) return; | 2133 if (marking_deque_.IsFull()) return; |
2127 | 2134 |
| 2135 DiscoverGreyObjectsInSpace(heap(), |
| 2136 &marking_deque_, |
| 2137 heap()->property_cell_space()); |
| 2138 if (marking_deque_.IsFull()) return; |
| 2139 |
2128 LargeObjectIterator lo_it(heap()->lo_space()); | 2140 LargeObjectIterator lo_it(heap()->lo_space()); |
2129 DiscoverGreyObjectsWithIterator(heap(), | 2141 DiscoverGreyObjectsWithIterator(heap(), |
2130 &marking_deque_, | 2142 &marking_deque_, |
2131 &lo_it); | 2143 &lo_it); |
2132 if (marking_deque_.IsFull()) return; | 2144 if (marking_deque_.IsFull()) return; |
2133 | 2145 |
2134 marking_deque_.ClearOverflowed(); | 2146 marking_deque_.ClearOverflowed(); |
2135 } | 2147 } |
2136 | 2148 |
2137 | 2149 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2211 | 2223 |
2212 PrepareForCodeFlushing(); | 2224 PrepareForCodeFlushing(); |
2213 | 2225 |
2214 if (was_marked_incrementally_) { | 2226 if (was_marked_incrementally_) { |
2215 // There is no write barrier on cells so we have to scan them now at the end | 2227 // There is no write barrier on cells so we have to scan them now at the end |
2216 // of the incremental marking. | 2228 // of the incremental marking. |
2217 { | 2229 { |
2218 HeapObjectIterator cell_iterator(heap()->cell_space()); | 2230 HeapObjectIterator cell_iterator(heap()->cell_space()); |
2219 HeapObject* cell; | 2231 HeapObject* cell; |
2220 while ((cell = cell_iterator.Next()) != NULL) { | 2232 while ((cell = cell_iterator.Next()) != NULL) { |
| 2233 ASSERT(cell->IsCell()); |
| 2234 if (IsMarked(cell)) { |
| 2235 int offset = Cell::kValueOffset; |
| 2236 MarkCompactMarkingVisitor::VisitPointer( |
| 2237 heap(), |
| 2238 reinterpret_cast<Object**>(cell->address() + offset)); |
| 2239 } |
| 2240 } |
| 2241 } |
| 2242 { |
| 2243 HeapObjectIterator js_global_property_cell_iterator( |
| 2244 heap()->property_cell_space()); |
| 2245 HeapObject* cell; |
| 2246 while ((cell = js_global_property_cell_iterator.Next()) != NULL) { |
2221 ASSERT(cell->IsJSGlobalPropertyCell()); | 2247 ASSERT(cell->IsJSGlobalPropertyCell()); |
2222 if (IsMarked(cell)) { | 2248 if (IsMarked(cell)) { |
2223 int offset = JSGlobalPropertyCell::kValueOffset; | 2249 int offset = JSGlobalPropertyCell::kValueOffset; |
2224 MarkCompactMarkingVisitor::VisitPointer( | 2250 MarkCompactMarkingVisitor::VisitPointer( |
2225 heap(), | 2251 heap(), |
2226 reinterpret_cast<Object**>(cell->address() + offset)); | 2252 reinterpret_cast<Object**>(cell->address() + offset)); |
| 2253 offset = JSGlobalPropertyCell::kTypeOffset; |
| 2254 MarkCompactMarkingVisitor::VisitPointer( |
| 2255 heap(), |
| 2256 reinterpret_cast<Object**>(cell->address() + offset)); |
2227 } | 2257 } |
2228 } | 2258 } |
2229 } | 2259 } |
2230 } | 2260 } |
2231 | 2261 |
2232 RootMarkingVisitor root_visitor(heap()); | 2262 RootMarkingVisitor root_visitor(heap()); |
2233 MarkRoots(&root_visitor); | 2263 MarkRoots(&root_visitor); |
2234 | 2264 |
2235 // The objects reachable from the roots are marked, yet unreachable | 2265 // The objects reachable from the roots are marked, yet unreachable |
2236 // objects are unmarked. Mark objects reachable due to host | 2266 // objects are unmarked. Mark objects reachable due to host |
(...skipping 1119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3356 } | 3386 } |
3357 } | 3387 } |
3358 | 3388 |
3359 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_UPDATE_MISC_POINTERS); | 3389 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_UPDATE_MISC_POINTERS); |
3360 | 3390 |
3361 // Update pointers from cells. | 3391 // Update pointers from cells. |
3362 HeapObjectIterator cell_iterator(heap_->cell_space()); | 3392 HeapObjectIterator cell_iterator(heap_->cell_space()); |
3363 for (HeapObject* cell = cell_iterator.Next(); | 3393 for (HeapObject* cell = cell_iterator.Next(); |
3364 cell != NULL; | 3394 cell != NULL; |
3365 cell = cell_iterator.Next()) { | 3395 cell = cell_iterator.Next()) { |
| 3396 if (cell->IsCell()) { |
| 3397 Address value_address = reinterpret_cast<Address>(cell) + |
| 3398 (Cell::kValueOffset - kHeapObjectTag); |
| 3399 updating_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); |
| 3400 } |
| 3401 } |
| 3402 |
| 3403 HeapObjectIterator js_global_property_cell_iterator( |
| 3404 heap_->property_cell_space()); |
| 3405 for (HeapObject* cell = js_global_property_cell_iterator.Next(); |
| 3406 cell != NULL; |
| 3407 cell = js_global_property_cell_iterator.Next()) { |
3366 if (cell->IsJSGlobalPropertyCell()) { | 3408 if (cell->IsJSGlobalPropertyCell()) { |
3367 Address value_address = | 3409 Address value_address = |
3368 reinterpret_cast<Address>(cell) + | 3410 reinterpret_cast<Address>(cell) + |
3369 (JSGlobalPropertyCell::kValueOffset - kHeapObjectTag); | 3411 (JSGlobalPropertyCell::kValueOffset - kHeapObjectTag); |
3370 updating_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); | 3412 updating_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); |
| 3413 Address type_address = |
| 3414 reinterpret_cast<Address>(cell) + |
| 3415 (JSGlobalPropertyCell::kTypeOffset - kHeapObjectTag); |
| 3416 updating_visitor.VisitPointer(reinterpret_cast<Object**>(type_address)); |
3371 } | 3417 } |
3372 } | 3418 } |
3373 | 3419 |
3374 // Update pointer from the native contexts list. | 3420 // Update pointer from the native contexts list. |
3375 updating_visitor.VisitPointer(heap_->native_contexts_list_address()); | 3421 updating_visitor.VisitPointer(heap_->native_contexts_list_address()); |
3376 | 3422 |
3377 heap_->string_table()->Iterate(&updating_visitor); | 3423 heap_->string_table()->Iterate(&updating_visitor); |
3378 | 3424 |
3379 // Update pointers from external string table. | 3425 // Update pointers from external string table. |
3380 heap_->UpdateReferencesInExternalStringTable( | 3426 heap_->UpdateReferencesInExternalStringTable( |
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4022 } | 4068 } |
4023 | 4069 |
4024 if (how_to_sweep == PARALLEL_CONSERVATIVE) { | 4070 if (how_to_sweep == PARALLEL_CONSERVATIVE) { |
4025 WaitUntilSweepingCompleted(); | 4071 WaitUntilSweepingCompleted(); |
4026 } | 4072 } |
4027 | 4073 |
4028 RemoveDeadInvalidatedCode(); | 4074 RemoveDeadInvalidatedCode(); |
4029 SweepSpace(heap()->code_space(), PRECISE); | 4075 SweepSpace(heap()->code_space(), PRECISE); |
4030 | 4076 |
4031 SweepSpace(heap()->cell_space(), PRECISE); | 4077 SweepSpace(heap()->cell_space(), PRECISE); |
| 4078 SweepSpace(heap()->property_cell_space(), PRECISE); |
4032 | 4079 |
4033 EvacuateNewSpaceAndCandidates(); | 4080 EvacuateNewSpaceAndCandidates(); |
4034 | 4081 |
4035 // ClearNonLiveTransitions depends on precise sweeping of map space to | 4082 // ClearNonLiveTransitions depends on precise sweeping of map space to |
4036 // detect whether unmarked map became dead in this collection or in one | 4083 // detect whether unmarked map became dead in this collection or in one |
4037 // of the previous ones. | 4084 // of the previous ones. |
4038 SweepSpace(heap()->map_space(), PRECISE); | 4085 SweepSpace(heap()->map_space(), PRECISE); |
4039 | 4086 |
4040 // Deallocate unmarked objects and clear marked bits for marked objects. | 4087 // Deallocate unmarked objects and clear marked bits for marked objects. |
4041 heap_->lo_space()->FreeUnmarkedObjects(); | 4088 heap_->lo_space()->FreeUnmarkedObjects(); |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4244 while (buffer != NULL) { | 4291 while (buffer != NULL) { |
4245 SlotsBuffer* next_buffer = buffer->next(); | 4292 SlotsBuffer* next_buffer = buffer->next(); |
4246 DeallocateBuffer(buffer); | 4293 DeallocateBuffer(buffer); |
4247 buffer = next_buffer; | 4294 buffer = next_buffer; |
4248 } | 4295 } |
4249 *buffer_address = NULL; | 4296 *buffer_address = NULL; |
4250 } | 4297 } |
4251 | 4298 |
4252 | 4299 |
4253 } } // namespace v8::internal | 4300 } } // namespace v8::internal |
OLD | NEW |