| Index: test/cctest/test-heap.cc
|
| diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc
|
| index ac121e059fe9a313e921d656918281da96d105eb..f539bacc00546b165401482a129d973b17a00c56 100644
|
| --- a/test/cctest/test-heap.cc
|
| +++ b/test/cctest/test-heap.cc
|
| @@ -1375,6 +1375,98 @@ TEST(TestCodeFlushingIncrementalAbort) {
|
| }
|
|
|
|
|
| +TEST(CompilationCacheCachingBehavior) {
|
| + // If we do not flush code, or have the compilation cache turned off, this
|
| + // test is invalid.
|
| + if (!FLAG_flush_code || !FLAG_flush_code_incrementally ||
|
| + !FLAG_compilation_cache) {
|
| + return;
|
| + }
|
| + CcTest::InitializeVM();
|
| + Isolate* isolate = CcTest::i_isolate();
|
| + Factory* factory = isolate->factory();
|
| + Heap* heap = isolate->heap();
|
| + CompilationCache* compilation_cache = isolate->compilation_cache();
|
| +
|
| + v8::HandleScope scope(CcTest::isolate());
|
| + const char* raw_source =
|
| + "function foo() {"
|
| + " var x = 42;"
|
| + " var y = 42;"
|
| + " var z = x + y;"
|
| + "};"
|
| + "foo()";
|
| + Handle<String> source = factory->InternalizeUtf8String(raw_source);
|
| + Handle<Context> native_context = isolate->native_context();
|
| +
|
| + {
|
| + v8::HandleScope scope(CcTest::isolate());
|
| + CompileRun(raw_source);
|
| + }
|
| +
|
| + // On first compilation, only a hash is inserted in the code cache. We can't
|
| + // find that value.
|
| + MaybeHandle<SharedFunctionInfo> info = compilation_cache->LookupScript(
|
| + source, Handle<Object>(), 0, 0, true, native_context);
|
| + CHECK(info.is_null());
|
| +
|
| + {
|
| + v8::HandleScope scope(CcTest::isolate());
|
| + CompileRun(raw_source);
|
| + }
|
| +
|
| + // On second compilation, the hash is replaced by a real cache entry mapping
|
| + // the source to the shared function info containing the code.
|
| + info = compilation_cache->LookupScript(source, Handle<Object>(), 0, 0, true,
|
| + native_context);
|
| + CHECK(!info.is_null());
|
| +
|
| + heap->CollectAllGarbage(Heap::kNoGCFlags);
|
| +
|
| + // On second compilation, the hash is replaced by a real cache entry mapping
|
| + // the source to the shared function info containing the code.
|
| + info = compilation_cache->LookupScript(source, Handle<Object>(), 0, 0, true,
|
| + native_context);
|
| + CHECK(!info.is_null());
|
| +
|
| + while (!info.ToHandleChecked()->code()->IsOld()) {
|
| + info.ToHandleChecked()->code()->MakeOlder(NO_MARKING_PARITY);
|
| + }
|
| +
|
| + heap->CollectAllGarbage(Heap::kNoGCFlags);
|
| + // Ensure code aging cleared the entry from the cache.
|
| + info = compilation_cache->LookupScript(source, Handle<Object>(), 0, 0, true,
|
| + native_context);
|
| + CHECK(info.is_null());
|
| +
|
| + {
|
| + v8::HandleScope scope(CcTest::isolate());
|
| + CompileRun(raw_source);
|
| + }
|
| +
|
| + // On first compilation, only a hash is inserted in the code cache. We can't
|
| + // find that value.
|
| + info = compilation_cache->LookupScript(source, Handle<Object>(), 0, 0, true,
|
| + native_context);
|
| + CHECK(info.is_null());
|
| +
|
| + for (int i = 0; i < CompilationCacheTable::kHashGenerations; i++) {
|
| + compilation_cache->MarkCompactPrologue();
|
| + }
|
| +
|
| + {
|
| + v8::HandleScope scope(CcTest::isolate());
|
| + CompileRun(raw_source);
|
| + }
|
| +
|
| + // If we aged the cache before caching the script, ensure that we didn't cache
|
| + // on next compilation.
|
| + info = compilation_cache->LookupScript(source, Handle<Object>(), 0, 0, true,
|
| + native_context);
|
| + CHECK(info.is_null());
|
| +}
|
| +
|
| +
|
| // Count the number of native contexts in the weak list of native contexts.
|
| int CountNativeContexts() {
|
| int count = 0;
|
|
|