| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 if (FLAG_heap_stats) ReportHeapStatistics("After GC"); | 299 if (FLAG_heap_stats) ReportHeapStatistics("After GC"); |
| 300 #elif defined(ENABLE_LOGGING_AND_PROFILING) | 300 #elif defined(ENABLE_LOGGING_AND_PROFILING) |
| 301 if (FLAG_log_gc) new_space_.ReportStatistics(); | 301 if (FLAG_log_gc) new_space_.ReportStatistics(); |
| 302 #endif | 302 #endif |
| 303 } | 303 } |
| 304 #endif // defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) | 304 #endif // defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) |
| 305 | 305 |
| 306 | 306 |
| 307 void Heap::GarbageCollectionPrologue() { | 307 void Heap::GarbageCollectionPrologue() { |
| 308 TranscendentalCache::Clear(); | 308 TranscendentalCache::Clear(); |
| 309 ClearJSFunctionResultCaches(); |
| 309 gc_count_++; | 310 gc_count_++; |
| 310 unflattened_strings_length_ = 0; | 311 unflattened_strings_length_ = 0; |
| 311 #ifdef DEBUG | 312 #ifdef DEBUG |
| 312 ASSERT(allocation_allowed_ && gc_state_ == NOT_IN_GC); | 313 ASSERT(allocation_allowed_ && gc_state_ == NOT_IN_GC); |
| 313 allow_allocation(false); | 314 allow_allocation(false); |
| 314 | 315 |
| 315 if (FLAG_verify_heap) { | 316 if (FLAG_verify_heap) { |
| 316 Verify(); | 317 Verify(); |
| 317 } | 318 } |
| 318 | 319 |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 // Try shrinking and try again. | 535 // Try shrinking and try again. |
| 535 Shrink(); | 536 Shrink(); |
| 536 if (new_space_.CommitFromSpaceIfNeeded()) return; | 537 if (new_space_.CommitFromSpaceIfNeeded()) return; |
| 537 | 538 |
| 538 // Committing memory to from space failed again. | 539 // Committing memory to from space failed again. |
| 539 // Memory is exhausted and we will die. | 540 // Memory is exhausted and we will die. |
| 540 V8::FatalProcessOutOfMemory("Committing semi space failed."); | 541 V8::FatalProcessOutOfMemory("Committing semi space failed."); |
| 541 } | 542 } |
| 542 | 543 |
| 543 | 544 |
| 545 class ClearThreadJSFunctionResultCachesVisitor: public ThreadVisitor { |
| 546 virtual void VisitThread(ThreadLocalTop* top) { |
| 547 Context* context = top->context_; |
| 548 if (context == NULL) return; |
| 549 |
| 550 FixedArray* caches = |
| 551 context->global()->global_context()->jsfunction_result_caches(); |
| 552 int length = caches->length(); |
| 553 for (int i = 0; i < length; i++) { |
| 554 JSFunctionResultCache::cast(caches->get(i))->Clear(); |
| 555 } |
| 556 } |
| 557 }; |
| 558 |
| 559 |
| 560 void Heap::ClearJSFunctionResultCaches() { |
| 561 if (Bootstrapper::IsActive()) return; |
| 562 ClearThreadJSFunctionResultCachesVisitor visitor; |
| 563 ThreadManager::IterateThreads(&visitor); |
| 564 } |
| 565 |
| 566 |
| 544 void Heap::PerformGarbageCollection(AllocationSpace space, | 567 void Heap::PerformGarbageCollection(AllocationSpace space, |
| 545 GarbageCollector collector, | 568 GarbageCollector collector, |
| 546 GCTracer* tracer) { | 569 GCTracer* tracer) { |
| 547 VerifySymbolTable(); | 570 VerifySymbolTable(); |
| 548 if (collector == MARK_COMPACTOR && global_gc_prologue_callback_) { | 571 if (collector == MARK_COMPACTOR && global_gc_prologue_callback_) { |
| 549 ASSERT(!allocation_allowed_); | 572 ASSERT(!allocation_allowed_); |
| 550 GCTracer::ExternalScope scope(tracer); | 573 GCTracer::ExternalScope scope(tracer); |
| 551 global_gc_prologue_callback_(); | 574 global_gc_prologue_callback_(); |
| 552 } | 575 } |
| 553 | 576 |
| (...skipping 3810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4364 void ExternalStringTable::TearDown() { | 4387 void ExternalStringTable::TearDown() { |
| 4365 new_space_strings_.Free(); | 4388 new_space_strings_.Free(); |
| 4366 old_space_strings_.Free(); | 4389 old_space_strings_.Free(); |
| 4367 } | 4390 } |
| 4368 | 4391 |
| 4369 | 4392 |
| 4370 List<Object*> ExternalStringTable::new_space_strings_; | 4393 List<Object*> ExternalStringTable::new_space_strings_; |
| 4371 List<Object*> ExternalStringTable::old_space_strings_; | 4394 List<Object*> ExternalStringTable::old_space_strings_; |
| 4372 | 4395 |
| 4373 } } // namespace v8::internal | 4396 } } // namespace v8::internal |
| OLD | NEW |