Index: test/cctest/test-heap.cc |
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
index d6f08c3eac2083ffeaedea105c7178cbcccfce86..f97bf17219a903143d00a13faef5d1b3eedd5998 100644 |
--- a/test/cctest/test-heap.cc |
+++ b/test/cctest/test-heap.cc |
@@ -1593,3 +1593,90 @@ TEST(PrototypeTransitionClearing) { |
HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
CHECK(map->GetPrototypeTransition(*prototype)->IsMap()); |
} |
+ |
+ |
+TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { |
+ i::FLAG_allow_natives_syntax = true; |
+#ifdef DEBUG |
+ i::FLAG_verify_heap = true; |
+#endif |
+ InitializeVM(); |
+ if (!i::V8::UseCrankshaft()) return; |
+ v8::HandleScope outer_scope; |
+ |
+ { |
+ v8::HandleScope scope; |
+ CompileRun( |
+ "function f () {" |
+ " var s = 0;" |
+ " for (var i = 0; i < 100; i++) s += i;" |
+ " return s;" |
+ "}" |
+ "f(); f();" |
+ "%OptimizeFunctionOnNextCall(f);" |
+ "f();"); |
+ } |
+ Handle<JSFunction> f = |
+ v8::Utils::OpenHandle( |
+ *v8::Handle<v8::Function>::Cast( |
+ v8::Context::GetCurrent()->Global()->Get(v8_str("f")))); |
+ CHECK(f->IsOptimized()); |
+ |
+ IncrementalMarking* marking = HEAP->incremental_marking(); |
+ marking->Abort(); |
+ marking->Start(); |
+ |
+ // The following two calls will increment HEAP->global_ic_age(). |
+ const int kLongIdlePauseInMs = 1000; |
+ v8::V8::ContextDisposedNotification(); |
+ v8::V8::IdleNotification(kLongIdlePauseInMs); |
+ |
+ while (!marking->IsStopped() && !marking->IsComplete()) { |
+ marking->Step(1 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
+ } |
+ |
+ CHECK_EQ(HEAP->global_ic_age(), f->shared()->ic_age()); |
+ CHECK_EQ(0, f->shared()->opt_count()); |
+ CHECK_EQ(0, f->shared()->code()->profiler_ticks()); |
+} |
+ |
+ |
+TEST(ResetSharedFunctionInfoCountersDuringMarkSweep) { |
+ i::FLAG_allow_natives_syntax = true; |
+#ifdef DEBUG |
+ i::FLAG_verify_heap = true; |
+#endif |
+ InitializeVM(); |
+ if (!i::V8::UseCrankshaft()) return; |
+ v8::HandleScope outer_scope; |
+ |
+ { |
+ v8::HandleScope scope; |
+ CompileRun( |
+ "function f () {" |
+ " var s = 0;" |
+ " for (var i = 0; i < 100; i++) s += i;" |
+ " return s;" |
+ "}" |
+ "f(); f();" |
+ "%OptimizeFunctionOnNextCall(f);" |
+ "f();"); |
+ } |
+ Handle<JSFunction> f = |
+ v8::Utils::OpenHandle( |
+ *v8::Handle<v8::Function>::Cast( |
+ v8::Context::GetCurrent()->Global()->Get(v8_str("f")))); |
+ CHECK(f->IsOptimized()); |
+ |
+ HEAP->incremental_marking()->Abort(); |
+ |
+ // The following two calls will increment HEAP->global_ic_age(). |
+ // Since incremental marking is off, IdleNotification will do full GC. |
+ const int kLongIdlePauseInMs = 1000; |
+ v8::V8::ContextDisposedNotification(); |
+ v8::V8::IdleNotification(kLongIdlePauseInMs); |
+ |
+ CHECK_EQ(HEAP->global_ic_age(), f->shared()->ic_age()); |
+ CHECK_EQ(0, f->shared()->opt_count()); |
+ CHECK_EQ(0, f->shared()->code()->profiler_ticks()); |
+} |