Index: test/cctest/test-heap.cc |
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
index eb4f07245a9c9927a800b13d834ab0d73189dadc..88ff1d4e53bd76ea4da687e449265395a1d7e947 100644 |
--- a/test/cctest/test-heap.cc |
+++ b/test/cctest/test-heap.cc |
@@ -2778,3 +2778,57 @@ TEST(Regress169928) { |
AlwaysAllocateScope aa_scope; |
v8::Script::Compile(mote_code_string)->Run(); |
} |
+ |
+ |
+TEST(Regress168801) { |
+ i::FLAG_always_compact = true; |
+ i::FLAG_cache_optimized_code = false; |
+ i::FLAG_allow_natives_syntax = true; |
+ i::FLAG_flush_code_incrementally = true; |
+ InitializeVM(); |
+ v8::HandleScope scope; |
+ |
+ // Perform one initial GC to enable code flushing. |
+ HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
+ |
+ // Ensure the code ends up on an evacuation candidate. |
+ SimulateFullSpace(HEAP->code_space()); |
+ |
+ // Prepare an unoptimized function that is eligible for code flushing. |
+ Handle<JSFunction> function; |
+ { |
+ HandleScope inner_scope; |
+ CompileRun("function mkClosure() {" |
+ " return function(x) { return x + 1; };" |
+ "}" |
+ "var f = mkClosure();" |
+ "f(1); f(2);"); |
+ |
+ Handle<JSFunction> f = |
+ v8::Utils::OpenHandle( |
+ *v8::Handle<v8::Function>::Cast( |
+ v8::Context::GetCurrent()->Global()->Get(v8_str("f")))); |
+ CHECK(f->is_compiled()); |
+ const int kAgingThreshold = 6; |
+ for (int i = 0; i < kAgingThreshold; i++) { |
+ f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); |
+ } |
+ |
+ function = inner_scope.CloseAndEscape(handle(*f, ISOLATE)); |
+ } |
+ |
+ // Simulate incremental marking so that unoptimized function is enqueued as a |
+ // candidate for code flushing. The shared function info however will not be |
+ // explicitly enqueued. |
+ SimulateIncrementalMarking(); |
+ |
+ // Now optimize the function so that it is taken off the candidate list. |
+ { |
+ HandleScope inner_scope; |
+ CompileRun("%OptimizeFunctionOnNextCall(f); f(3);"); |
+ } |
+ |
+ // This cycle will bust the heap and subsequent cycles will go ballistic. |
+ HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
+ HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
+} |