Index: test/cctest/test-heap.cc |
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
index 5a809721acec7ecbe0af7ce4ba00d0d757dacc1d..fb79c5484836be66fd98e8c4709beca1d47669c9 100644 |
--- a/test/cctest/test-heap.cc |
+++ b/test/cctest/test-heap.cc |
@@ -2837,3 +2837,54 @@ TEST(Regress168801) { |
HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
} |
+ |
+ |
+TEST(Regress173458) { |
+ 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)); |
+ } |
Hannes Payer (out of office)
2013/02/11 14:48:58
In the future, we may wanna have that code in a fu
Michael Starzinger
2013/02/11 15:01:33
Agreed, I'll clean that up in a follow-up CL. But
|
+ |
+ // 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 enable the debugger which in turn will disable code flushing. |
+ CHECK(ISOLATE->debug()->Load()); |
+ |
+ // This cycle will bust the heap and subsequent cycles will go ballistic. |
+ HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
+ HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
+} |