diff --git a/include/v8-version.h b/include/v8-version.h index 764cbc55ec5..130a93c05ed 100644 --- a/include/v8-version.h +++ b/include/v8-version.h @@ -11,7 +11,7 @@ #define V8_MAJOR_VERSION 5 #define V8_MINOR_VERSION 0 #define V8_BUILD_NUMBER 71 -#define V8_PATCH_LEVEL 34 +#define V8_PATCH_LEVEL 35 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) diff --git a/src/heap/heap.cc b/src/heap/heap.cc index ad6c451cbe8..1c9be1aa49a 100644 --- a/src/heap/heap.cc +++ b/src/heap/heap.cc @@ -3069,6 +3069,9 @@ void Heap::CreateFillerObjectAt(Address addr, int size) { bool Heap::CanMoveObjectStart(HeapObject* object) { if (!FLAG_move_object_start) return false; + // Sampling heap profiler may have a reference to the object. + if (isolate()->heap_profiler()->is_sampling_allocations()) return false; + Address address = object->address(); if (lo_space()->Contains(object)) return false; diff --git a/src/profiler/heap-profiler.h b/src/profiler/heap-profiler.h index 74539ae1427..32e143c74ff 100644 --- a/src/profiler/heap-profiler.h +++ b/src/profiler/heap-profiler.h @@ -32,6 +32,7 @@ class HeapProfiler { bool StartSamplingHeapProfiler(uint64_t sample_interval, int stack_depth); void StopSamplingHeapProfiler(); + bool is_sampling_allocations() { return !sampling_heap_profiler_.is_empty(); } AllocationProfile* GetAllocationProfile(); void StartHeapObjectsTracking(bool track_allocations); diff --git a/test/cctest/test-heap-profiler.cc b/test/cctest/test-heap-profiler.cc index 87119b85713..2632593ec68 100644 --- a/test/cctest/test-heap-profiler.cc +++ b/test/cctest/test-heap-profiler.cc @@ -3010,3 +3010,28 @@ TEST(SamplingHeapProfilerApiAllocation) { heap_profiler->StopSamplingHeapProfiler(); } + +TEST(SamplingHeapProfilerLeftTrimming) { + v8::HandleScope scope(v8::Isolate::GetCurrent()); + LocalContext env; + v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); + + // Suppress randomness to avoid flakiness in tests. + v8::internal::FLAG_sampling_heap_profiler_suppress_randomness = true; + + heap_profiler->StartSamplingHeapProfiler(64); + + CompileRun( + "for (var j = 0; j < 500; ++j) {\n" + " var a = [];\n" + " for (var i = 0; i < 5; ++i)\n" + " a[i] = i;\n" + " for (var i = 0; i < 3; ++i)\n" + " a.shift();\n" + "}\n"); + + CcTest::heap()->CollectGarbage(v8::internal::NEW_SPACE); + // Should not crash. + + heap_profiler->StopSamplingHeapProfiler(); +}