Index: test/cctest/test-heap.cc |
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
index 9e4e90721c69bc84f9a92d95f951430397784fae..394ebd3c100fe56045016ffe325539483ba23ab4 100644 |
--- a/test/cctest/test-heap.cc |
+++ b/test/cctest/test-heap.cc |
@@ -1037,6 +1037,7 @@ TEST(TestCodeFlushing) { |
// If we do not flush code this test is invalid. |
if (!FLAG_flush_code) return; |
i::FLAG_allow_natives_syntax = true; |
+ i::FLAG_force_memory_constrained = MaybeBoolFlag::Create(true, false); |
CcTest::InitializeVM(); |
Isolate* isolate = Isolate::Current(); |
Factory* factory = isolate->factory(); |
@@ -1082,10 +1083,71 @@ TEST(TestCodeFlushing) { |
} |
+TEST(TestCodeFlushingPreAged) { |
+ // If we do not flush code this test is invalid. |
+ if (!FLAG_flush_code) return; |
+ i::FLAG_allow_natives_syntax = true; |
+ i::FLAG_force_memory_constrained = MaybeBoolFlag::Create(true, true); |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = Isolate::Current(); |
+ Factory* factory = isolate->factory(); |
+ v8::HandleScope scope(CcTest::isolate()); |
+ const char* source = "function foo() {" |
+ " var x = 42;" |
+ " var y = 42;" |
+ " var z = x + y;" |
+ "};" |
+ "foo()"; |
+ Handle<String> foo_name = factory->InternalizeUtf8String("foo"); |
+ |
+ // This compile will add the code to the compilation cache. |
+ { v8::HandleScope scope(CcTest::isolate()); |
+ CompileRun(source); |
+ } |
+ |
+ // Check function is compiled. |
+ Object* func_value = Isolate::Current()->context()->global_object()-> |
+ GetProperty(*foo_name)->ToObjectChecked(); |
+ CHECK(func_value->IsJSFunction()); |
+ Handle<JSFunction> function(JSFunction::cast(func_value)); |
+ CHECK(function->shared()->is_compiled()); |
+ |
+ // The code will survive at least one GC (it will be pre-aged so may not |
+ // survive further). |
+ HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
+ CHECK(function->shared()->is_compiled()); |
+ |
+ // Execute the function again to ensure it is reset to the young age. |
+ { v8::HandleScope scope(CcTest::isolate()); |
+ CompileRun("foo();"); |
+ } |
+ |
+ // The code will survive at least two GC now that it is young again. |
+ HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
+ HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
+ CHECK(function->shared()->is_compiled()); |
+ |
+ // Simulate several GCs that use full marking. |
+ const int kAgingThreshold = 6; |
+ for (int i = 0; i < kAgingThreshold; i++) { |
+ HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
+ } |
+ |
+ // foo should no longer be in the compilation cache |
+ CHECK(!function->shared()->is_compiled() || function->IsOptimized()); |
+ CHECK(!function->is_compiled() || function->IsOptimized()); |
+ // Call foo to get it recompiled. |
+ CompileRun("foo()"); |
+ CHECK(function->shared()->is_compiled()); |
+ CHECK(function->is_compiled()); |
+} |
+ |
+ |
TEST(TestCodeFlushingIncremental) { |
// If we do not flush code this test is invalid. |
if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
i::FLAG_allow_natives_syntax = true; |
+ i::FLAG_force_memory_constrained = MaybeBoolFlag::Create(true, false); |
CcTest::InitializeVM(); |
Isolate* isolate = Isolate::Current(); |
Factory* factory = isolate->factory(); |
@@ -1154,6 +1216,7 @@ TEST(TestCodeFlushingIncrementalScavenge) { |
// If we do not flush code this test is invalid. |
if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
i::FLAG_allow_natives_syntax = true; |
+ i::FLAG_force_memory_constrained = MaybeBoolFlag::Create(true, false); |
CcTest::InitializeVM(); |
Isolate* isolate = Isolate::Current(); |
Factory* factory = isolate->factory(); |
@@ -1222,6 +1285,7 @@ TEST(TestCodeFlushingIncrementalAbort) { |
// If we do not flush code this test is invalid. |
if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
i::FLAG_allow_natives_syntax = true; |
+ i::FLAG_force_memory_constrained = MaybeBoolFlag::Create(true, false); |
CcTest::InitializeVM(); |
Isolate* isolate = Isolate::Current(); |
Factory* factory = isolate->factory(); |