| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index b5d03bc94367d67821db5962e80939d558d627ed..f28c9260b9d8ebc211381ed971db3bbfaad88977 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -114,6 +114,7 @@ Heap::Heap()
|
| amount_of_external_allocated_memory_(0),
|
| amount_of_external_allocated_memory_at_last_global_gc_(0),
|
| old_gen_exhausted_(false),
|
| + inline_allocation_disabled_(false),
|
| store_buffer_rebuilder_(store_buffer()),
|
| hidden_string_(NULL),
|
| gc_safe_size_of_old_object_(NULL),
|
| @@ -411,7 +412,7 @@ void Heap::PrintShortHeapStatistics() {
|
| this->Available() / KB,
|
| this->CommittedMemory() / KB);
|
| PrintPID("External memory reported: %6" V8_PTR_PREFIX "d KB\n",
|
| - amount_of_external_allocated_memory_ / KB);
|
| + static_cast<intptr_t>(amount_of_external_allocated_memory_ / KB));
|
| PrintPID("Total time spent in GC : %.1f ms\n", total_gc_time_ms_);
|
| }
|
|
|
| @@ -464,7 +465,7 @@ void Heap::GarbageCollectionPrologue() {
|
|
|
| store_buffer()->GCPrologue();
|
|
|
| - if (FLAG_concurrent_osr) {
|
| + if (isolate()->concurrent_osr_enabled()) {
|
| isolate()->optimizing_compiler_thread()->AgeBufferedOsrJobs();
|
| }
|
| }
|
| @@ -661,7 +662,7 @@ void Heap::CollectAllAvailableGarbage(const char* gc_reason) {
|
| // Note: as weak callbacks can execute arbitrary code, we cannot
|
| // hope that eventually there will be no weak callbacks invocations.
|
| // Therefore stop recollecting after several attempts.
|
| - if (FLAG_concurrent_recompilation) {
|
| + if (isolate()->concurrent_recompilation_enabled()) {
|
| // The optimizing compiler may be unnecessarily holding on to memory.
|
| DisallowHeapAllocation no_recursive_gc;
|
| isolate()->optimizing_compiler_thread()->Flush();
|
| @@ -762,7 +763,7 @@ bool Heap::CollectGarbage(AllocationSpace space,
|
|
|
|
|
| int Heap::NotifyContextDisposed() {
|
| - if (FLAG_concurrent_recompilation) {
|
| + if (isolate()->concurrent_recompilation_enabled()) {
|
| // Flush the queued recompilation tasks.
|
| isolate()->optimizing_compiler_thread()->Flush();
|
| }
|
| @@ -938,6 +939,8 @@ void Heap::ClearNormalizedMapCaches() {
|
|
|
|
|
| void Heap::UpdateSurvivalRateTrend(int start_new_space_size) {
|
| + if (start_new_space_size == 0) return;
|
| +
|
| double survival_rate =
|
| (static_cast<double>(young_survivors_after_last_gc_) * 100) /
|
| start_new_space_size;
|
| @@ -1781,6 +1784,8 @@ void Heap::ProcessWeakReferences(WeakObjectRetainer* retainer) {
|
| mark_compact_collector()->is_compacting();
|
| ProcessArrayBuffers(retainer, record_slots);
|
| ProcessNativeContexts(retainer, record_slots);
|
| + // TODO(mvstanton): AllocationSites only need to be processed during
|
| + // MARK_COMPACT, as they live in old space. Verify and address.
|
| ProcessAllocationSites(retainer, record_slots);
|
| }
|
|
|
| @@ -1886,7 +1891,7 @@ struct WeakListVisitor<AllocationSite> {
|
| }
|
|
|
| static void VisitLiveObject(Heap* heap,
|
| - AllocationSite* array_buffer,
|
| + AllocationSite* site,
|
| WeakObjectRetainer* retainer,
|
| bool record_slots) {}
|
|
|
| @@ -2479,7 +2484,7 @@ MaybeObject* Heap::AllocatePartialMap(InstanceType instance_type,
|
| reinterpret_cast<Map*>(result)->set_unused_property_fields(0);
|
| reinterpret_cast<Map*>(result)->set_bit_field(0);
|
| reinterpret_cast<Map*>(result)->set_bit_field2(0);
|
| - int bit_field3 = Map::EnumLengthBits::encode(Map::kInvalidEnumCache) |
|
| + int bit_field3 = Map::EnumLengthBits::encode(kInvalidEnumCacheSentinel) |
|
| Map::OwnsDescriptors::encode(true);
|
| reinterpret_cast<Map*>(result)->set_bit_field3(bit_field3);
|
| return result;
|
| @@ -2511,7 +2516,7 @@ MaybeObject* Heap::AllocateMap(InstanceType instance_type,
|
| map->set_instance_descriptors(empty_descriptor_array());
|
| map->set_bit_field(0);
|
| map->set_bit_field2(1 << Map::kIsExtensible);
|
| - int bit_field3 = Map::EnumLengthBits::encode(Map::kInvalidEnumCache) |
|
| + int bit_field3 = Map::EnumLengthBits::encode(kInvalidEnumCacheSentinel) |
|
| Map::OwnsDescriptors::encode(true);
|
| map->set_bit_field3(bit_field3);
|
| map->set_elements_kind(elements_kind);
|
| @@ -3115,6 +3120,12 @@ void Heap::CreateFixedStubs() {
|
| }
|
|
|
|
|
| +void Heap::CreateStubsRequiringBuiltins() {
|
| + HandleScope scope(isolate());
|
| + CodeStub::GenerateStubsRequiringBuiltinsAheadOfTime(isolate());
|
| +}
|
| +
|
| +
|
| bool Heap::CreateInitialObjects() {
|
| Object* obj;
|
|
|
| @@ -4598,8 +4609,7 @@ MaybeObject* Heap::AllocateJSObjectWithAllocationSite(JSFunction* constructor,
|
| // advice
|
| Map* initial_map = constructor->initial_map();
|
|
|
| - Smi* smi = Smi::cast(allocation_site->transition_info());
|
| - ElementsKind to_kind = static_cast<ElementsKind>(smi->value());
|
| + ElementsKind to_kind = allocation_site->GetElementsKind();
|
| AllocationSiteMode mode = TRACK_ALLOCATION_SITE;
|
| if (to_kind != initial_map->elements_kind()) {
|
| MaybeObject* maybe_new_map = initial_map->AsElementsKind(to_kind);
|
| @@ -6573,7 +6583,15 @@ intptr_t Heap::PromotedSpaceSizeOfObjects() {
|
| }
|
|
|
|
|
| -intptr_t Heap::PromotedExternalMemorySize() {
|
| +bool Heap::AdvanceSweepers(int step_size) {
|
| + ASSERT(isolate()->num_sweeper_threads() == 0);
|
| + bool sweeping_complete = old_data_space()->AdvanceSweeper(step_size);
|
| + sweeping_complete &= old_pointer_space()->AdvanceSweeper(step_size);
|
| + return sweeping_complete;
|
| +}
|
| +
|
| +
|
| +int64_t Heap::PromotedExternalMemorySize() {
|
| if (amount_of_external_allocated_memory_
|
| <= amount_of_external_allocated_memory_at_last_global_gc_) return 0;
|
| return amount_of_external_allocated_memory_
|
| @@ -6581,6 +6599,32 @@ intptr_t Heap::PromotedExternalMemorySize() {
|
| }
|
|
|
|
|
| +void Heap::EnableInlineAllocation() {
|
| + ASSERT(inline_allocation_disabled_);
|
| + inline_allocation_disabled_ = false;
|
| +
|
| + // Update inline allocation limit for new space.
|
| + new_space()->UpdateInlineAllocationLimit(0);
|
| +}
|
| +
|
| +
|
| +void Heap::DisableInlineAllocation() {
|
| + ASSERT(!inline_allocation_disabled_);
|
| + inline_allocation_disabled_ = true;
|
| +
|
| + // Update inline allocation limit for new space.
|
| + new_space()->UpdateInlineAllocationLimit(0);
|
| +
|
| + // Update inline allocation limit for old spaces.
|
| + PagedSpaces spaces(this);
|
| + for (PagedSpace* space = spaces.next();
|
| + space != NULL;
|
| + space = spaces.next()) {
|
| + space->EmptyAllocationInfo();
|
| + }
|
| +}
|
| +
|
| +
|
| V8_DECLARE_ONCE(initialize_gc_once);
|
|
|
| static void InitializeGCOnce() {
|
| @@ -6693,9 +6737,6 @@ bool Heap::SetUp() {
|
| store_buffer()->SetUp();
|
|
|
| if (FLAG_concurrent_recompilation) relocation_mutex_ = new Mutex;
|
| -#ifdef DEBUG
|
| - relocation_mutex_locked_by_optimizer_thread_ = false;
|
| -#endif // DEBUG
|
|
|
| return true;
|
| }
|
| @@ -6840,6 +6881,7 @@ void Heap::TearDown() {
|
| isolate_->memory_allocator()->TearDown();
|
|
|
| delete relocation_mutex_;
|
| + relocation_mutex_ = NULL;
|
| }
|
|
|
|
|
| @@ -7774,7 +7816,13 @@ void ExternalStringTable::CleanUp() {
|
|
|
|
|
| void ExternalStringTable::TearDown() {
|
| + for (int i = 0; i < new_space_strings_.length(); ++i) {
|
| + heap_->FinalizeExternalString(ExternalString::cast(new_space_strings_[i]));
|
| + }
|
| new_space_strings_.Free();
|
| + for (int i = 0; i < old_space_strings_.length(); ++i) {
|
| + heap_->FinalizeExternalString(ExternalString::cast(old_space_strings_[i]));
|
| + }
|
| old_space_strings_.Free();
|
| }
|
|
|
| @@ -7919,15 +7967,4 @@ void Heap::CheckpointObjectStats() {
|
| ClearObjectStats();
|
| }
|
|
|
| -
|
| -Heap::RelocationLock::RelocationLock(Heap* heap) : heap_(heap) {
|
| - if (FLAG_concurrent_recompilation) {
|
| - heap_->relocation_mutex_->Lock();
|
| -#ifdef DEBUG
|
| - heap_->relocation_mutex_locked_by_optimizer_thread_ =
|
| - heap_->isolate()->optimizing_compiler_thread()->IsOptimizerThread();
|
| -#endif // DEBUG
|
| - }
|
| -}
|
| -
|
| } } // namespace v8::internal
|
|
|