| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 19477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19488 constraints.set_max_old_space_size(4); | 19488 constraints.set_max_old_space_size(4); |
| 19489 v8::SetResourceConstraints(CcTest::isolate(), &constraints); | 19489 v8::SetResourceConstraints(CcTest::isolate(), &constraints); |
| 19490 break; | 19490 break; |
| 19491 } | 19491 } |
| 19492 | 19492 |
| 19493 case SetFatalHandler: | 19493 case SetFatalHandler: |
| 19494 v8::V8::SetFatalErrorHandler(NULL); | 19494 v8::V8::SetFatalErrorHandler(NULL); |
| 19495 break; | 19495 break; |
| 19496 | 19496 |
| 19497 case SetCounterFunction: | 19497 case SetCounterFunction: |
| 19498 v8::V8::SetCounterFunction(NULL); | 19498 CcTest::isolate()->SetCounterFunction(NULL); |
| 19499 break; | 19499 break; |
| 19500 | 19500 |
| 19501 case SetCreateHistogramFunction: | 19501 case SetCreateHistogramFunction: |
| 19502 v8::V8::SetCreateHistogramFunction(NULL); | 19502 CcTest::isolate()->SetCreateHistogramFunction(NULL); |
| 19503 break; | 19503 break; |
| 19504 | 19504 |
| 19505 case SetAddHistogramSampleFunction: | 19505 case SetAddHistogramSampleFunction: |
| 19506 v8::V8::SetAddHistogramSampleFunction(NULL); | 19506 CcTest::isolate()->SetAddHistogramSampleFunction(NULL); |
| 19507 break; | 19507 break; |
| 19508 } | 19508 } |
| 19509 isolate->Exit(); | 19509 isolate->Exit(); |
| 19510 isolate->Dispose(); | 19510 isolate->Dispose(); |
| 19511 result_ = true; | 19511 result_ = true; |
| 19512 } | 19512 } |
| 19513 | 19513 |
| 19514 bool result() { return result_; } | 19514 bool result() { return result_; } |
| 19515 | 19515 |
| 19516 private: | 19516 private: |
| (...skipping 1362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20879 CompileRun("var obj = {};" | 20879 CompileRun("var obj = {};" |
| 20880 "Object.observe(obj, function(changes) { debugger; });" | 20880 "Object.observe(obj, function(changes) { debugger; });" |
| 20881 "obj.a = 0;"); | 20881 "obj.a = 0;"); |
| 20882 } | 20882 } |
| 20883 isolate->RunMicrotasks(); | 20883 isolate->RunMicrotasks(); |
| 20884 isolate->SetAutorunMicrotasks(true); | 20884 isolate->SetAutorunMicrotasks(true); |
| 20885 v8::Debug::SetDebugEventListener(NULL); | 20885 v8::Debug::SetDebugEventListener(NULL); |
| 20886 } | 20886 } |
| 20887 | 20887 |
| 20888 | 20888 |
| 20889 #ifdef DEBUG |
| 20889 static int probes_counter = 0; | 20890 static int probes_counter = 0; |
| 20890 static int misses_counter = 0; | 20891 static int misses_counter = 0; |
| 20891 static int updates_counter = 0; | 20892 static int updates_counter = 0; |
| 20892 | 20893 |
| 20893 | 20894 |
| 20894 static int* LookupCounter(const char* name) { | 20895 static int* LookupCounter(const char* name) { |
| 20895 if (strcmp(name, "c:V8.MegamorphicStubCacheProbes") == 0) { | 20896 if (strcmp(name, "c:V8.MegamorphicStubCacheProbes") == 0) { |
| 20896 return &probes_counter; | 20897 return &probes_counter; |
| 20897 } else if (strcmp(name, "c:V8.MegamorphicStubCacheMisses") == 0) { | 20898 } else if (strcmp(name, "c:V8.MegamorphicStubCacheMisses") == 0) { |
| 20898 return &misses_counter; | 20899 return &misses_counter; |
| 20899 } else if (strcmp(name, "c:V8.MegamorphicStubCacheUpdates") == 0) { | 20900 } else if (strcmp(name, "c:V8.MegamorphicStubCacheUpdates") == 0) { |
| 20900 return &updates_counter; | 20901 return &updates_counter; |
| 20901 } | 20902 } |
| 20902 return NULL; | 20903 return NULL; |
| 20903 } | 20904 } |
| 20904 | 20905 |
| 20905 | 20906 |
| 20906 static const char* kMegamorphicTestProgram = | 20907 static const char* kMegamorphicTestProgram = |
| 20907 "function ClassA() { };" | 20908 "function ClassA() { };" |
| 20908 "function ClassB() { };" | 20909 "function ClassB() { };" |
| 20909 "ClassA.prototype.foo = function() { };" | 20910 "ClassA.prototype.foo = function() { };" |
| 20910 "ClassB.prototype.foo = function() { };" | 20911 "ClassB.prototype.foo = function() { };" |
| 20911 "function fooify(obj) { obj.foo(); };" | 20912 "function fooify(obj) { obj.foo(); };" |
| 20912 "var a = new ClassA();" | 20913 "var a = new ClassA();" |
| 20913 "var b = new ClassB();" | 20914 "var b = new ClassB();" |
| 20914 "for (var i = 0; i < 10000; i++) {" | 20915 "for (var i = 0; i < 10000; i++) {" |
| 20915 " fooify(a);" | 20916 " fooify(a);" |
| 20916 " fooify(b);" | 20917 " fooify(b);" |
| 20917 "}"; | 20918 "}"; |
| 20919 #endif |
| 20918 | 20920 |
| 20919 | 20921 |
| 20920 static void StubCacheHelper(bool primary) { | 20922 static void StubCacheHelper(bool primary) { |
| 20921 V8::SetCounterFunction(LookupCounter); | |
| 20922 USE(kMegamorphicTestProgram); | |
| 20923 #ifdef DEBUG | 20923 #ifdef DEBUG |
| 20924 i::FLAG_native_code_counters = true; | 20924 i::FLAG_native_code_counters = true; |
| 20925 if (primary) { | 20925 if (primary) { |
| 20926 i::FLAG_test_primary_stub_cache = true; | 20926 i::FLAG_test_primary_stub_cache = true; |
| 20927 } else { | 20927 } else { |
| 20928 i::FLAG_test_secondary_stub_cache = true; | 20928 i::FLAG_test_secondary_stub_cache = true; |
| 20929 } | 20929 } |
| 20930 i::FLAG_crankshaft = false; | 20930 i::FLAG_crankshaft = false; |
| 20931 LocalContext env; | 20931 LocalContext env; |
| 20932 env->GetIsolate()->SetCounterFunction(LookupCounter); |
| 20932 v8::HandleScope scope(env->GetIsolate()); | 20933 v8::HandleScope scope(env->GetIsolate()); |
| 20933 int initial_probes = probes_counter; | 20934 int initial_probes = probes_counter; |
| 20934 int initial_misses = misses_counter; | 20935 int initial_misses = misses_counter; |
| 20935 int initial_updates = updates_counter; | 20936 int initial_updates = updates_counter; |
| 20936 CompileRun(kMegamorphicTestProgram); | 20937 CompileRun(kMegamorphicTestProgram); |
| 20937 int probes = probes_counter - initial_probes; | 20938 int probes = probes_counter - initial_probes; |
| 20938 int misses = misses_counter - initial_misses; | 20939 int misses = misses_counter - initial_misses; |
| 20939 int updates = updates_counter - initial_updates; | 20940 int updates = updates_counter - initial_updates; |
| 20940 CHECK_LT(updates, 10); | 20941 CHECK_LT(updates, 10); |
| 20941 CHECK_LT(misses, 10); | 20942 CHECK_LT(misses, 10); |
| 20942 // TODO(verwaest): Update this test to overflow the degree of polymorphism | 20943 // TODO(verwaest): Update this test to overflow the degree of polymorphism |
| 20943 // before megamorphism. The number of probes will only work once we teach the | 20944 // before megamorphism. The number of probes will only work once we teach the |
| 20944 // serializer to embed references to counters in the stubs, given that the | 20945 // serializer to embed references to counters in the stubs, given that the |
| 20945 // megamorphic_stub_cache_probes is updated in a snapshot-generated stub. | 20946 // megamorphic_stub_cache_probes is updated in a snapshot-generated stub. |
| 20946 CHECK_GE(probes, 0); | 20947 CHECK_GE(probes, 0); |
| 20947 #endif | 20948 #endif |
| 20948 } | 20949 } |
| 20949 | 20950 |
| 20950 | 20951 |
| 20951 TEST(SecondaryStubCache) { | 20952 TEST(SecondaryStubCache) { |
| 20952 StubCacheHelper(true); | 20953 StubCacheHelper(true); |
| 20953 } | 20954 } |
| 20954 | 20955 |
| 20955 | 20956 |
| 20956 TEST(PrimaryStubCache) { | 20957 TEST(PrimaryStubCache) { |
| 20957 StubCacheHelper(false); | 20958 StubCacheHelper(false); |
| 20958 } | 20959 } |
| 20959 | 20960 |
| 20960 | 20961 |
| 20962 #ifdef DEBUG |
| 20961 static int cow_arrays_created_runtime = 0; | 20963 static int cow_arrays_created_runtime = 0; |
| 20962 | 20964 |
| 20963 | 20965 |
| 20964 static int* LookupCounterCOWArrays(const char* name) { | 20966 static int* LookupCounterCOWArrays(const char* name) { |
| 20965 if (strcmp(name, "c:V8.COWArraysCreatedRuntime") == 0) { | 20967 if (strcmp(name, "c:V8.COWArraysCreatedRuntime") == 0) { |
| 20966 return &cow_arrays_created_runtime; | 20968 return &cow_arrays_created_runtime; |
| 20967 } | 20969 } |
| 20968 return NULL; | 20970 return NULL; |
| 20969 } | 20971 } |
| 20972 #endif |
| 20970 | 20973 |
| 20971 | 20974 |
| 20972 TEST(CheckCOWArraysCreatedRuntimeCounter) { | 20975 TEST(CheckCOWArraysCreatedRuntimeCounter) { |
| 20973 V8::SetCounterFunction(LookupCounterCOWArrays); | |
| 20974 #ifdef DEBUG | 20976 #ifdef DEBUG |
| 20975 i::FLAG_native_code_counters = true; | 20977 i::FLAG_native_code_counters = true; |
| 20976 LocalContext env; | 20978 LocalContext env; |
| 20979 env->GetIsolate()->SetCounterFunction(LookupCounterCOWArrays); |
| 20977 v8::HandleScope scope(env->GetIsolate()); | 20980 v8::HandleScope scope(env->GetIsolate()); |
| 20978 int initial_cow_arrays = cow_arrays_created_runtime; | 20981 int initial_cow_arrays = cow_arrays_created_runtime; |
| 20979 CompileRun("var o = [1, 2, 3];"); | 20982 CompileRun("var o = [1, 2, 3];"); |
| 20980 CHECK_EQ(1, cow_arrays_created_runtime - initial_cow_arrays); | 20983 CHECK_EQ(1, cow_arrays_created_runtime - initial_cow_arrays); |
| 20981 CompileRun("var o = {foo: [4, 5, 6], bar: [3, 0]};"); | 20984 CompileRun("var o = {foo: [4, 5, 6], bar: [3, 0]};"); |
| 20982 CHECK_EQ(3, cow_arrays_created_runtime - initial_cow_arrays); | 20985 CHECK_EQ(3, cow_arrays_created_runtime - initial_cow_arrays); |
| 20983 CompileRun("var o = {foo: [1, 2, 3, [4, 5, 6]], bar: 'hi'};"); | 20986 CompileRun("var o = {foo: [1, 2, 3, [4, 5, 6]], bar: 'hi'};"); |
| 20984 CHECK_EQ(4, cow_arrays_created_runtime - initial_cow_arrays); | 20987 CHECK_EQ(4, cow_arrays_created_runtime - initial_cow_arrays); |
| 20985 #endif | 20988 #endif |
| 20986 } | 20989 } |
| (...skipping 1904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22891 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); | 22894 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); |
| 22892 Local<Function> set = | 22895 Local<Function> set = |
| 22893 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); | 22896 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); |
| 22894 Local<Function> get = | 22897 Local<Function> get = |
| 22895 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); | 22898 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); |
| 22896 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); | 22899 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); |
| 22897 Handle<Value> args[] = { v8_num(14) }; | 22900 Handle<Value> args[] = { v8_num(14) }; |
| 22898 set->Call(x, 1, args); | 22901 set->Call(x, 1, args); |
| 22899 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); | 22902 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); |
| 22900 } | 22903 } |
| OLD | NEW |