Chromium Code Reviews| 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); |
| +} |