Chromium Code Reviews| Index: test/cctest/test-heap.cc |
| diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
| index eb4f07245a9c9927a800b13d834ab0d73189dadc..d206958f1f8fe9962fbf0e6888ac2a0a0265edc0 100644 |
| --- a/test/cctest/test-heap.cc |
| +++ b/test/cctest/test-heap.cc |
| @@ -2778,3 +2778,58 @@ 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()); |
| + CompileRun("var x = 0;"); |
|
Hannes Payer (out of office)
2013/01/23 16:03:41
CompileRun needed?
Michael Starzinger
2013/01/23 16:16:03
Done.
|
| + |
| + // 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); |
| +} |