| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index d71011668790a0d6c9eee526c2b960f27069344c..eeee03a15458dd119c021988390faaad89558fe6 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -21482,14 +21482,18 @@ TEST(ScopedMicrotasks) {
|
| env->GetIsolate()->SetMicrotasksPolicy(v8::MicrotasksPolicy::kAuto);
|
| }
|
|
|
| +#if defined(ENABLE_DISASSEMBLER) && !defined(V8_USE_EXTERNAL_STARTUP_DATA)
|
| +// FLAG_test_primary_stub_cache and FLAG_test_secondary_stub_cache are read
|
| +// only when ENABLE_DISASSEMBLER is not defined.
|
| +// These tests are valid only for no-snapshot mode.
|
|
|
| -#ifdef ENABLE_DISASSEMBLER
|
| -static int probes_counter = 0;
|
| -static int misses_counter = 0;
|
| -static int updates_counter = 0;
|
| +namespace {
|
|
|
| +int probes_counter = 0;
|
| +int misses_counter = 0;
|
| +int updates_counter = 0;
|
|
|
| -static int* LookupCounter(const char* name) {
|
| +int* LookupCounter(const char* name) {
|
| if (strcmp(name, "c:V8.MegamorphicStubCacheProbes") == 0) {
|
| return &probes_counter;
|
| } else if (strcmp(name, "c:V8.MegamorphicStubCacheMisses") == 0) {
|
| @@ -21500,24 +21504,28 @@ static int* LookupCounter(const char* name) {
|
| return NULL;
|
| }
|
|
|
| +const char* kMegamorphicTestProgram =
|
| + "function CreateClass(name) {\n"
|
| + " var src = \n"
|
| + " ` function ${name}() {};` +\n"
|
| + " ` ${name}.prototype.foo = function() {};` +\n"
|
| + " ` ${name};\\n`;\n"
|
| + " return (0, eval)(src);\n"
|
| + "}\n"
|
| + "function fooify(obj) { obj.foo(); };\n"
|
| + "var objs = [];\n"
|
| + "for (var i = 0; i < 6; i++) {\n"
|
| + " var Class = CreateClass('Class' + i);\n"
|
| + " var obj = new Class();\n"
|
| + " objs.push(obj);\n"
|
| + "}\n"
|
| + "for (var i = 0; i < 10000; i++) {\n"
|
| + " for (var obj of objs) {\n"
|
| + " fooify(obj);\n"
|
| + " }\n"
|
| + "}\n";
|
|
|
| -static const char* kMegamorphicTestProgram =
|
| - "function ClassA() { };"
|
| - "function ClassB() { };"
|
| - "ClassA.prototype.foo = function() { };"
|
| - "ClassB.prototype.foo = function() { };"
|
| - "function fooify(obj) { obj.foo(); };"
|
| - "var a = new ClassA();"
|
| - "var b = new ClassB();"
|
| - "for (var i = 0; i < 10000; i++) {"
|
| - " fooify(a);"
|
| - " fooify(b);"
|
| - "}";
|
| -#endif
|
| -
|
| -
|
| -static void StubCacheHelper(bool primary) {
|
| -#ifdef ENABLE_DISASSEMBLER
|
| +void StubCacheHelper(bool primary) {
|
| i::FLAG_native_code_counters = true;
|
| if (primary) {
|
| i::FLAG_test_primary_stub_cache = true;
|
| @@ -21525,36 +21533,46 @@ static void StubCacheHelper(bool primary) {
|
| i::FLAG_test_secondary_stub_cache = true;
|
| }
|
| i::FLAG_crankshaft = false;
|
| - LocalContext env;
|
| - env->GetIsolate()->SetCounterFunction(LookupCounter);
|
| - v8::HandleScope scope(env->GetIsolate());
|
| - int initial_probes = probes_counter;
|
| - int initial_misses = misses_counter;
|
| - int initial_updates = updates_counter;
|
| - CompileRun(kMegamorphicTestProgram);
|
| - int probes = probes_counter - initial_probes;
|
| - int misses = misses_counter - initial_misses;
|
| - int updates = updates_counter - initial_updates;
|
| - CHECK_LT(updates, 10);
|
| - CHECK_LT(misses, 10);
|
| - // TODO(verwaest): Update this test to overflow the degree of polymorphism
|
| - // before megamorphism. The number of probes will only work once we teach the
|
| - // serializer to embed references to counters in the stubs, given that the
|
| - // megamorphic_stub_cache_probes is updated in a snapshot-generated stub.
|
| - CHECK_GE(probes, 0);
|
| -#endif
|
| -}
|
| + i::FLAG_turbo = false;
|
| + v8::Isolate::CreateParams create_params;
|
| + create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
|
| + v8::Isolate* isolate = v8::Isolate::New(create_params);
|
| +
|
| + isolate->SetCounterFunction(LookupCounter);
|
|
|
| + {
|
| + v8::Isolate::Scope isolate_scope(isolate);
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(isolate);
|
|
|
| -TEST(SecondaryStubCache) {
|
| - StubCacheHelper(true);
|
| + int initial_probes = probes_counter;
|
| + int initial_misses = misses_counter;
|
| + int initial_updates = updates_counter;
|
| + CompileRun(kMegamorphicTestProgram);
|
| + int probes = probes_counter - initial_probes;
|
| + int misses = misses_counter - initial_misses;
|
| + int updates = updates_counter - initial_updates;
|
| + const int kClassesCount = 6;
|
| + // Check that updates and misses counts are bounded.
|
| + CHECK_LE(kClassesCount, updates);
|
| + CHECK_LT(updates, kClassesCount * 3);
|
| + CHECK_LE(1, misses);
|
| + CHECK_LT(misses, kClassesCount * 2);
|
| + // 2 is for PREMONOMORPHIC and MONOMORPHIC states,
|
| + // 4 is for POLYMORPHIC states,
|
| + // and all the others probes are for MEGAMORPHIC state.
|
| + CHECK_EQ(10000 * kClassesCount - 2 - 4, probes);
|
| + }
|
| + isolate->Dispose();
|
| }
|
|
|
| +} // namespace
|
|
|
| -TEST(PrimaryStubCache) {
|
| - StubCacheHelper(false);
|
| -}
|
| +UNINITIALIZED_TEST(PrimaryStubCache) { StubCacheHelper(true); }
|
| +
|
| +UNINITIALIZED_TEST(SecondaryStubCache) { StubCacheHelper(false); }
|
|
|
| +#endif // ENABLE_DISASSEMBLER && !V8_USE_EXTERNAL_STARTUP_DATA
|
|
|
| #ifdef DEBUG
|
| static int cow_arrays_created_runtime = 0;
|
|
|