Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: test/cctest/heap/test-heap.cc

Issue 2900603004: [heap] Add --stress-incremental-marking flag. (Closed)
Patch Set: fix test Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/cctest/heap/test-compaction.cc ('k') | test/cctest/heap/test-incremental-marking.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 const v8::WeakCallbackInfo<void>& data) { 482 const v8::WeakCallbackInfo<void>& data) {
483 std::pair<v8::Persistent<v8::Value>*, int>* p = 483 std::pair<v8::Persistent<v8::Value>*, int>* p =
484 reinterpret_cast<std::pair<v8::Persistent<v8::Value>*, int>*>( 484 reinterpret_cast<std::pair<v8::Persistent<v8::Value>*, int>*>(
485 data.GetParameter()); 485 data.GetParameter());
486 if (p->second == 1234) WeakPointerCleared = true; 486 if (p->second == 1234) WeakPointerCleared = true;
487 p->first->Reset(); 487 p->first->Reset();
488 } 488 }
489 489
490 490
491 TEST(WeakGlobalHandlesScavenge) { 491 TEST(WeakGlobalHandlesScavenge) {
492 i::FLAG_stress_compaction = false; 492 FLAG_stress_compaction = false;
493 FLAG_stress_incremental_marking = false;
493 CcTest::InitializeVM(); 494 CcTest::InitializeVM();
494 Isolate* isolate = CcTest::i_isolate(); 495 Isolate* isolate = CcTest::i_isolate();
495 Factory* factory = isolate->factory(); 496 Factory* factory = isolate->factory();
496 GlobalHandles* global_handles = isolate->global_handles(); 497 GlobalHandles* global_handles = isolate->global_handles();
497 498
498 WeakPointerCleared = false; 499 WeakPointerCleared = false;
499 500
500 Handle<Object> h1; 501 Handle<Object> h1;
501 Handle<Object> h2; 502 Handle<Object> h2;
502 503
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 648
648 CcTest::CollectGarbage(NEW_SPACE); 649 CcTest::CollectGarbage(NEW_SPACE);
649 650
650 CHECK(!WeakPointerCleared); 651 CHECK(!WeakPointerCleared);
651 CHECK(!global_handles->IsNearDeath(h1.location())); 652 CHECK(!global_handles->IsNearDeath(h1.location()));
652 653
653 GlobalHandles::Destroy(h1.location()); 654 GlobalHandles::Destroy(h1.location());
654 } 655 }
655 656
656 TEST(WeakGlobalHandlesMark) { 657 TEST(WeakGlobalHandlesMark) {
658 FLAG_stress_incremental_marking = false;
657 CcTest::InitializeVM(); 659 CcTest::InitializeVM();
658 Isolate* isolate = CcTest::i_isolate(); 660 Isolate* isolate = CcTest::i_isolate();
659 Heap* heap = isolate->heap(); 661 Heap* heap = isolate->heap();
660 Factory* factory = isolate->factory(); 662 Factory* factory = isolate->factory();
661 GlobalHandles* global_handles = isolate->global_handles(); 663 GlobalHandles* global_handles = isolate->global_handles();
662 664
663 WeakPointerCleared = false; 665 WeakPointerCleared = false;
664 666
665 Handle<Object> h1; 667 Handle<Object> h1;
666 Handle<Object> h2; 668 Handle<Object> h2;
(...skipping 26 matching lines...) Expand all
693 CHECK((*h1)->IsString()); 695 CHECK((*h1)->IsString());
694 696
695 CHECK(WeakPointerCleared); 697 CHECK(WeakPointerCleared);
696 CHECK(!GlobalHandles::IsNearDeath(h1.location())); 698 CHECK(!GlobalHandles::IsNearDeath(h1.location()));
697 699
698 GlobalHandles::Destroy(h1.location()); 700 GlobalHandles::Destroy(h1.location());
699 } 701 }
700 702
701 703
702 TEST(DeleteWeakGlobalHandle) { 704 TEST(DeleteWeakGlobalHandle) {
703 i::FLAG_stress_compaction = false; 705 FLAG_stress_compaction = false;
706 FLAG_stress_incremental_marking = false;
704 CcTest::InitializeVM(); 707 CcTest::InitializeVM();
705 Isolate* isolate = CcTest::i_isolate(); 708 Isolate* isolate = CcTest::i_isolate();
706 Factory* factory = isolate->factory(); 709 Factory* factory = isolate->factory();
707 GlobalHandles* global_handles = isolate->global_handles(); 710 GlobalHandles* global_handles = isolate->global_handles();
708 711
709 WeakPointerCleared = false; 712 WeakPointerCleared = false;
710 713
711 Handle<Object> h; 714 Handle<Object> h;
712 715
713 { 716 {
(...skipping 18 matching lines...) Expand all
732 735
733 CHECK(WeakPointerCleared); 736 CHECK(WeakPointerCleared);
734 } 737 }
735 738
736 TEST(BytecodeArray) { 739 TEST(BytecodeArray) {
737 static const uint8_t kRawBytes[] = {0xc3, 0x7e, 0xa5, 0x5a}; 740 static const uint8_t kRawBytes[] = {0xc3, 0x7e, 0xa5, 0x5a};
738 static const int kRawBytesSize = sizeof(kRawBytes); 741 static const int kRawBytesSize = sizeof(kRawBytes);
739 static const int kFrameSize = 32; 742 static const int kFrameSize = 32;
740 static const int kParameterCount = 2; 743 static const int kParameterCount = 2;
741 744
742 i::FLAG_manual_evacuation_candidates_selection = true; 745 FLAG_manual_evacuation_candidates_selection = true;
746 FLAG_stress_incremental_marking = false;
743 CcTest::InitializeVM(); 747 CcTest::InitializeVM();
744 Isolate* isolate = CcTest::i_isolate(); 748 Isolate* isolate = CcTest::i_isolate();
745 Heap* heap = isolate->heap(); 749 Heap* heap = isolate->heap();
746 Factory* factory = isolate->factory(); 750 Factory* factory = isolate->factory();
747 HandleScope scope(isolate); 751 HandleScope scope(isolate);
748 752
749 heap::SimulateFullSpace(heap->old_space()); 753 heap::SimulateFullSpace(heap->old_space());
750 Handle<FixedArray> constant_pool = factory->NewFixedArray(5, TENURED); 754 Handle<FixedArray> constant_pool = factory->NewFixedArray(5, TENURED);
751 for (int i = 0; i < 5; i++) { 755 for (int i = 0; i < 5; i++) {
752 Handle<Object> number = factory->NewHeapNumber(i); 756 Handle<Object> number = factory->NewHeapNumber(i);
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
1202 delete[] str; 1206 delete[] str;
1203 1207
1204 // Add a Map object to look for. 1208 // Add a Map object to look for.
1205 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map()); 1209 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map());
1206 1210
1207 CHECK_EQ(objs_count, next_objs_index); 1211 CHECK_EQ(objs_count, next_objs_index);
1208 CHECK_EQ(objs_count, ObjectsFoundInHeap(CcTest::heap(), objs, objs_count)); 1212 CHECK_EQ(objs_count, ObjectsFoundInHeap(CcTest::heap(), objs, objs_count));
1209 } 1213 }
1210 1214
1211 TEST(TestUseOfIncrementalBarrierOnCompileLazy) { 1215 TEST(TestUseOfIncrementalBarrierOnCompileLazy) {
1212 if (!i::FLAG_incremental_marking) return; 1216 if (!FLAG_incremental_marking) return;
1213 // Turn off always_opt because it interferes with running the built-in for 1217 // Turn off always_opt because it interferes with running the built-in for
1214 // the last call to g(). 1218 // the last call to g().
1215 i::FLAG_always_opt = false; 1219 FLAG_always_opt = false;
1216 i::FLAG_allow_natives_syntax = true; 1220 FLAG_allow_natives_syntax = true;
1217 CcTest::InitializeVM(); 1221 CcTest::InitializeVM();
1218 Isolate* isolate = CcTest::i_isolate(); 1222 Isolate* isolate = CcTest::i_isolate();
1219 Factory* factory = isolate->factory(); 1223 Factory* factory = isolate->factory();
1220 Heap* heap = isolate->heap(); 1224 Heap* heap = isolate->heap();
1221 v8::HandleScope scope(CcTest::isolate()); 1225 v8::HandleScope scope(CcTest::isolate());
1222 1226
1223 CompileRun( 1227 CompileRun(
1224 "function make_closure(x) {" 1228 "function make_closure(x) {"
1225 " return function() { return x + 3 };" 1229 " return function() { return x + 3 };"
1226 "}" 1230 "}"
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1354 } 1358 }
1355 1359
1356 1360
1357 TEST(TestInternalWeakLists) { 1361 TEST(TestInternalWeakLists) {
1358 FLAG_always_opt = false; 1362 FLAG_always_opt = false;
1359 FLAG_allow_natives_syntax = true; 1363 FLAG_allow_natives_syntax = true;
1360 v8::V8::Initialize(); 1364 v8::V8::Initialize();
1361 1365
1362 // Some flags turn Scavenge collections into Mark-sweep collections 1366 // Some flags turn Scavenge collections into Mark-sweep collections
1363 // and hence are incompatible with this test case. 1367 // and hence are incompatible with this test case.
1364 if (FLAG_gc_global || FLAG_stress_compaction) return; 1368 if (FLAG_gc_global || FLAG_stress_compaction ||
1369 FLAG_stress_incremental_marking)
1370 return;
1365 FLAG_retain_maps_for_n_gc = 0; 1371 FLAG_retain_maps_for_n_gc = 0;
1366 1372
1367 static const int kNumTestContexts = 10; 1373 static const int kNumTestContexts = 10;
1368 1374
1369 Isolate* isolate = CcTest::i_isolate(); 1375 Isolate* isolate = CcTest::i_isolate();
1370 HandleScope scope(isolate); 1376 HandleScope scope(isolate);
1371 v8::Local<v8::Context> ctx[kNumTestContexts]; 1377 v8::Local<v8::Context> ctx[kNumTestContexts];
1372 if (!isolate->use_optimizer()) return; 1378 if (!isolate->use_optimizer()) return;
1373 1379
1374 CHECK_EQ(0, CountNativeContexts()); 1380 CHECK_EQ(0, CountNativeContexts());
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
1951 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { 1957 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
1952 if (obj->IsJSGlobalObject()) count++; 1958 if (obj->IsJSGlobalObject()) count++;
1953 } 1959 }
1954 return count; 1960 return count;
1955 } 1961 }
1956 1962
1957 1963
1958 // Test that we don't embed maps from foreign contexts into 1964 // Test that we don't embed maps from foreign contexts into
1959 // optimized code. 1965 // optimized code.
1960 TEST(LeakNativeContextViaMap) { 1966 TEST(LeakNativeContextViaMap) {
1961 i::FLAG_allow_natives_syntax = true; 1967 FLAG_allow_natives_syntax = true;
1962 v8::Isolate* isolate = CcTest::isolate(); 1968 v8::Isolate* isolate = CcTest::isolate();
1963 v8::HandleScope outer_scope(isolate); 1969 v8::HandleScope outer_scope(isolate);
1964 v8::Persistent<v8::Context> ctx1p; 1970 v8::Persistent<v8::Context> ctx1p;
1965 v8::Persistent<v8::Context> ctx2p; 1971 v8::Persistent<v8::Context> ctx2p;
1966 { 1972 {
1967 v8::HandleScope scope(isolate); 1973 v8::HandleScope scope(isolate);
1968 ctx1p.Reset(isolate, v8::Context::New(isolate)); 1974 ctx1p.Reset(isolate, v8::Context::New(isolate));
1969 ctx2p.Reset(isolate, v8::Context::New(isolate)); 1975 ctx2p.Reset(isolate, v8::Context::New(isolate));
1970 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); 1976 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
1971 } 1977 }
(...skipping 28 matching lines...) Expand all
2000 CHECK_EQ(1, NumberOfGlobalObjects()); 2006 CHECK_EQ(1, NumberOfGlobalObjects());
2001 ctx2p.Reset(); 2007 ctx2p.Reset();
2002 CcTest::CollectAllAvailableGarbage(); 2008 CcTest::CollectAllAvailableGarbage();
2003 CHECK_EQ(0, NumberOfGlobalObjects()); 2009 CHECK_EQ(0, NumberOfGlobalObjects());
2004 } 2010 }
2005 2011
2006 2012
2007 // Test that we don't embed functions from foreign contexts into 2013 // Test that we don't embed functions from foreign contexts into
2008 // optimized code. 2014 // optimized code.
2009 TEST(LeakNativeContextViaFunction) { 2015 TEST(LeakNativeContextViaFunction) {
2010 i::FLAG_allow_natives_syntax = true; 2016 FLAG_allow_natives_syntax = true;
2011 v8::Isolate* isolate = CcTest::isolate(); 2017 v8::Isolate* isolate = CcTest::isolate();
2012 v8::HandleScope outer_scope(isolate); 2018 v8::HandleScope outer_scope(isolate);
2013 v8::Persistent<v8::Context> ctx1p; 2019 v8::Persistent<v8::Context> ctx1p;
2014 v8::Persistent<v8::Context> ctx2p; 2020 v8::Persistent<v8::Context> ctx2p;
2015 { 2021 {
2016 v8::HandleScope scope(isolate); 2022 v8::HandleScope scope(isolate);
2017 ctx1p.Reset(isolate, v8::Context::New(isolate)); 2023 ctx1p.Reset(isolate, v8::Context::New(isolate));
2018 ctx2p.Reset(isolate, v8::Context::New(isolate)); 2024 ctx2p.Reset(isolate, v8::Context::New(isolate));
2019 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); 2025 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
2020 } 2026 }
(...skipping 26 matching lines...) Expand all
2047 } 2053 }
2048 CcTest::CollectAllAvailableGarbage(); 2054 CcTest::CollectAllAvailableGarbage();
2049 CHECK_EQ(1, NumberOfGlobalObjects()); 2055 CHECK_EQ(1, NumberOfGlobalObjects());
2050 ctx2p.Reset(); 2056 ctx2p.Reset();
2051 CcTest::CollectAllAvailableGarbage(); 2057 CcTest::CollectAllAvailableGarbage();
2052 CHECK_EQ(0, NumberOfGlobalObjects()); 2058 CHECK_EQ(0, NumberOfGlobalObjects());
2053 } 2059 }
2054 2060
2055 2061
2056 TEST(LeakNativeContextViaMapKeyed) { 2062 TEST(LeakNativeContextViaMapKeyed) {
2057 i::FLAG_allow_natives_syntax = true; 2063 FLAG_allow_natives_syntax = true;
2058 v8::Isolate* isolate = CcTest::isolate(); 2064 v8::Isolate* isolate = CcTest::isolate();
2059 v8::HandleScope outer_scope(isolate); 2065 v8::HandleScope outer_scope(isolate);
2060 v8::Persistent<v8::Context> ctx1p; 2066 v8::Persistent<v8::Context> ctx1p;
2061 v8::Persistent<v8::Context> ctx2p; 2067 v8::Persistent<v8::Context> ctx2p;
2062 { 2068 {
2063 v8::HandleScope scope(isolate); 2069 v8::HandleScope scope(isolate);
2064 ctx1p.Reset(isolate, v8::Context::New(isolate)); 2070 ctx1p.Reset(isolate, v8::Context::New(isolate));
2065 ctx2p.Reset(isolate, v8::Context::New(isolate)); 2071 ctx2p.Reset(isolate, v8::Context::New(isolate));
2066 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); 2072 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
2067 } 2073 }
(...skipping 26 matching lines...) Expand all
2094 } 2100 }
2095 CcTest::CollectAllAvailableGarbage(); 2101 CcTest::CollectAllAvailableGarbage();
2096 CHECK_EQ(1, NumberOfGlobalObjects()); 2102 CHECK_EQ(1, NumberOfGlobalObjects());
2097 ctx2p.Reset(); 2103 ctx2p.Reset();
2098 CcTest::CollectAllAvailableGarbage(); 2104 CcTest::CollectAllAvailableGarbage();
2099 CHECK_EQ(0, NumberOfGlobalObjects()); 2105 CHECK_EQ(0, NumberOfGlobalObjects());
2100 } 2106 }
2101 2107
2102 2108
2103 TEST(LeakNativeContextViaMapProto) { 2109 TEST(LeakNativeContextViaMapProto) {
2104 i::FLAG_allow_natives_syntax = true; 2110 FLAG_allow_natives_syntax = true;
2105 v8::Isolate* isolate = CcTest::isolate(); 2111 v8::Isolate* isolate = CcTest::isolate();
2106 v8::HandleScope outer_scope(isolate); 2112 v8::HandleScope outer_scope(isolate);
2107 v8::Persistent<v8::Context> ctx1p; 2113 v8::Persistent<v8::Context> ctx1p;
2108 v8::Persistent<v8::Context> ctx2p; 2114 v8::Persistent<v8::Context> ctx2p;
2109 { 2115 {
2110 v8::HandleScope scope(isolate); 2116 v8::HandleScope scope(isolate);
2111 ctx1p.Reset(isolate, v8::Context::New(isolate)); 2117 ctx1p.Reset(isolate, v8::Context::New(isolate));
2112 ctx2p.Reset(isolate, v8::Context::New(isolate)); 2118 ctx2p.Reset(isolate, v8::Context::New(isolate));
2113 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); 2119 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
2114 } 2120 }
(...skipping 30 matching lines...) Expand all
2145 } 2151 }
2146 CcTest::CollectAllAvailableGarbage(); 2152 CcTest::CollectAllAvailableGarbage();
2147 CHECK_EQ(1, NumberOfGlobalObjects()); 2153 CHECK_EQ(1, NumberOfGlobalObjects());
2148 ctx2p.Reset(); 2154 ctx2p.Reset();
2149 CcTest::CollectAllAvailableGarbage(); 2155 CcTest::CollectAllAvailableGarbage();
2150 CHECK_EQ(0, NumberOfGlobalObjects()); 2156 CHECK_EQ(0, NumberOfGlobalObjects());
2151 } 2157 }
2152 2158
2153 2159
2154 TEST(InstanceOfStubWriteBarrier) { 2160 TEST(InstanceOfStubWriteBarrier) {
2155 if (!i::FLAG_incremental_marking) return; 2161 if (!FLAG_incremental_marking) return;
2156 i::FLAG_allow_natives_syntax = true; 2162 FLAG_stress_incremental_marking = false;
2163 FLAG_allow_natives_syntax = true;
2157 #ifdef VERIFY_HEAP 2164 #ifdef VERIFY_HEAP
2158 i::FLAG_verify_heap = true; 2165 FLAG_verify_heap = true;
2159 #endif 2166 #endif
2160 2167
2161 CcTest::InitializeVM(); 2168 CcTest::InitializeVM();
2162 if (!CcTest::i_isolate()->use_optimizer()) return; 2169 if (!CcTest::i_isolate()->use_optimizer()) return;
2163 if (i::FLAG_force_marking_deque_overflows) return; 2170 if (FLAG_force_marking_deque_overflows) return;
2164 v8::HandleScope outer_scope(CcTest::isolate()); 2171 v8::HandleScope outer_scope(CcTest::isolate());
2165 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2172 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2166 2173
2167 { 2174 {
2168 v8::HandleScope scope(CcTest::isolate()); 2175 v8::HandleScope scope(CcTest::isolate());
2169 CompileRun( 2176 CompileRun(
2170 "function foo () { }" 2177 "function foo () { }"
2171 "function mkbar () { return new (new Function(\"\")) (); }" 2178 "function mkbar () { return new (new Function(\"\")) (); }"
2172 "function f (x) { return (x instanceof foo); }" 2179 "function f (x) { return (x instanceof foo); }"
2173 "function g () { f(mkbar()); }" 2180 "function g () { f(mkbar()); }"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2213 namespace { 2220 namespace {
2214 2221
2215 int GetProfilerTicks(SharedFunctionInfo* shared) { 2222 int GetProfilerTicks(SharedFunctionInfo* shared) {
2216 return FLAG_ignition || FLAG_turbo ? shared->profiler_ticks() 2223 return FLAG_ignition || FLAG_turbo ? shared->profiler_ticks()
2217 : shared->code()->profiler_ticks(); 2224 : shared->code()->profiler_ticks();
2218 } 2225 }
2219 2226
2220 } // namespace 2227 } // namespace
2221 2228
2222 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { 2229 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) {
2223 if (!i::FLAG_incremental_marking) return; 2230 if (!FLAG_incremental_marking) return;
2224 i::FLAG_stress_compaction = false; 2231 FLAG_stress_compaction = false;
2225 i::FLAG_allow_natives_syntax = true; 2232 FLAG_stress_incremental_marking = false;
2233 FLAG_allow_natives_syntax = true;
2226 #ifdef VERIFY_HEAP 2234 #ifdef VERIFY_HEAP
2227 i::FLAG_verify_heap = true; 2235 FLAG_verify_heap = true;
2228 #endif 2236 #endif
2229 2237
2230 CcTest::InitializeVM(); 2238 CcTest::InitializeVM();
2231 if (!CcTest::i_isolate()->use_optimizer()) return; 2239 if (!CcTest::i_isolate()->use_optimizer()) return;
2232 v8::HandleScope outer_scope(CcTest::isolate()); 2240 v8::HandleScope outer_scope(CcTest::isolate());
2233 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2241 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2234 2242
2235 { 2243 {
2236 v8::HandleScope scope(CcTest::isolate()); 2244 v8::HandleScope scope(CcTest::isolate());
2237 CompileRun( 2245 CompileRun(
(...skipping 21 matching lines...) Expand all
2259 heap::SimulateIncrementalMarking(CcTest::heap()); 2267 heap::SimulateIncrementalMarking(CcTest::heap());
2260 CcTest::CollectAllGarbage(); 2268 CcTest::CollectAllGarbage();
2261 2269
2262 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); 2270 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age());
2263 CHECK_EQ(0, f->shared()->opt_count()); 2271 CHECK_EQ(0, f->shared()->opt_count());
2264 CHECK_EQ(0, GetProfilerTicks(f->shared())); 2272 CHECK_EQ(0, GetProfilerTicks(f->shared()));
2265 } 2273 }
2266 2274
2267 2275
2268 TEST(ResetSharedFunctionInfoCountersDuringMarkSweep) { 2276 TEST(ResetSharedFunctionInfoCountersDuringMarkSweep) {
2269 i::FLAG_stress_compaction = false; 2277 FLAG_stress_compaction = false;
2270 i::FLAG_allow_natives_syntax = true; 2278 FLAG_stress_incremental_marking = false;
2279 FLAG_allow_natives_syntax = true;
2271 #ifdef VERIFY_HEAP 2280 #ifdef VERIFY_HEAP
2272 i::FLAG_verify_heap = true; 2281 FLAG_verify_heap = true;
2273 #endif 2282 #endif
2274 2283
2275 CcTest::InitializeVM(); 2284 CcTest::InitializeVM();
2276 if (!CcTest::i_isolate()->use_optimizer()) return; 2285 if (!CcTest::i_isolate()->use_optimizer()) return;
2277 v8::HandleScope outer_scope(CcTest::isolate()); 2286 v8::HandleScope outer_scope(CcTest::isolate());
2278 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2287 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2279 2288
2280 { 2289 {
2281 v8::HandleScope scope(CcTest::isolate()); 2290 v8::HandleScope scope(CcTest::isolate());
2282 CompileRun( 2291 CompileRun(
(...skipping 18 matching lines...) Expand all
2301 CcTest::isolate()->ContextDisposedNotification(); 2310 CcTest::isolate()->ContextDisposedNotification();
2302 CcTest::CollectAllGarbage(); 2311 CcTest::CollectAllGarbage();
2303 2312
2304 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); 2313 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age());
2305 CHECK_EQ(0, f->shared()->opt_count()); 2314 CHECK_EQ(0, f->shared()->opt_count());
2306 CHECK_EQ(0, GetProfilerTicks(f->shared())); 2315 CHECK_EQ(0, GetProfilerTicks(f->shared()));
2307 } 2316 }
2308 2317
2309 2318
2310 HEAP_TEST(GCFlags) { 2319 HEAP_TEST(GCFlags) {
2311 if (!i::FLAG_incremental_marking) return; 2320 if (!FLAG_incremental_marking) return;
2312 CcTest::InitializeVM(); 2321 CcTest::InitializeVM();
2313 Heap* heap = CcTest::heap(); 2322 Heap* heap = CcTest::heap();
2314 2323
2315 heap->set_current_gc_flags(Heap::kNoGCFlags); 2324 heap->set_current_gc_flags(Heap::kNoGCFlags);
2316 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); 2325 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_);
2317 2326
2318 // Set the flags to check whether we appropriately resets them after the GC. 2327 // Set the flags to check whether we appropriately resets them after the GC.
2319 heap->set_current_gc_flags(Heap::kAbortIncrementalMarkingMask); 2328 heap->set_current_gc_flags(Heap::kAbortIncrementalMarkingMask);
2320 CcTest::CollectAllGarbage(Heap::kReduceMemoryFootprintMask); 2329 CcTest::CollectAllGarbage(Heap::kReduceMemoryFootprintMask);
2321 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); 2330 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_);
(...skipping 12 matching lines...) Expand all
2334 CcTest::CollectGarbage(NEW_SPACE); 2343 CcTest::CollectGarbage(NEW_SPACE);
2335 // NewSpace scavenges should not overwrite the flags. 2344 // NewSpace scavenges should not overwrite the flags.
2336 CHECK_NE(0, heap->current_gc_flags_ & Heap::kReduceMemoryFootprintMask); 2345 CHECK_NE(0, heap->current_gc_flags_ & Heap::kReduceMemoryFootprintMask);
2337 2346
2338 CcTest::CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 2347 CcTest::CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
2339 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); 2348 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_);
2340 } 2349 }
2341 2350
2342 2351
2343 TEST(IdleNotificationFinishMarking) { 2352 TEST(IdleNotificationFinishMarking) {
2344 if (!i::FLAG_incremental_marking) return; 2353 if (!FLAG_incremental_marking) return;
2345 i::FLAG_allow_natives_syntax = true; 2354 FLAG_stress_incremental_marking = false;
2355 FLAG_allow_natives_syntax = true;
2346 CcTest::InitializeVM(); 2356 CcTest::InitializeVM();
2347 const int initial_gc_count = CcTest::heap()->gc_count(); 2357 const int initial_gc_count = CcTest::heap()->gc_count();
2348 heap::SimulateFullSpace(CcTest::heap()->old_space()); 2358 heap::SimulateFullSpace(CcTest::heap()->old_space());
2349 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); 2359 IncrementalMarking* marking = CcTest::heap()->incremental_marking();
2350 marking->Stop(); 2360 marking->Stop();
2351 CcTest::heap()->StartIncrementalMarking(i::Heap::kNoGCFlags, 2361 CcTest::heap()->StartIncrementalMarking(i::Heap::kNoGCFlags,
2352 i::GarbageCollectionReason::kTesting); 2362 i::GarbageCollectionReason::kTesting);
2353 2363
2354 CHECK_EQ(CcTest::heap()->gc_count(), initial_gc_count); 2364 CHECK_EQ(CcTest::heap()->gc_count(), initial_gc_count);
2355 2365
(...skipping 26 matching lines...) Expand all
2382 CcTest::isolate()->IdleNotificationDeadline( 2392 CcTest::isolate()->IdleNotificationDeadline(
2383 (v8::base::TimeTicks::HighResolutionNow().ToInternalValue() / 2393 (v8::base::TimeTicks::HighResolutionNow().ToInternalValue() /
2384 static_cast<double>(v8::base::Time::kMicrosecondsPerSecond)) + 2394 static_cast<double>(v8::base::Time::kMicrosecondsPerSecond)) +
2385 kLongIdleTime); 2395 kLongIdleTime);
2386 CHECK_EQ(CcTest::heap()->gc_count(), initial_gc_count + 1); 2396 CHECK_EQ(CcTest::heap()->gc_count(), initial_gc_count + 1);
2387 } 2397 }
2388 2398
2389 2399
2390 // Test that HAllocateObject will always return an object in new-space. 2400 // Test that HAllocateObject will always return an object in new-space.
2391 TEST(OptimizedAllocationAlwaysInNewSpace) { 2401 TEST(OptimizedAllocationAlwaysInNewSpace) {
2392 i::FLAG_allow_natives_syntax = true; 2402 FLAG_allow_natives_syntax = true;
2393 CcTest::InitializeVM(); 2403 CcTest::InitializeVM();
2394 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2404 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2395 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2405 if (FLAG_gc_global || FLAG_stress_compaction ||
2406 FLAG_stress_incremental_marking)
2407 return;
2396 v8::HandleScope scope(CcTest::isolate()); 2408 v8::HandleScope scope(CcTest::isolate());
2397 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2409 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2398 heap::SimulateFullSpace(CcTest::heap()->new_space()); 2410 heap::SimulateFullSpace(CcTest::heap()->new_space());
2399 AlwaysAllocateScope always_allocate(CcTest::i_isolate()); 2411 AlwaysAllocateScope always_allocate(CcTest::i_isolate());
2400 v8::Local<v8::Value> res = CompileRun( 2412 v8::Local<v8::Value> res = CompileRun(
2401 "function c(x) {" 2413 "function c(x) {"
2402 " this.x = x;" 2414 " this.x = x;"
2403 " for (var i = 0; i < 32; i++) {" 2415 " for (var i = 0; i < 32; i++) {"
2404 " this['x' + i] = x;" 2416 " this['x' + i] = x;"
2405 " }" 2417 " }"
(...skipping 10 matching lines...) Expand all
2416 .FromJust()); 2428 .FromJust());
2417 2429
2418 i::Handle<JSReceiver> o = 2430 i::Handle<JSReceiver> o =
2419 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res)); 2431 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res));
2420 2432
2421 CHECK(CcTest::heap()->InNewSpace(*o)); 2433 CHECK(CcTest::heap()->InNewSpace(*o));
2422 } 2434 }
2423 2435
2424 2436
2425 TEST(OptimizedPretenuringAllocationFolding) { 2437 TEST(OptimizedPretenuringAllocationFolding) {
2426 i::FLAG_allow_natives_syntax = true; 2438 FLAG_allow_natives_syntax = true;
2427 i::FLAG_expose_gc = true; 2439 FLAG_expose_gc = true;
2428 CcTest::InitializeVM(); 2440 CcTest::InitializeVM();
2429 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2441 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2430 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2442 if (FLAG_gc_global || FLAG_stress_compaction ||
2443 FLAG_stress_incremental_marking)
2444 return;
2431 v8::HandleScope scope(CcTest::isolate()); 2445 v8::HandleScope scope(CcTest::isolate());
2432 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2446 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2433 // Grow new space unitl maximum capacity reached. 2447 // Grow new space unitl maximum capacity reached.
2434 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) { 2448 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2435 CcTest::heap()->new_space()->Grow(); 2449 CcTest::heap()->new_space()->Grow();
2436 } 2450 }
2437 2451
2438 i::ScopedVector<char> source(1024); 2452 i::ScopedVector<char> source(1024);
2439 i::SNPrintF( 2453 i::SNPrintF(
2440 source, 2454 source,
(...skipping 26 matching lines...) Expand all
2467 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res)); 2481 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res));
2468 CHECK(CcTest::heap()->InOldSpace(*o)); 2482 CHECK(CcTest::heap()->InOldSpace(*o));
2469 CHECK(CcTest::heap()->InOldSpace(*int_array_handle)); 2483 CHECK(CcTest::heap()->InOldSpace(*int_array_handle));
2470 CHECK(CcTest::heap()->InOldSpace(int_array_handle->elements())); 2484 CHECK(CcTest::heap()->InOldSpace(int_array_handle->elements()));
2471 CHECK(CcTest::heap()->InOldSpace(*double_array_handle)); 2485 CHECK(CcTest::heap()->InOldSpace(*double_array_handle));
2472 CHECK(CcTest::heap()->InOldSpace(double_array_handle->elements())); 2486 CHECK(CcTest::heap()->InOldSpace(double_array_handle->elements()));
2473 } 2487 }
2474 2488
2475 2489
2476 TEST(OptimizedPretenuringObjectArrayLiterals) { 2490 TEST(OptimizedPretenuringObjectArrayLiterals) {
2477 i::FLAG_allow_natives_syntax = true; 2491 FLAG_allow_natives_syntax = true;
2478 i::FLAG_expose_gc = true; 2492 FLAG_expose_gc = true;
2479 CcTest::InitializeVM(); 2493 CcTest::InitializeVM();
2480 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2494 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2481 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2495 if (FLAG_gc_global || FLAG_stress_compaction ||
2496 FLAG_stress_incremental_marking)
2497 return;
2482 v8::HandleScope scope(CcTest::isolate()); 2498 v8::HandleScope scope(CcTest::isolate());
2483 2499
2484 // Grow new space unitl maximum capacity reached. 2500 // Grow new space unitl maximum capacity reached.
2485 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) { 2501 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2486 CcTest::heap()->new_space()->Grow(); 2502 CcTest::heap()->new_space()->Grow();
2487 } 2503 }
2488 2504
2489 i::ScopedVector<char> source(1024); 2505 i::ScopedVector<char> source(1024);
2490 i::SNPrintF( 2506 i::SNPrintF(
2491 source, 2507 source,
(...skipping 15 matching lines...) Expand all
2507 2523
2508 i::Handle<JSObject> o = Handle<JSObject>::cast( 2524 i::Handle<JSObject> o = Handle<JSObject>::cast(
2509 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res))); 2525 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res)));
2510 2526
2511 CHECK(CcTest::heap()->InOldSpace(o->elements())); 2527 CHECK(CcTest::heap()->InOldSpace(o->elements()));
2512 CHECK(CcTest::heap()->InOldSpace(*o)); 2528 CHECK(CcTest::heap()->InOldSpace(*o));
2513 } 2529 }
2514 2530
2515 2531
2516 TEST(OptimizedPretenuringMixedInObjectProperties) { 2532 TEST(OptimizedPretenuringMixedInObjectProperties) {
2517 i::FLAG_allow_natives_syntax = true; 2533 FLAG_allow_natives_syntax = true;
2518 i::FLAG_expose_gc = true; 2534 FLAG_expose_gc = true;
2519 CcTest::InitializeVM(); 2535 CcTest::InitializeVM();
2520 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2536 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2521 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2537 if (FLAG_gc_global || FLAG_stress_compaction ||
2538 FLAG_stress_incremental_marking)
2539 return;
2522 v8::HandleScope scope(CcTest::isolate()); 2540 v8::HandleScope scope(CcTest::isolate());
2523 2541
2524 // Grow new space unitl maximum capacity reached. 2542 // Grow new space unitl maximum capacity reached.
2525 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) { 2543 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2526 CcTest::heap()->new_space()->Grow(); 2544 CcTest::heap()->new_space()->Grow();
2527 } 2545 }
2528 2546
2529 2547
2530 i::ScopedVector<char> source(1024); 2548 i::ScopedVector<char> source(1024);
2531 i::SNPrintF( 2549 i::SNPrintF(
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2565 if (!inner_object->IsUnboxedDoubleField(idx1)) { 2583 if (!inner_object->IsUnboxedDoubleField(idx1)) {
2566 CHECK(CcTest::heap()->InOldSpace(inner_object->RawFastPropertyAt(idx1))); 2584 CHECK(CcTest::heap()->InOldSpace(inner_object->RawFastPropertyAt(idx1)));
2567 } else { 2585 } else {
2568 CHECK_EQ(2.2, inner_object->RawFastDoublePropertyAt(idx1)); 2586 CHECK_EQ(2.2, inner_object->RawFastDoublePropertyAt(idx1));
2569 } 2587 }
2570 CHECK(CcTest::heap()->InOldSpace(inner_object->RawFastPropertyAt(idx2))); 2588 CHECK(CcTest::heap()->InOldSpace(inner_object->RawFastPropertyAt(idx2)));
2571 } 2589 }
2572 2590
2573 2591
2574 TEST(OptimizedPretenuringDoubleArrayProperties) { 2592 TEST(OptimizedPretenuringDoubleArrayProperties) {
2575 i::FLAG_allow_natives_syntax = true; 2593 FLAG_allow_natives_syntax = true;
2576 i::FLAG_expose_gc = true; 2594 FLAG_expose_gc = true;
2577 CcTest::InitializeVM(); 2595 CcTest::InitializeVM();
2578 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2596 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2579 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2597 if (FLAG_gc_global || FLAG_stress_compaction ||
2598 FLAG_stress_incremental_marking)
2599 return;
2580 v8::HandleScope scope(CcTest::isolate()); 2600 v8::HandleScope scope(CcTest::isolate());
2581 2601
2582 // Grow new space unitl maximum capacity reached. 2602 // Grow new space unitl maximum capacity reached.
2583 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) { 2603 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2584 CcTest::heap()->new_space()->Grow(); 2604 CcTest::heap()->new_space()->Grow();
2585 } 2605 }
2586 2606
2587 i::ScopedVector<char> source(1024); 2607 i::ScopedVector<char> source(1024);
2588 i::SNPrintF( 2608 i::SNPrintF(
2589 source, 2609 source,
(...skipping 15 matching lines...) Expand all
2605 2625
2606 i::Handle<JSObject> o = Handle<JSObject>::cast( 2626 i::Handle<JSObject> o = Handle<JSObject>::cast(
2607 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res))); 2627 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res)));
2608 2628
2609 CHECK(CcTest::heap()->InOldSpace(*o)); 2629 CHECK(CcTest::heap()->InOldSpace(*o));
2610 CHECK(CcTest::heap()->InOldSpace(o->properties())); 2630 CHECK(CcTest::heap()->InOldSpace(o->properties()));
2611 } 2631 }
2612 2632
2613 2633
2614 TEST(OptimizedPretenuringdoubleArrayLiterals) { 2634 TEST(OptimizedPretenuringdoubleArrayLiterals) {
2615 i::FLAG_allow_natives_syntax = true; 2635 FLAG_allow_natives_syntax = true;
2616 i::FLAG_expose_gc = true; 2636 FLAG_expose_gc = true;
2617 CcTest::InitializeVM(); 2637 CcTest::InitializeVM();
2618 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2638 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2619 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2639 if (FLAG_gc_global || FLAG_stress_compaction ||
2640 FLAG_stress_incremental_marking)
2641 return;
2620 v8::HandleScope scope(CcTest::isolate()); 2642 v8::HandleScope scope(CcTest::isolate());
2621 2643
2622 // Grow new space unitl maximum capacity reached. 2644 // Grow new space unitl maximum capacity reached.
2623 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) { 2645 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2624 CcTest::heap()->new_space()->Grow(); 2646 CcTest::heap()->new_space()->Grow();
2625 } 2647 }
2626 2648
2627 i::ScopedVector<char> source(1024); 2649 i::ScopedVector<char> source(1024);
2628 i::SNPrintF( 2650 i::SNPrintF(
2629 source, 2651 source,
(...skipping 15 matching lines...) Expand all
2645 2667
2646 i::Handle<JSObject> o = Handle<JSObject>::cast( 2668 i::Handle<JSObject> o = Handle<JSObject>::cast(
2647 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res))); 2669 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res)));
2648 2670
2649 CHECK(CcTest::heap()->InOldSpace(o->elements())); 2671 CHECK(CcTest::heap()->InOldSpace(o->elements()));
2650 CHECK(CcTest::heap()->InOldSpace(*o)); 2672 CHECK(CcTest::heap()->InOldSpace(*o));
2651 } 2673 }
2652 2674
2653 2675
2654 TEST(OptimizedPretenuringNestedMixedArrayLiterals) { 2676 TEST(OptimizedPretenuringNestedMixedArrayLiterals) {
2655 i::FLAG_allow_natives_syntax = true; 2677 FLAG_allow_natives_syntax = true;
2656 i::FLAG_expose_gc = true; 2678 FLAG_expose_gc = true;
2657 CcTest::InitializeVM(); 2679 CcTest::InitializeVM();
2658 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2680 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2659 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2681 if (FLAG_gc_global || FLAG_stress_compaction ||
2682 FLAG_stress_incremental_marking)
2683 return;
2660 v8::HandleScope scope(CcTest::isolate()); 2684 v8::HandleScope scope(CcTest::isolate());
2661 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2685 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2662 // Grow new space unitl maximum capacity reached. 2686 // Grow new space unitl maximum capacity reached.
2663 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) { 2687 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2664 CcTest::heap()->new_space()->Grow(); 2688 CcTest::heap()->new_space()->Grow();
2665 } 2689 }
2666 2690
2667 i::ScopedVector<char> source(1024); 2691 i::ScopedVector<char> source(1024);
2668 i::SNPrintF( 2692 i::SNPrintF(
2669 source, 2693 source,
(...skipping 25 matching lines...) Expand all
2695 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res))); 2719 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res)));
2696 CHECK(CcTest::heap()->InOldSpace(*o)); 2720 CHECK(CcTest::heap()->InOldSpace(*o));
2697 CHECK(CcTest::heap()->InOldSpace(*int_array_handle)); 2721 CHECK(CcTest::heap()->InOldSpace(*int_array_handle));
2698 CHECK(CcTest::heap()->InOldSpace(int_array_handle->elements())); 2722 CHECK(CcTest::heap()->InOldSpace(int_array_handle->elements()));
2699 CHECK(CcTest::heap()->InOldSpace(*double_array_handle)); 2723 CHECK(CcTest::heap()->InOldSpace(*double_array_handle));
2700 CHECK(CcTest::heap()->InOldSpace(double_array_handle->elements())); 2724 CHECK(CcTest::heap()->InOldSpace(double_array_handle->elements()));
2701 } 2725 }
2702 2726
2703 2727
2704 TEST(OptimizedPretenuringNestedObjectLiterals) { 2728 TEST(OptimizedPretenuringNestedObjectLiterals) {
2705 i::FLAG_allow_natives_syntax = true; 2729 FLAG_allow_natives_syntax = true;
2706 i::FLAG_expose_gc = true; 2730 FLAG_expose_gc = true;
2707 CcTest::InitializeVM(); 2731 CcTest::InitializeVM();
2708 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2732 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2709 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2733 if (FLAG_gc_global || FLAG_stress_compaction ||
2734 FLAG_stress_incremental_marking)
2735 return;
2710 v8::HandleScope scope(CcTest::isolate()); 2736 v8::HandleScope scope(CcTest::isolate());
2711 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2737 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2712 // Grow new space unitl maximum capacity reached. 2738 // Grow new space unitl maximum capacity reached.
2713 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) { 2739 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2714 CcTest::heap()->new_space()->Grow(); 2740 CcTest::heap()->new_space()->Grow();
2715 } 2741 }
2716 2742
2717 i::ScopedVector<char> source(1024); 2743 i::ScopedVector<char> source(1024);
2718 i::SNPrintF( 2744 i::SNPrintF(
2719 source, 2745 source,
(...skipping 26 matching lines...) Expand all
2746 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res))); 2772 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(res)));
2747 CHECK(CcTest::heap()->InOldSpace(*o)); 2773 CHECK(CcTest::heap()->InOldSpace(*o));
2748 CHECK(CcTest::heap()->InOldSpace(*int_array_handle_1)); 2774 CHECK(CcTest::heap()->InOldSpace(*int_array_handle_1));
2749 CHECK(CcTest::heap()->InOldSpace(int_array_handle_1->elements())); 2775 CHECK(CcTest::heap()->InOldSpace(int_array_handle_1->elements()));
2750 CHECK(CcTest::heap()->InOldSpace(*int_array_handle_2)); 2776 CHECK(CcTest::heap()->InOldSpace(*int_array_handle_2));
2751 CHECK(CcTest::heap()->InOldSpace(int_array_handle_2->elements())); 2777 CHECK(CcTest::heap()->InOldSpace(int_array_handle_2->elements()));
2752 } 2778 }
2753 2779
2754 2780
2755 TEST(OptimizedPretenuringNestedDoubleLiterals) { 2781 TEST(OptimizedPretenuringNestedDoubleLiterals) {
2756 i::FLAG_allow_natives_syntax = true; 2782 FLAG_allow_natives_syntax = true;
2757 i::FLAG_expose_gc = true; 2783 FLAG_expose_gc = true;
2758 CcTest::InitializeVM(); 2784 CcTest::InitializeVM();
2759 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2785 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2760 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2786 if (FLAG_gc_global || FLAG_stress_compaction ||
2787 FLAG_stress_incremental_marking)
2788 return;
2761 v8::HandleScope scope(CcTest::isolate()); 2789 v8::HandleScope scope(CcTest::isolate());
2762 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2790 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2763 // Grow new space unitl maximum capacity reached. 2791 // Grow new space unitl maximum capacity reached.
2764 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) { 2792 while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2765 CcTest::heap()->new_space()->Grow(); 2793 CcTest::heap()->new_space()->Grow();
2766 } 2794 }
2767 2795
2768 i::ScopedVector<char> source(1024); 2796 i::ScopedVector<char> source(1024);
2769 i::SNPrintF( 2797 i::SNPrintF(
2770 source, 2798 source,
(...skipping 27 matching lines...) Expand all
2798 CHECK(CcTest::heap()->InOldSpace(*o)); 2826 CHECK(CcTest::heap()->InOldSpace(*o));
2799 CHECK(CcTest::heap()->InOldSpace(*double_array_handle_1)); 2827 CHECK(CcTest::heap()->InOldSpace(*double_array_handle_1));
2800 CHECK(CcTest::heap()->InOldSpace(double_array_handle_1->elements())); 2828 CHECK(CcTest::heap()->InOldSpace(double_array_handle_1->elements()));
2801 CHECK(CcTest::heap()->InOldSpace(*double_array_handle_2)); 2829 CHECK(CcTest::heap()->InOldSpace(*double_array_handle_2));
2802 CHECK(CcTest::heap()->InOldSpace(double_array_handle_2->elements())); 2830 CHECK(CcTest::heap()->InOldSpace(double_array_handle_2->elements()));
2803 } 2831 }
2804 2832
2805 2833
2806 // Test regular array literals allocation. 2834 // Test regular array literals allocation.
2807 TEST(OptimizedAllocationArrayLiterals) { 2835 TEST(OptimizedAllocationArrayLiterals) {
2808 i::FLAG_allow_natives_syntax = true; 2836 FLAG_allow_natives_syntax = true;
2809 CcTest::InitializeVM(); 2837 CcTest::InitializeVM();
2810 if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return; 2838 if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
2811 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2839 if (FLAG_gc_global || FLAG_stress_compaction ||
2840 FLAG_stress_incremental_marking)
2841 return;
2812 v8::HandleScope scope(CcTest::isolate()); 2842 v8::HandleScope scope(CcTest::isolate());
2813 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2843 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2814 v8::Local<v8::Value> res = CompileRun( 2844 v8::Local<v8::Value> res = CompileRun(
2815 "function f() {" 2845 "function f() {"
2816 " var numbers = new Array(1, 2, 3);" 2846 " var numbers = new Array(1, 2, 3);"
2817 " numbers[0] = 3.14;" 2847 " numbers[0] = 3.14;"
2818 " return numbers;" 2848 " return numbers;"
2819 "};" 2849 "};"
2820 "f(); f(); f();" 2850 "f(); f(); f();"
2821 "%OptimizeFunctionOnNextCall(f);" 2851 "%OptimizeFunctionOnNextCall(f);"
(...skipping 12 matching lines...) Expand all
2834 2864
2835 2865
2836 static int CountMapTransitions(Map* map) { 2866 static int CountMapTransitions(Map* map) {
2837 return TransitionArray::NumberOfTransitions(map->raw_transitions()); 2867 return TransitionArray::NumberOfTransitions(map->raw_transitions());
2838 } 2868 }
2839 2869
2840 2870
2841 // Test that map transitions are cleared and maps are collected with 2871 // Test that map transitions are cleared and maps are collected with
2842 // incremental marking as well. 2872 // incremental marking as well.
2843 TEST(Regress1465) { 2873 TEST(Regress1465) {
2844 if (!i::FLAG_incremental_marking) return; 2874 if (!FLAG_incremental_marking) return;
2845 i::FLAG_stress_compaction = false; 2875 FLAG_stress_compaction = false;
2846 i::FLAG_allow_natives_syntax = true; 2876 FLAG_stress_incremental_marking = false;
2847 i::FLAG_trace_incremental_marking = true; 2877 FLAG_allow_natives_syntax = true;
2848 i::FLAG_retain_maps_for_n_gc = 0; 2878 FLAG_trace_incremental_marking = true;
2879 FLAG_retain_maps_for_n_gc = 0;
2849 CcTest::InitializeVM(); 2880 CcTest::InitializeVM();
2850 v8::HandleScope scope(CcTest::isolate()); 2881 v8::HandleScope scope(CcTest::isolate());
2851 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 2882 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
2852 static const int transitions_count = 256; 2883 static const int transitions_count = 256;
2853 2884
2854 CompileRun("function F() {}"); 2885 CompileRun("function F() {}");
2855 { 2886 {
2856 AlwaysAllocateScope always_allocate(CcTest::i_isolate()); 2887 AlwaysAllocateScope always_allocate(CcTest::i_isolate());
2857 for (int i = 0; i < transitions_count; i++) { 2888 for (int i = 0; i < transitions_count; i++) {
2858 EmbeddedVector<char, 64> buffer; 2889 EmbeddedVector<char, 64> buffer;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2901 .ToLocalChecked()))); 2932 .ToLocalChecked())));
2902 } 2933 }
2903 2934
2904 2935
2905 static void AddPropertyTo( 2936 static void AddPropertyTo(
2906 int gc_count, Handle<JSObject> object, const char* property_name) { 2937 int gc_count, Handle<JSObject> object, const char* property_name) {
2907 Isolate* isolate = CcTest::i_isolate(); 2938 Isolate* isolate = CcTest::i_isolate();
2908 Factory* factory = isolate->factory(); 2939 Factory* factory = isolate->factory();
2909 Handle<String> prop_name = factory->InternalizeUtf8String(property_name); 2940 Handle<String> prop_name = factory->InternalizeUtf8String(property_name);
2910 Handle<Smi> twenty_three(Smi::FromInt(23), isolate); 2941 Handle<Smi> twenty_three(Smi::FromInt(23), isolate);
2911 i::FLAG_gc_interval = gc_count; 2942 FLAG_gc_interval = gc_count;
2912 i::FLAG_gc_global = true; 2943 FLAG_gc_global = true;
2913 i::FLAG_retain_maps_for_n_gc = 0; 2944 FLAG_retain_maps_for_n_gc = 0;
2914 CcTest::heap()->set_allocation_timeout(gc_count); 2945 CcTest::heap()->set_allocation_timeout(gc_count);
2915 JSReceiver::SetProperty(object, prop_name, twenty_three, SLOPPY).Check(); 2946 JSReceiver::SetProperty(object, prop_name, twenty_three, SLOPPY).Check();
2916 } 2947 }
2917 2948
2918 2949
2919 TEST(TransitionArrayShrinksDuringAllocToZero) { 2950 TEST(TransitionArrayShrinksDuringAllocToZero) {
2920 i::FLAG_stress_compaction = false; 2951 FLAG_stress_compaction = false;
2921 i::FLAG_allow_natives_syntax = true; 2952 FLAG_stress_incremental_marking = false;
2953 FLAG_allow_natives_syntax = true;
2922 CcTest::InitializeVM(); 2954 CcTest::InitializeVM();
2923 v8::HandleScope scope(CcTest::isolate()); 2955 v8::HandleScope scope(CcTest::isolate());
2924 static const int transitions_count = 10; 2956 static const int transitions_count = 10;
2925 CompileRun("function F() { }"); 2957 CompileRun("function F() { }");
2926 AddTransitions(transitions_count); 2958 AddTransitions(transitions_count);
2927 CompileRun("var root = new F;"); 2959 CompileRun("var root = new F;");
2928 Handle<JSObject> root = GetByName("root"); 2960 Handle<JSObject> root = GetByName("root");
2929 2961
2930 // Count number of live transitions before marking. 2962 // Count number of live transitions before marking.
2931 int transitions_before = CountMapTransitions(root->map()); 2963 int transitions_before = CountMapTransitions(root->map());
2932 CHECK_EQ(transitions_count, transitions_before); 2964 CHECK_EQ(transitions_count, transitions_before);
2933 2965
2934 // Get rid of o 2966 // Get rid of o
2935 CompileRun("o = new F;" 2967 CompileRun("o = new F;"
2936 "root = new F"); 2968 "root = new F");
2937 root = GetByName("root"); 2969 root = GetByName("root");
2938 AddPropertyTo(2, root, "funny"); 2970 AddPropertyTo(2, root, "funny");
2939 CcTest::CollectGarbage(NEW_SPACE); 2971 CcTest::CollectGarbage(NEW_SPACE);
2940 2972
2941 // Count number of live transitions after marking. Note that one transition 2973 // Count number of live transitions after marking. Note that one transition
2942 // is left, because 'o' still holds an instance of one transition target. 2974 // is left, because 'o' still holds an instance of one transition target.
2943 int transitions_after = CountMapTransitions( 2975 int transitions_after = CountMapTransitions(
2944 Map::cast(root->map()->GetBackPointer())); 2976 Map::cast(root->map()->GetBackPointer()));
2945 CHECK_EQ(1, transitions_after); 2977 CHECK_EQ(1, transitions_after);
2946 } 2978 }
2947 2979
2948 2980
2949 TEST(TransitionArrayShrinksDuringAllocToOne) { 2981 TEST(TransitionArrayShrinksDuringAllocToOne) {
2950 i::FLAG_stress_compaction = false; 2982 FLAG_stress_compaction = false;
2951 i::FLAG_allow_natives_syntax = true; 2983 FLAG_stress_incremental_marking = false;
2984 FLAG_allow_natives_syntax = true;
2952 CcTest::InitializeVM(); 2985 CcTest::InitializeVM();
2953 v8::HandleScope scope(CcTest::isolate()); 2986 v8::HandleScope scope(CcTest::isolate());
2954 static const int transitions_count = 10; 2987 static const int transitions_count = 10;
2955 CompileRun("function F() {}"); 2988 CompileRun("function F() {}");
2956 AddTransitions(transitions_count); 2989 AddTransitions(transitions_count);
2957 CompileRun("var root = new F;"); 2990 CompileRun("var root = new F;");
2958 Handle<JSObject> root = GetByName("root"); 2991 Handle<JSObject> root = GetByName("root");
2959 2992
2960 // Count number of live transitions before marking. 2993 // Count number of live transitions before marking.
2961 int transitions_before = CountMapTransitions(root->map()); 2994 int transitions_before = CountMapTransitions(root->map());
2962 CHECK_EQ(transitions_count, transitions_before); 2995 CHECK_EQ(transitions_count, transitions_before);
2963 2996
2964 root = GetByName("root"); 2997 root = GetByName("root");
2965 AddPropertyTo(2, root, "funny"); 2998 AddPropertyTo(2, root, "funny");
2966 CcTest::CollectGarbage(NEW_SPACE); 2999 CcTest::CollectGarbage(NEW_SPACE);
2967 3000
2968 // Count number of live transitions after marking. Note that one transition 3001 // Count number of live transitions after marking. Note that one transition
2969 // is left, because 'o' still holds an instance of one transition target. 3002 // is left, because 'o' still holds an instance of one transition target.
2970 int transitions_after = CountMapTransitions( 3003 int transitions_after = CountMapTransitions(
2971 Map::cast(root->map()->GetBackPointer())); 3004 Map::cast(root->map()->GetBackPointer()));
2972 CHECK_EQ(2, transitions_after); 3005 CHECK_EQ(2, transitions_after);
2973 } 3006 }
2974 3007
2975 3008
2976 TEST(TransitionArrayShrinksDuringAllocToOnePropertyFound) { 3009 TEST(TransitionArrayShrinksDuringAllocToOnePropertyFound) {
2977 i::FLAG_stress_compaction = false; 3010 FLAG_stress_compaction = false;
2978 i::FLAG_allow_natives_syntax = true; 3011 FLAG_stress_incremental_marking = false;
3012 FLAG_allow_natives_syntax = true;
2979 CcTest::InitializeVM(); 3013 CcTest::InitializeVM();
2980 v8::HandleScope scope(CcTest::isolate()); 3014 v8::HandleScope scope(CcTest::isolate());
2981 static const int transitions_count = 10; 3015 static const int transitions_count = 10;
2982 CompileRun("function F() {}"); 3016 CompileRun("function F() {}");
2983 AddTransitions(transitions_count); 3017 AddTransitions(transitions_count);
2984 CompileRun("var root = new F;"); 3018 CompileRun("var root = new F;");
2985 Handle<JSObject> root = GetByName("root"); 3019 Handle<JSObject> root = GetByName("root");
2986 3020
2987 // Count number of live transitions before marking. 3021 // Count number of live transitions before marking.
2988 int transitions_before = CountMapTransitions(root->map()); 3022 int transitions_before = CountMapTransitions(root->map());
2989 CHECK_EQ(transitions_count, transitions_before); 3023 CHECK_EQ(transitions_count, transitions_before);
2990 3024
2991 root = GetByName("root"); 3025 root = GetByName("root");
2992 AddPropertyTo(0, root, "prop9"); 3026 AddPropertyTo(0, root, "prop9");
2993 CcTest::CollectGarbage(OLD_SPACE); 3027 CcTest::CollectGarbage(OLD_SPACE);
2994 3028
2995 // Count number of live transitions after marking. Note that one transition 3029 // Count number of live transitions after marking. Note that one transition
2996 // is left, because 'o' still holds an instance of one transition target. 3030 // is left, because 'o' still holds an instance of one transition target.
2997 int transitions_after = CountMapTransitions( 3031 int transitions_after = CountMapTransitions(
2998 Map::cast(root->map()->GetBackPointer())); 3032 Map::cast(root->map()->GetBackPointer()));
2999 CHECK_EQ(1, transitions_after); 3033 CHECK_EQ(1, transitions_after);
3000 } 3034 }
3001 3035
3002 3036
3003 TEST(TransitionArraySimpleToFull) { 3037 TEST(TransitionArraySimpleToFull) {
3004 i::FLAG_stress_compaction = false; 3038 FLAG_stress_compaction = false;
3005 i::FLAG_allow_natives_syntax = true; 3039 FLAG_stress_incremental_marking = false;
3040 FLAG_allow_natives_syntax = true;
3006 CcTest::InitializeVM(); 3041 CcTest::InitializeVM();
3007 v8::HandleScope scope(CcTest::isolate()); 3042 v8::HandleScope scope(CcTest::isolate());
3008 static const int transitions_count = 1; 3043 static const int transitions_count = 1;
3009 CompileRun("function F() {}"); 3044 CompileRun("function F() {}");
3010 AddTransitions(transitions_count); 3045 AddTransitions(transitions_count);
3011 CompileRun("var root = new F;"); 3046 CompileRun("var root = new F;");
3012 Handle<JSObject> root = GetByName("root"); 3047 Handle<JSObject> root = GetByName("root");
3013 3048
3014 // Count number of live transitions before marking. 3049 // Count number of live transitions before marking.
3015 int transitions_before = CountMapTransitions(root->map()); 3050 int transitions_before = CountMapTransitions(root->map());
3016 CHECK_EQ(transitions_count, transitions_before); 3051 CHECK_EQ(transitions_count, transitions_before);
3017 3052
3018 CompileRun("o = new F;" 3053 CompileRun("o = new F;"
3019 "root = new F"); 3054 "root = new F");
3020 root = GetByName("root"); 3055 root = GetByName("root");
3021 CHECK(TransitionArray::IsSimpleTransition(root->map()->raw_transitions())); 3056 CHECK(TransitionArray::IsSimpleTransition(root->map()->raw_transitions()));
3022 AddPropertyTo(2, root, "happy"); 3057 AddPropertyTo(2, root, "happy");
3023 3058
3024 // Count number of live transitions after marking. Note that one transition 3059 // Count number of live transitions after marking. Note that one transition
3025 // is left, because 'o' still holds an instance of one transition target. 3060 // is left, because 'o' still holds an instance of one transition target.
3026 int transitions_after = CountMapTransitions( 3061 int transitions_after = CountMapTransitions(
3027 Map::cast(root->map()->GetBackPointer())); 3062 Map::cast(root->map()->GetBackPointer()));
3028 CHECK_EQ(1, transitions_after); 3063 CHECK_EQ(1, transitions_after);
3029 } 3064 }
3030 #endif // DEBUG 3065 #endif // DEBUG
3031 3066
3032 3067
3033 TEST(Regress2143a) { 3068 TEST(Regress2143a) {
3034 i::FLAG_incremental_marking = true; 3069 FLAG_incremental_marking = true;
3035 CcTest::InitializeVM(); 3070 CcTest::InitializeVM();
3036 v8::HandleScope scope(CcTest::isolate()); 3071 v8::HandleScope scope(CcTest::isolate());
3037 3072
3038 // Prepare a map transition from the root object together with a yet 3073 // Prepare a map transition from the root object together with a yet
3039 // untransitioned root object. 3074 // untransitioned root object.
3040 CompileRun("var root = new Object;" 3075 CompileRun("var root = new Object;"
3041 "root.foo = 0;" 3076 "root.foo = 0;"
3042 "root = new Object;"); 3077 "root = new Object;");
3043 3078
3044 heap::SimulateIncrementalMarking(CcTest::heap()); 3079 heap::SimulateIncrementalMarking(CcTest::heap());
(...skipping 18 matching lines...) Expand all
3063 ->Get(CcTest::isolate()->GetCurrentContext(), v8_str("root")) 3098 ->Get(CcTest::isolate()->GetCurrentContext(), v8_str("root"))
3064 .ToLocalChecked())); 3099 .ToLocalChecked()));
3065 3100
3066 // The root object should be in a sane state. 3101 // The root object should be in a sane state.
3067 CHECK(root->IsJSObject()); 3102 CHECK(root->IsJSObject());
3068 CHECK(root->map()->IsMap()); 3103 CHECK(root->map()->IsMap());
3069 } 3104 }
3070 3105
3071 3106
3072 TEST(Regress2143b) { 3107 TEST(Regress2143b) {
3073 i::FLAG_incremental_marking = true; 3108 FLAG_incremental_marking = true;
3074 i::FLAG_allow_natives_syntax = true; 3109 FLAG_allow_natives_syntax = true;
3075 CcTest::InitializeVM(); 3110 CcTest::InitializeVM();
3076 v8::HandleScope scope(CcTest::isolate()); 3111 v8::HandleScope scope(CcTest::isolate());
3077 3112
3078 // Prepare a map transition from the root object together with a yet 3113 // Prepare a map transition from the root object together with a yet
3079 // untransitioned root object. 3114 // untransitioned root object.
3080 CompileRun("var root = new Object;" 3115 CompileRun("var root = new Object;"
3081 "root.foo = 0;" 3116 "root.foo = 0;"
3082 "root = new Object;"); 3117 "root = new Object;");
3083 3118
3084 heap::SimulateIncrementalMarking(CcTest::heap()); 3119 heap::SimulateIncrementalMarking(CcTest::heap());
(...skipping 22 matching lines...) Expand all
3107 .ToLocalChecked())); 3142 .ToLocalChecked()));
3108 3143
3109 // The root object should be in a sane state. 3144 // The root object should be in a sane state.
3110 CHECK(root->IsJSObject()); 3145 CHECK(root->IsJSObject());
3111 CHECK(root->map()->IsMap()); 3146 CHECK(root->map()->IsMap());
3112 } 3147 }
3113 3148
3114 3149
3115 TEST(ReleaseOverReservedPages) { 3150 TEST(ReleaseOverReservedPages) {
3116 if (FLAG_never_compact) return; 3151 if (FLAG_never_compact) return;
3117 i::FLAG_trace_gc = true; 3152 FLAG_trace_gc = true;
3118 // The optimizer can allocate stuff, messing up the test. 3153 // The optimizer can allocate stuff, messing up the test.
3119 i::FLAG_opt = false; 3154 FLAG_opt = false;
3120 i::FLAG_always_opt = false; 3155 FLAG_always_opt = false;
3121 // Parallel compaction increases fragmentation, depending on how existing 3156 // Parallel compaction increases fragmentation, depending on how existing
3122 // memory is distributed. Since this is non-deterministic because of 3157 // memory is distributed. Since this is non-deterministic because of
3123 // concurrent sweeping, we disable it for this test. 3158 // concurrent sweeping, we disable it for this test.
3124 i::FLAG_parallel_compaction = false; 3159 FLAG_parallel_compaction = false;
3125 // Concurrent sweeping adds non determinism, depending on when memory is 3160 // Concurrent sweeping adds non determinism, depending on when memory is
3126 // available for further reuse. 3161 // available for further reuse.
3127 i::FLAG_concurrent_sweeping = false; 3162 FLAG_concurrent_sweeping = false;
3128 // Fast evacuation of pages may result in a different page count in old space. 3163 // Fast evacuation of pages may result in a different page count in old space.
3129 i::FLAG_page_promotion = false; 3164 FLAG_page_promotion = false;
3130 CcTest::InitializeVM(); 3165 CcTest::InitializeVM();
3131 Isolate* isolate = CcTest::i_isolate(); 3166 Isolate* isolate = CcTest::i_isolate();
3132 // If there's snapshot available, we don't know whether 20 small arrays will 3167 // If there's snapshot available, we don't know whether 20 small arrays will
3133 // fit on the initial pages. 3168 // fit on the initial pages.
3134 if (!isolate->snapshot_available()) return; 3169 if (!isolate->snapshot_available()) return;
3135 Factory* factory = isolate->factory(); 3170 Factory* factory = isolate->factory();
3136 Heap* heap = isolate->heap(); 3171 Heap* heap = isolate->heap();
3137 v8::HandleScope scope(CcTest::isolate()); 3172 v8::HandleScope scope(CcTest::isolate());
3138 static const int number_of_test_pages = 20; 3173 static const int number_of_test_pages = 20;
3139 3174
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3176 void MockUseCounterCallback(v8::Isolate* isolate, 3211 void MockUseCounterCallback(v8::Isolate* isolate,
3177 v8::Isolate::UseCounterFeature feature) { 3212 v8::Isolate::UseCounterFeature feature) {
3178 isolate->GetCurrentContext(); 3213 isolate->GetCurrentContext();
3179 if (feature == v8::Isolate::kForcedGC) { 3214 if (feature == v8::Isolate::kForcedGC) {
3180 forced_gc_counter++; 3215 forced_gc_counter++;
3181 } 3216 }
3182 } 3217 }
3183 3218
3184 3219
3185 TEST(CountForcedGC) { 3220 TEST(CountForcedGC) {
3186 i::FLAG_expose_gc = true; 3221 FLAG_expose_gc = true;
3187 CcTest::InitializeVM(); 3222 CcTest::InitializeVM();
3188 Isolate* isolate = CcTest::i_isolate(); 3223 Isolate* isolate = CcTest::i_isolate();
3189 v8::HandleScope scope(CcTest::isolate()); 3224 v8::HandleScope scope(CcTest::isolate());
3190 3225
3191 isolate->SetUseCounterCallback(MockUseCounterCallback); 3226 isolate->SetUseCounterCallback(MockUseCounterCallback);
3192 3227
3193 forced_gc_counter = 0; 3228 forced_gc_counter = 0;
3194 const char* source = "gc();"; 3229 const char* source = "gc();";
3195 CompileRun(source); 3230 CompileRun(source);
3196 CHECK_GT(forced_gc_counter, 0); 3231 CHECK_GT(forced_gc_counter, 0);
(...skipping 14 matching lines...) Expand all
3211 3246
3212 OFStream os(stdout); 3247 OFStream os(stdout);
3213 g->shared()->Print(os); 3248 g->shared()->Print(os);
3214 os << std::endl; 3249 os << std::endl;
3215 } 3250 }
3216 #endif // OBJECT_PRINT 3251 #endif // OBJECT_PRINT
3217 3252
3218 3253
3219 TEST(IncrementalMarkingPreservesMonomorphicCallIC) { 3254 TEST(IncrementalMarkingPreservesMonomorphicCallIC) {
3220 if (!FLAG_incremental_marking) return; 3255 if (!FLAG_incremental_marking) return;
3221 if (i::FLAG_always_opt) return; 3256 if (FLAG_always_opt) return;
3222 CcTest::InitializeVM(); 3257 CcTest::InitializeVM();
3223 v8::HandleScope scope(CcTest::isolate()); 3258 v8::HandleScope scope(CcTest::isolate());
3224 v8::Local<v8::Value> fun1, fun2; 3259 v8::Local<v8::Value> fun1, fun2;
3225 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 3260 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
3226 { 3261 {
3227 CompileRun("function fun() {};"); 3262 CompileRun("function fun() {};");
3228 fun1 = CcTest::global()->Get(ctx, v8_str("fun")).ToLocalChecked(); 3263 fun1 = CcTest::global()->Get(ctx, v8_str("fun")).ToLocalChecked();
3229 } 3264 }
3230 3265
3231 { 3266 {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3285 LoadICNexus nexus(vector, slot); 3320 LoadICNexus nexus(vector, slot);
3286 CHECK(nexus.StateFromFeedback() == desired_state); 3321 CHECK(nexus.StateFromFeedback() == desired_state);
3287 } else { 3322 } else {
3288 CHECK(vector->IsKeyedLoadIC(slot)); 3323 CHECK(vector->IsKeyedLoadIC(slot));
3289 KeyedLoadICNexus nexus(vector, slot); 3324 KeyedLoadICNexus nexus(vector, slot);
3290 CHECK(nexus.StateFromFeedback() == desired_state); 3325 CHECK(nexus.StateFromFeedback() == desired_state);
3291 } 3326 }
3292 } 3327 }
3293 3328
3294 TEST(IncrementalMarkingPreservesMonomorphicConstructor) { 3329 TEST(IncrementalMarkingPreservesMonomorphicConstructor) {
3295 if (!i::FLAG_incremental_marking) return; 3330 if (!FLAG_incremental_marking) return;
3296 if (i::FLAG_always_opt) return; 3331 if (FLAG_always_opt) return;
3297 CcTest::InitializeVM(); 3332 CcTest::InitializeVM();
3298 v8::HandleScope scope(CcTest::isolate()); 3333 v8::HandleScope scope(CcTest::isolate());
3299 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 3334 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
3300 // Prepare function f that contains a monomorphic IC for object 3335 // Prepare function f that contains a monomorphic IC for object
3301 // originating from the same native context. 3336 // originating from the same native context.
3302 CompileRun( 3337 CompileRun(
3303 "function fun() { this.x = 1; };" 3338 "function fun() { this.x = 1; };"
3304 "function f(o) { return new o(); } f(fun); f(fun);"); 3339 "function f(o) { return new o(); } f(fun); f(fun);");
3305 Handle<JSFunction> f = Handle<JSFunction>::cast( 3340 Handle<JSFunction> f = Handle<JSFunction>::cast(
3306 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 3341 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
3307 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); 3342 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked())));
3308 3343
3309 Handle<FeedbackVector> vector(f->feedback_vector()); 3344 Handle<FeedbackVector> vector(f->feedback_vector());
3310 CHECK(vector->Get(FeedbackSlot(0))->IsWeakCell()); 3345 CHECK(vector->Get(FeedbackSlot(0))->IsWeakCell());
3311 3346
3312 heap::SimulateIncrementalMarking(CcTest::heap()); 3347 heap::SimulateIncrementalMarking(CcTest::heap());
3313 CcTest::CollectAllGarbage(); 3348 CcTest::CollectAllGarbage();
3314 3349
3315 CHECK(vector->Get(FeedbackSlot(0))->IsWeakCell()); 3350 CHECK(vector->Get(FeedbackSlot(0))->IsWeakCell());
3316 } 3351 }
3317 3352
3318 TEST(IncrementalMarkingPreservesMonomorphicIC) { 3353 TEST(IncrementalMarkingPreservesMonomorphicIC) {
3319 if (!i::FLAG_incremental_marking) return; 3354 if (!FLAG_incremental_marking) return;
3320 if (i::FLAG_always_opt) return; 3355 if (FLAG_always_opt) return;
3321 CcTest::InitializeVM(); 3356 CcTest::InitializeVM();
3322 v8::HandleScope scope(CcTest::isolate()); 3357 v8::HandleScope scope(CcTest::isolate());
3323 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 3358 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
3324 // Prepare function f that contains a monomorphic IC for object 3359 // Prepare function f that contains a monomorphic IC for object
3325 // originating from the same native context. 3360 // originating from the same native context.
3326 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" 3361 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"
3327 "function f(o) { return o.x; } f(obj); f(obj);"); 3362 "function f(o) { return o.x; } f(obj); f(obj);");
3328 Handle<JSFunction> f = Handle<JSFunction>::cast( 3363 Handle<JSFunction> f = Handle<JSFunction>::cast(
3329 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 3364 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
3330 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); 3365 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked())));
3331 3366
3332 CheckVectorIC(f, 0, MONOMORPHIC); 3367 CheckVectorIC(f, 0, MONOMORPHIC);
3333 3368
3334 heap::SimulateIncrementalMarking(CcTest::heap()); 3369 heap::SimulateIncrementalMarking(CcTest::heap());
3335 CcTest::CollectAllGarbage(); 3370 CcTest::CollectAllGarbage();
3336 3371
3337 CheckVectorIC(f, 0, MONOMORPHIC); 3372 CheckVectorIC(f, 0, MONOMORPHIC);
3338 } 3373 }
3339 3374
3340 TEST(IncrementalMarkingPreservesPolymorphicIC) { 3375 TEST(IncrementalMarkingPreservesPolymorphicIC) {
3341 if (!i::FLAG_incremental_marking) return; 3376 if (!FLAG_incremental_marking) return;
3342 if (i::FLAG_always_opt) return; 3377 if (FLAG_always_opt) return;
3343 CcTest::InitializeVM(); 3378 CcTest::InitializeVM();
3344 v8::HandleScope scope(CcTest::isolate()); 3379 v8::HandleScope scope(CcTest::isolate());
3345 v8::Local<v8::Value> obj1, obj2; 3380 v8::Local<v8::Value> obj1, obj2;
3346 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 3381 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
3347 3382
3348 { 3383 {
3349 LocalContext env; 3384 LocalContext env;
3350 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); 3385 CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
3351 obj1 = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); 3386 obj1 = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
3352 } 3387 }
(...skipping 16 matching lines...) Expand all
3369 CheckVectorIC(f, 0, POLYMORPHIC); 3404 CheckVectorIC(f, 0, POLYMORPHIC);
3370 3405
3371 // Fire context dispose notification. 3406 // Fire context dispose notification.
3372 heap::SimulateIncrementalMarking(CcTest::heap()); 3407 heap::SimulateIncrementalMarking(CcTest::heap());
3373 CcTest::CollectAllGarbage(); 3408 CcTest::CollectAllGarbage();
3374 3409
3375 CheckVectorIC(f, 0, POLYMORPHIC); 3410 CheckVectorIC(f, 0, POLYMORPHIC);
3376 } 3411 }
3377 3412
3378 TEST(ContextDisposeDoesntClearPolymorphicIC) { 3413 TEST(ContextDisposeDoesntClearPolymorphicIC) {
3379 if (!i::FLAG_incremental_marking) return; 3414 if (!FLAG_incremental_marking) return;
3380 if (i::FLAG_always_opt) return; 3415 if (FLAG_always_opt) return;
3381 CcTest::InitializeVM(); 3416 CcTest::InitializeVM();
3382 v8::HandleScope scope(CcTest::isolate()); 3417 v8::HandleScope scope(CcTest::isolate());
3383 v8::Local<v8::Value> obj1, obj2; 3418 v8::Local<v8::Value> obj1, obj2;
3384 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); 3419 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
3385 3420
3386 { 3421 {
3387 LocalContext env; 3422 LocalContext env;
3388 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); 3423 CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
3389 obj1 = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); 3424 obj1 = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
3390 } 3425 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
3466 i_isolate->heap()->CollectAllAvailableGarbage( 3501 i_isolate->heap()->CollectAllAvailableGarbage(
3467 i::GarbageCollectionReason::kTesting); 3502 i::GarbageCollectionReason::kTesting);
3468 3503
3469 // External source has been released. 3504 // External source has been released.
3470 CHECK(resource->IsDisposed()); 3505 CHECK(resource->IsDisposed());
3471 delete resource; 3506 delete resource;
3472 } 3507 }
3473 3508
3474 3509
3475 UNINITIALIZED_TEST(ReleaseStackTraceData) { 3510 UNINITIALIZED_TEST(ReleaseStackTraceData) {
3476 if (i::FLAG_always_opt) { 3511 if (FLAG_always_opt) {
3477 // TODO(ulan): Remove this once the memory leak via code_next_link is fixed. 3512 // TODO(ulan): Remove this once the memory leak via code_next_link is fixed.
3478 // See: https://codereview.chromium.org/181833004/ 3513 // See: https://codereview.chromium.org/181833004/
3479 return; 3514 return;
3480 } 3515 }
3481 FLAG_use_ic = false; // ICs retain objects. 3516 FLAG_use_ic = false; // ICs retain objects.
3482 FLAG_concurrent_recompilation = false; 3517 FLAG_concurrent_recompilation = false;
3483 v8::Isolate::CreateParams create_params; 3518 v8::Isolate::CreateParams create_params;
3484 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 3519 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
3485 v8::Isolate* isolate = v8::Isolate::New(create_params); 3520 v8::Isolate* isolate = v8::Isolate::New(create_params);
3486 { 3521 {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3525 ReleaseStackTraceDataTest(isolate, source1, getter); 3560 ReleaseStackTraceDataTest(isolate, source1, getter);
3526 ReleaseStackTraceDataTest(isolate, source2, getter); 3561 ReleaseStackTraceDataTest(isolate, source2, getter);
3527 ReleaseStackTraceDataTest(isolate, source3, getter); 3562 ReleaseStackTraceDataTest(isolate, source3, getter);
3528 ReleaseStackTraceDataTest(isolate, source4, getter); 3563 ReleaseStackTraceDataTest(isolate, source4, getter);
3529 } 3564 }
3530 isolate->Dispose(); 3565 isolate->Dispose();
3531 } 3566 }
3532 3567
3533 3568
3534 TEST(Regress159140) { 3569 TEST(Regress159140) {
3535 if (!i::FLAG_incremental_marking) return; 3570 if (!FLAG_incremental_marking) return;
3536 i::FLAG_allow_natives_syntax = true; 3571 FLAG_allow_natives_syntax = true;
3537 CcTest::InitializeVM(); 3572 CcTest::InitializeVM();
3538 Isolate* isolate = CcTest::i_isolate(); 3573 Isolate* isolate = CcTest::i_isolate();
3539 LocalContext env; 3574 LocalContext env;
3540 Heap* heap = isolate->heap(); 3575 Heap* heap = isolate->heap();
3541 HandleScope scope(isolate); 3576 HandleScope scope(isolate);
3542 3577
3543 // Perform one initial GC to enable code flushing. 3578 // Perform one initial GC to enable code flushing.
3544 CcTest::CollectAllGarbage(); 3579 CcTest::CollectAllGarbage();
3545 3580
3546 // Prepare several closures that are all eligible for code flushing 3581 // Prepare several closures that are all eligible for code flushing
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
3586 heap::SimulateIncrementalMarking(heap); 3621 heap::SimulateIncrementalMarking(heap);
3587 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);"); 3622 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);");
3588 CcTest::CollectAllGarbage(); 3623 CcTest::CollectAllGarbage();
3589 3624
3590 // Unoptimized code is missing and the deoptimizer will go ballistic. 3625 // Unoptimized code is missing and the deoptimizer will go ballistic.
3591 CompileRun("g('bozo');"); 3626 CompileRun("g('bozo');");
3592 } 3627 }
3593 3628
3594 3629
3595 TEST(Regress165495) { 3630 TEST(Regress165495) {
3596 if (!i::FLAG_incremental_marking) return; 3631 if (!FLAG_incremental_marking) return;
3597 i::FLAG_allow_natives_syntax = true; 3632 FLAG_allow_natives_syntax = true;
3598 CcTest::InitializeVM(); 3633 CcTest::InitializeVM();
3599 Isolate* isolate = CcTest::i_isolate(); 3634 Isolate* isolate = CcTest::i_isolate();
3600 Heap* heap = isolate->heap(); 3635 Heap* heap = isolate->heap();
3601 HandleScope scope(isolate); 3636 HandleScope scope(isolate);
3602 3637
3603 // Perform one initial GC to enable code flushing. 3638 // Perform one initial GC to enable code flushing.
3604 CcTest::CollectAllGarbage(); 3639 CcTest::CollectAllGarbage();
3605 3640
3606 // Prepare an optimized closure that the optimized code map will get 3641 // Prepare an optimized closure that the optimized code map will get
3607 // populated. Then age the unoptimized code to trigger code flushing 3642 // populated. Then age the unoptimized code to trigger code flushing
(...skipping 24 matching lines...) Expand all
3632 // even though it still is cached in the optimized code map. 3667 // even though it still is cached in the optimized code map.
3633 heap::SimulateIncrementalMarking(heap); 3668 heap::SimulateIncrementalMarking(heap);
3634 CcTest::CollectAllGarbage(); 3669 CcTest::CollectAllGarbage();
3635 3670
3636 // Make a new closure that will get code installed from the code map. 3671 // Make a new closure that will get code installed from the code map.
3637 // Unoptimized code is missing and the deoptimizer will go ballistic. 3672 // Unoptimized code is missing and the deoptimizer will go ballistic.
3638 CompileRun("var g = mkClosure(); g('bozo');"); 3673 CompileRun("var g = mkClosure(); g('bozo');");
3639 } 3674 }
3640 3675
3641 TEST(Regress169928) { 3676 TEST(Regress169928) {
3642 i::FLAG_allow_natives_syntax = true; 3677 FLAG_allow_natives_syntax = true;
3643 i::FLAG_opt = false; 3678 FLAG_opt = false;
3644 CcTest::InitializeVM(); 3679 CcTest::InitializeVM();
3645 Isolate* isolate = CcTest::i_isolate(); 3680 Isolate* isolate = CcTest::i_isolate();
3646 LocalContext env; 3681 LocalContext env;
3647 Factory* factory = isolate->factory(); 3682 Factory* factory = isolate->factory();
3648 v8::HandleScope scope(CcTest::isolate()); 3683 v8::HandleScope scope(CcTest::isolate());
3649 3684
3650 // Some flags turn Scavenge collections into Mark-sweep collections 3685 // Some flags turn Scavenge collections into Mark-sweep collections
3651 // and hence are incompatible with this test case. 3686 // and hence are incompatible with this test case.
3652 if (FLAG_gc_global || FLAG_stress_compaction) return; 3687 if (FLAG_gc_global || FLAG_stress_compaction ||
3688 FLAG_stress_incremental_marking)
3689 return;
3653 3690
3654 // Prepare the environment 3691 // Prepare the environment
3655 CompileRun("function fastliteralcase(literal, value) {" 3692 CompileRun("function fastliteralcase(literal, value) {"
3656 " literal[0] = value;" 3693 " literal[0] = value;"
3657 " return literal;" 3694 " return literal;"
3658 "}" 3695 "}"
3659 "function get_standard_literal() {" 3696 "function get_standard_literal() {"
3660 " var literal = [1, 2, 3];" 3697 " var literal = [1, 2, 3];"
3661 " return literal;" 3698 " return literal;"
3662 "}" 3699 "}"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3712 AlwaysAllocateScope aa_scope(isolate); 3749 AlwaysAllocateScope aa_scope(isolate);
3713 v8::Script::Compile(env.local(), mote_code_string) 3750 v8::Script::Compile(env.local(), mote_code_string)
3714 .ToLocalChecked() 3751 .ToLocalChecked()
3715 ->Run(env.local()) 3752 ->Run(env.local())
3716 .ToLocalChecked(); 3753 .ToLocalChecked();
3717 } 3754 }
3718 3755
3719 3756
3720 #ifdef DEBUG 3757 #ifdef DEBUG
3721 TEST(Regress513507) { 3758 TEST(Regress513507) {
3722 i::FLAG_allow_natives_syntax = true; 3759 FLAG_allow_natives_syntax = true;
3723 i::FLAG_gc_global = true; 3760 FLAG_gc_global = true;
3724 CcTest::InitializeVM(); 3761 CcTest::InitializeVM();
3725 Isolate* isolate = CcTest::i_isolate(); 3762 Isolate* isolate = CcTest::i_isolate();
3726 LocalContext env; 3763 LocalContext env;
3727 Heap* heap = isolate->heap(); 3764 Heap* heap = isolate->heap();
3728 HandleScope scope(isolate); 3765 HandleScope scope(isolate);
3729 3766
3730 // Prepare function whose optimized code map we can use. 3767 // Prepare function whose optimized code map we can use.
3731 Handle<SharedFunctionInfo> shared; 3768 Handle<SharedFunctionInfo> shared;
3732 { 3769 {
3733 HandleScope inner_scope(isolate); 3770 HandleScope inner_scope(isolate);
(...skipping 28 matching lines...) Expand all
3762 heap->set_allocation_timeout(5); 3799 heap->set_allocation_timeout(5);
3763 FLAG_gc_interval = 1000; 3800 FLAG_gc_interval = 1000;
3764 for (int i = 0; i < 10; ++i) { 3801 for (int i = 0; i < 10; ++i) {
3765 BailoutId id = BailoutId(i + 1); 3802 BailoutId id = BailoutId(i + 1);
3766 Context::AddToOSROptimizedCodeCache(context, shared, code, id); 3803 Context::AddToOSROptimizedCodeCache(context, shared, code, id);
3767 } 3804 }
3768 } 3805 }
3769 #endif // DEBUG 3806 #endif // DEBUG
3770 3807
3771 TEST(Regress513496) { 3808 TEST(Regress513496) {
3772 i::FLAG_allow_natives_syntax = true; 3809 FLAG_allow_natives_syntax = true;
3773 CcTest::InitializeVM(); 3810 CcTest::InitializeVM();
3774 Isolate* isolate = CcTest::i_isolate(); 3811 Isolate* isolate = CcTest::i_isolate();
3775 HandleScope scope(isolate); 3812 HandleScope scope(isolate);
3776 3813
3777 // Perfrom one initial GC to enable code flushing. 3814 // Perfrom one initial GC to enable code flushing.
3778 CcTest::CollectAllGarbage(); 3815 CcTest::CollectAllGarbage();
3779 3816
3780 // Prepare an optimized closure with containing an inlined function. Then age 3817 // Prepare an optimized closure with containing an inlined function. Then age
3781 // the inlined unoptimized code to trigger code flushing but make sure the 3818 // the inlined unoptimized code to trigger code flushing but make sure the
3782 // outer optimized code is kept in the optimized code map. 3819 // outer optimized code is kept in the optimized code map.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
3822 // though the optimized code for 'f' is reachable via the optimized code map. 3859 // though the optimized code for 'f' is reachable via the optimized code map.
3823 CcTest::CollectAllGarbage(); 3860 CcTest::CollectAllGarbage();
3824 3861
3825 // Make a new closure that will get code installed from the code map. 3862 // Make a new closure that will get code installed from the code map.
3826 // Unoptimized code is missing and the deoptimizer will go ballistic. 3863 // Unoptimized code is missing and the deoptimizer will go ballistic.
3827 CompileRun("var h = mkClosure(); h('bozo');"); 3864 CompileRun("var h = mkClosure(); h('bozo');");
3828 } 3865 }
3829 3866
3830 3867
3831 TEST(LargeObjectSlotRecording) { 3868 TEST(LargeObjectSlotRecording) {
3832 if (!i::FLAG_incremental_marking) return; 3869 if (!FLAG_incremental_marking) return;
3833 FLAG_manual_evacuation_candidates_selection = true; 3870 FLAG_manual_evacuation_candidates_selection = true;
3871 FLAG_stress_incremental_marking = false;
3834 CcTest::InitializeVM(); 3872 CcTest::InitializeVM();
3835 Isolate* isolate = CcTest::i_isolate(); 3873 Isolate* isolate = CcTest::i_isolate();
3836 Heap* heap = isolate->heap(); 3874 Heap* heap = isolate->heap();
3837 HandleScope scope(isolate); 3875 HandleScope scope(isolate);
3838 3876
3839 // Create an object on an evacuation candidate. 3877 // Create an object on an evacuation candidate.
3840 heap::SimulateFullSpace(heap->old_space()); 3878 heap::SimulateFullSpace(heap->old_space());
3841 Handle<FixedArray> lit = isolate->factory()->NewFixedArray(4, TENURED); 3879 Handle<FixedArray> lit = isolate->factory()->NewFixedArray(4, TENURED);
3842 Page* evac_page = Page::FromAddress(lit->address()); 3880 Page* evac_page = Page::FromAddress(lit->address());
3843 heap::ForceEvacuationCandidate(evac_page); 3881 heap::ForceEvacuationCandidate(evac_page);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3916 } 3954 }
3917 // This big step should be sufficient to mark the whole array. 3955 // This big step should be sufficient to mark the whole array.
3918 marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, 3956 marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD,
3919 IncrementalMarking::FORCE_COMPLETION, StepOrigin::kV8); 3957 IncrementalMarking::FORCE_COMPLETION, StepOrigin::kV8);
3920 CHECK(marking->IsComplete() || 3958 CHECK(marking->IsComplete() ||
3921 marking->IsReadyToOverApproximateWeakClosure()); 3959 marking->IsReadyToOverApproximateWeakClosure());
3922 } 3960 }
3923 3961
3924 3962
3925 TEST(DisableInlineAllocation) { 3963 TEST(DisableInlineAllocation) {
3926 i::FLAG_allow_natives_syntax = true; 3964 FLAG_allow_natives_syntax = true;
3927 CcTest::InitializeVM(); 3965 CcTest::InitializeVM();
3928 v8::HandleScope scope(CcTest::isolate()); 3966 v8::HandleScope scope(CcTest::isolate());
3929 CompileRun("function test() {" 3967 CompileRun("function test() {"
3930 " var x = [];" 3968 " var x = [];"
3931 " for (var i = 0; i < 10; i++) {" 3969 " for (var i = 0; i < 10; i++) {"
3932 " x[i] = [ {}, [1,2,3], [1,x,3] ];" 3970 " x[i] = [ {}, [1,2,3], [1,x,3] ];"
3933 " }" 3971 " }"
3934 "}" 3972 "}"
3935 "function run() {" 3973 "function run() {"
3936 " %OptimizeFunctionOnNextCall(test);" 3974 " %OptimizeFunctionOnNextCall(test);"
(...skipping 19 matching lines...) Expand all
3956 for (Object* site = heap->allocation_sites_list(); 3994 for (Object* site = heap->allocation_sites_list();
3957 !(site->IsUndefined(heap->isolate())); 3995 !(site->IsUndefined(heap->isolate()));
3958 site = AllocationSite::cast(site)->weak_next()) { 3996 site = AllocationSite::cast(site)->weak_next()) {
3959 count++; 3997 count++;
3960 } 3998 }
3961 return count; 3999 return count;
3962 } 4000 }
3963 4001
3964 4002
3965 TEST(EnsureAllocationSiteDependentCodesProcessed) { 4003 TEST(EnsureAllocationSiteDependentCodesProcessed) {
3966 if (i::FLAG_always_opt || !i::FLAG_opt) return; 4004 if (FLAG_always_opt || !FLAG_opt) return;
3967 i::FLAG_allow_natives_syntax = true; 4005 FLAG_allow_natives_syntax = true;
3968 CcTest::InitializeVM(); 4006 CcTest::InitializeVM();
3969 Isolate* isolate = CcTest::i_isolate(); 4007 Isolate* isolate = CcTest::i_isolate();
3970 v8::internal::Heap* heap = CcTest::heap(); 4008 v8::internal::Heap* heap = CcTest::heap();
3971 GlobalHandles* global_handles = isolate->global_handles(); 4009 GlobalHandles* global_handles = isolate->global_handles();
3972 4010
3973 if (!isolate->use_optimizer()) return; 4011 if (!isolate->use_optimizer()) return;
3974 4012
3975 // The allocation site at the head of the list is ours. 4013 // The allocation site at the head of the list is ours.
3976 Handle<AllocationSite> site; 4014 Handle<AllocationSite> site;
3977 { 4015 {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
4027 } 4065 }
4028 4066
4029 // The site still exists because of our global handle, but the code is no 4067 // The site still exists because of our global handle, but the code is no
4030 // longer referred to by dependent_code(). 4068 // longer referred to by dependent_code().
4031 CHECK(site->dependent_code()->object_at(0)->IsWeakCell() && 4069 CHECK(site->dependent_code()->object_at(0)->IsWeakCell() &&
4032 WeakCell::cast(site->dependent_code()->object_at(0))->cleared()); 4070 WeakCell::cast(site->dependent_code()->object_at(0))->cleared());
4033 } 4071 }
4034 4072
4035 4073
4036 TEST(CellsInOptimizedCodeAreWeak) { 4074 TEST(CellsInOptimizedCodeAreWeak) {
4037 if (i::FLAG_always_opt || !i::FLAG_opt) return; 4075 if (FLAG_always_opt || !FLAG_opt) return;
4038 i::FLAG_allow_natives_syntax = true; 4076 FLAG_allow_natives_syntax = true;
4039 CcTest::InitializeVM(); 4077 CcTest::InitializeVM();
4040 Isolate* isolate = CcTest::i_isolate(); 4078 Isolate* isolate = CcTest::i_isolate();
4041 v8::internal::Heap* heap = CcTest::heap(); 4079 v8::internal::Heap* heap = CcTest::heap();
4042 4080
4043 if (!isolate->use_optimizer()) return; 4081 if (!isolate->use_optimizer()) return;
4044 HandleScope outer_scope(heap->isolate()); 4082 HandleScope outer_scope(heap->isolate());
4045 Handle<Code> code; 4083 Handle<Code> code;
4046 { 4084 {
4047 LocalContext context; 4085 LocalContext context;
4048 HandleScope scope(heap->isolate()); 4086 HandleScope scope(heap->isolate());
(...skipping 22 matching lines...) Expand all
4071 // Now make sure that a gc should get rid of the function 4109 // Now make sure that a gc should get rid of the function
4072 for (int i = 0; i < 4; i++) { 4110 for (int i = 0; i < 4; i++) {
4073 CcTest::CollectAllGarbage(); 4111 CcTest::CollectAllGarbage();
4074 } 4112 }
4075 4113
4076 CHECK(code->marked_for_deoptimization()); 4114 CHECK(code->marked_for_deoptimization());
4077 } 4115 }
4078 4116
4079 4117
4080 TEST(ObjectsInOptimizedCodeAreWeak) { 4118 TEST(ObjectsInOptimizedCodeAreWeak) {
4081 if (i::FLAG_always_opt || !i::FLAG_opt) return; 4119 if (FLAG_always_opt || !FLAG_opt) return;
4082 i::FLAG_allow_natives_syntax = true; 4120 FLAG_allow_natives_syntax = true;
4083 CcTest::InitializeVM(); 4121 CcTest::InitializeVM();
4084 Isolate* isolate = CcTest::i_isolate(); 4122 Isolate* isolate = CcTest::i_isolate();
4085 v8::internal::Heap* heap = CcTest::heap(); 4123 v8::internal::Heap* heap = CcTest::heap();
4086 4124
4087 if (!isolate->use_optimizer()) return; 4125 if (!isolate->use_optimizer()) return;
4088 HandleScope outer_scope(heap->isolate()); 4126 HandleScope outer_scope(heap->isolate());
4089 Handle<Code> code; 4127 Handle<Code> code;
4090 { 4128 {
4091 LocalContext context; 4129 LocalContext context;
4092 HandleScope scope(heap->isolate()); 4130 HandleScope scope(heap->isolate());
(...skipping 19 matching lines...) Expand all
4112 4150
4113 // Now make sure that a gc should get rid of the function 4151 // Now make sure that a gc should get rid of the function
4114 for (int i = 0; i < 4; i++) { 4152 for (int i = 0; i < 4; i++) {
4115 CcTest::CollectAllGarbage(); 4153 CcTest::CollectAllGarbage();
4116 } 4154 }
4117 4155
4118 CHECK(code->marked_for_deoptimization()); 4156 CHECK(code->marked_for_deoptimization());
4119 } 4157 }
4120 4158
4121 TEST(NewSpaceObjectsInOptimizedCode) { 4159 TEST(NewSpaceObjectsInOptimizedCode) {
4122 if (i::FLAG_always_opt || !i::FLAG_opt || i::FLAG_turbo) return; 4160 if (FLAG_always_opt || !FLAG_opt || FLAG_turbo) return;
4123 i::FLAG_allow_natives_syntax = true; 4161 FLAG_allow_natives_syntax = true;
4124 CcTest::InitializeVM(); 4162 CcTest::InitializeVM();
4125 Isolate* isolate = CcTest::i_isolate(); 4163 Isolate* isolate = CcTest::i_isolate();
4126 v8::internal::Heap* heap = CcTest::heap(); 4164 v8::internal::Heap* heap = CcTest::heap();
4127 4165
4128 if (!isolate->use_optimizer()) return; 4166 if (!isolate->use_optimizer()) return;
4129 HandleScope outer_scope(heap->isolate()); 4167 HandleScope outer_scope(heap->isolate());
4130 Handle<Code> code; 4168 Handle<Code> code;
4131 { 4169 {
4132 LocalContext context; 4170 LocalContext context;
4133 HandleScope scope(heap->isolate()); 4171 HandleScope scope(heap->isolate());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
4173 4211
4174 // Now make sure that a gc should get rid of the function 4212 // Now make sure that a gc should get rid of the function
4175 for (int i = 0; i < 4; i++) { 4213 for (int i = 0; i < 4; i++) {
4176 CcTest::CollectAllGarbage(); 4214 CcTest::CollectAllGarbage();
4177 } 4215 }
4178 4216
4179 CHECK(code->marked_for_deoptimization()); 4217 CHECK(code->marked_for_deoptimization());
4180 } 4218 }
4181 4219
4182 TEST(NoWeakHashTableLeakWithIncrementalMarking) { 4220 TEST(NoWeakHashTableLeakWithIncrementalMarking) {
4183 if (i::FLAG_always_opt || !i::FLAG_opt) return; 4221 if (FLAG_always_opt || !FLAG_opt) return;
4184 if (!i::FLAG_incremental_marking) return; 4222 if (!FLAG_incremental_marking) return;
4185 i::FLAG_allow_natives_syntax = true; 4223 FLAG_allow_natives_syntax = true;
4186 i::FLAG_compilation_cache = false; 4224 FLAG_compilation_cache = false;
4187 i::FLAG_retain_maps_for_n_gc = 0; 4225 FLAG_retain_maps_for_n_gc = 0;
4188 CcTest::InitializeVM(); 4226 CcTest::InitializeVM();
4189 Isolate* isolate = CcTest::i_isolate(); 4227 Isolate* isolate = CcTest::i_isolate();
4190 4228
4191 // Do not run for no-snap builds. 4229 // Do not run for no-snap builds.
4192 if (!i::Snapshot::HasContextSnapshot(isolate, 0)) return; 4230 if (!i::Snapshot::HasContextSnapshot(isolate, 0)) return;
4193 4231
4194 v8::internal::Heap* heap = CcTest::heap(); 4232 v8::internal::Heap* heap = CcTest::heap();
4195 4233
4196 // Get a clean slate regarding optimized functions on the heap. 4234 // Get a clean slate regarding optimized functions on the heap.
4197 i::Deoptimizer::DeoptimizeAll(isolate); 4235 i::Deoptimizer::DeoptimizeAll(isolate);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
4252 int result = 0; 4290 int result = 0;
4253 while (code->next_code_link()->IsCode()) { 4291 while (code->next_code_link()->IsCode()) {
4254 result++; 4292 result++;
4255 code = Code::cast(code->next_code_link()); 4293 code = Code::cast(code->next_code_link());
4256 } 4294 }
4257 return result; 4295 return result;
4258 } 4296 }
4259 4297
4260 4298
4261 TEST(NextCodeLinkIsWeak) { 4299 TEST(NextCodeLinkIsWeak) {
4262 i::FLAG_always_opt = false; 4300 FLAG_always_opt = false;
4263 i::FLAG_allow_natives_syntax = true; 4301 FLAG_allow_natives_syntax = true;
4264 CcTest::InitializeVM(); 4302 CcTest::InitializeVM();
4265 Isolate* isolate = CcTest::i_isolate(); 4303 Isolate* isolate = CcTest::i_isolate();
4266 v8::internal::Heap* heap = CcTest::heap(); 4304 v8::internal::Heap* heap = CcTest::heap();
4267 4305
4268 if (!isolate->use_optimizer()) return; 4306 if (!isolate->use_optimizer()) return;
4269 HandleScope outer_scope(heap->isolate()); 4307 HandleScope outer_scope(heap->isolate());
4270 Handle<Code> code; 4308 Handle<Code> code;
4271 CcTest::CollectAllAvailableGarbage(); 4309 CcTest::CollectAllAvailableGarbage();
4272 int code_chain_length_before, code_chain_length_after; 4310 int code_chain_length_before, code_chain_length_after;
4273 { 4311 {
(...skipping 25 matching lines...) Expand all
4299 masm.GetCode(&desc); 4337 masm.GetCode(&desc);
4300 Handle<Object> undefined(isolate->heap()->undefined_value(), isolate); 4338 Handle<Object> undefined(isolate->heap()->undefined_value(), isolate);
4301 Handle<Code> code = isolate->factory()->NewCode( 4339 Handle<Code> code = isolate->factory()->NewCode(
4302 desc, Code::ComputeFlags(Code::OPTIMIZED_FUNCTION), undefined); 4340 desc, Code::ComputeFlags(Code::OPTIMIZED_FUNCTION), undefined);
4303 CHECK(code->IsCode()); 4341 CHECK(code->IsCode());
4304 return code; 4342 return code;
4305 } 4343 }
4306 4344
4307 4345
4308 TEST(NextCodeLinkIsWeak2) { 4346 TEST(NextCodeLinkIsWeak2) {
4309 i::FLAG_allow_natives_syntax = true; 4347 FLAG_allow_natives_syntax = true;
4310 CcTest::InitializeVM(); 4348 CcTest::InitializeVM();
4311 Isolate* isolate = CcTest::i_isolate(); 4349 Isolate* isolate = CcTest::i_isolate();
4312 v8::internal::Heap* heap = CcTest::heap(); 4350 v8::internal::Heap* heap = CcTest::heap();
4313 4351
4314 if (!isolate->use_optimizer()) return; 4352 if (!isolate->use_optimizer()) return;
4315 HandleScope outer_scope(heap->isolate()); 4353 HandleScope outer_scope(heap->isolate());
4316 CcTest::CollectAllAvailableGarbage(); 4354 CcTest::CollectAllAvailableGarbage();
4317 Handle<Context> context(Context::cast(heap->native_contexts_list()), isolate); 4355 Handle<Context> context(Context::cast(heap->native_contexts_list()), isolate);
4318 Handle<Code> new_head; 4356 Handle<Code> new_head;
4319 Handle<Object> old_head(context->get(Context::OPTIMIZED_CODE_LIST), isolate); 4357 Handle<Object> old_head(context->get(Context::OPTIMIZED_CODE_LIST), isolate);
(...skipping 16 matching lines...) Expand all
4336 4374
4337 static void ClearWeakIC( 4375 static void ClearWeakIC(
4338 const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) { 4376 const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) {
4339 printf("clear weak is called\n"); 4377 printf("clear weak is called\n");
4340 weak_ic_cleared = true; 4378 weak_ic_cleared = true;
4341 data.GetParameter()->Reset(); 4379 data.GetParameter()->Reset();
4342 } 4380 }
4343 4381
4344 4382
4345 TEST(WeakFunctionInConstructor) { 4383 TEST(WeakFunctionInConstructor) {
4346 if (i::FLAG_always_opt) return; 4384 if (FLAG_always_opt) return;
4347 i::FLAG_stress_compaction = false; 4385 FLAG_stress_compaction = false;
4386 FLAG_stress_incremental_marking = false;
4348 CcTest::InitializeVM(); 4387 CcTest::InitializeVM();
4349 v8::Isolate* isolate = CcTest::isolate(); 4388 v8::Isolate* isolate = CcTest::isolate();
4350 LocalContext env; 4389 LocalContext env;
4351 v8::HandleScope scope(isolate); 4390 v8::HandleScope scope(isolate);
4352 CompileRun( 4391 CompileRun(
4353 "function createObj(obj) {" 4392 "function createObj(obj) {"
4354 " return new obj();" 4393 " return new obj();"
4355 "}"); 4394 "}");
4356 i::Handle<JSFunction> createObj = Handle<JSFunction>::cast( 4395 i::Handle<JSFunction> createObj = Handle<JSFunction>::cast(
4357 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 4396 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4396 CompileRun( 4435 CompileRun(
4397 "function coat() { this.x = 6; }" 4436 "function coat() { this.x = 6; }"
4398 "createObj(coat);"); 4437 "createObj(coat);");
4399 slot_value = feedback_vector->Get(FeedbackSlot(0)); 4438 slot_value = feedback_vector->Get(FeedbackSlot(0));
4400 CHECK(slot_value->IsWeakCell() && !WeakCell::cast(slot_value)->cleared()); 4439 CHECK(slot_value->IsWeakCell() && !WeakCell::cast(slot_value)->cleared());
4401 } 4440 }
4402 4441
4403 4442
4404 // Checks that the value returned by execution of the source is weak. 4443 // Checks that the value returned by execution of the source is weak.
4405 void CheckWeakness(const char* source) { 4444 void CheckWeakness(const char* source) {
4406 i::FLAG_stress_compaction = false; 4445 FLAG_stress_compaction = false;
4446 FLAG_stress_incremental_marking = false;
4407 CcTest::InitializeVM(); 4447 CcTest::InitializeVM();
4408 v8::Isolate* isolate = CcTest::isolate(); 4448 v8::Isolate* isolate = CcTest::isolate();
4409 LocalContext env; 4449 LocalContext env;
4410 v8::HandleScope scope(isolate); 4450 v8::HandleScope scope(isolate);
4411 v8::Persistent<v8::Object> garbage; 4451 v8::Persistent<v8::Object> garbage;
4412 { 4452 {
4413 v8::HandleScope scope(isolate); 4453 v8::HandleScope scope(isolate);
4414 garbage.Reset(isolate, CompileRun(env.local(), source) 4454 garbage.Reset(isolate, CompileRun(env.local(), source)
4415 .ToLocalChecked() 4455 .ToLocalChecked()
4416 ->ToObject(env.local()) 4456 ->ToObject(env.local())
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
4738 CcTest::CollectAllGarbage(); 4778 CcTest::CollectAllGarbage();
4739 CHECK_EQ(*survivor, weak_cells[0]->value()); 4779 CHECK_EQ(*survivor, weak_cells[0]->value());
4740 for (int i = 1; i < N; i++) { 4780 for (int i = 1; i < N; i++) {
4741 CHECK(weak_cells[i]->cleared()); 4781 CHECK(weak_cells[i]->cleared());
4742 } 4782 }
4743 } 4783 }
4744 4784
4745 4785
4746 #ifdef DEBUG 4786 #ifdef DEBUG
4747 TEST(AddInstructionChangesNewSpacePromotion) { 4787 TEST(AddInstructionChangesNewSpacePromotion) {
4748 i::FLAG_allow_natives_syntax = true; 4788 FLAG_allow_natives_syntax = true;
4749 i::FLAG_expose_gc = true; 4789 FLAG_expose_gc = true;
4750 i::FLAG_stress_compaction = true; 4790 FLAG_stress_compaction = true;
4751 i::FLAG_gc_interval = 1000; 4791 FLAG_gc_interval = 1000;
4752 CcTest::InitializeVM(); 4792 CcTest::InitializeVM();
4753 if (!i::FLAG_allocation_site_pretenuring) return; 4793 if (!FLAG_allocation_site_pretenuring) return;
4754 v8::HandleScope scope(CcTest::isolate()); 4794 v8::HandleScope scope(CcTest::isolate());
4755 Isolate* isolate = CcTest::i_isolate(); 4795 Isolate* isolate = CcTest::i_isolate();
4756 Heap* heap = isolate->heap(); 4796 Heap* heap = isolate->heap();
4757 LocalContext env; 4797 LocalContext env;
4758 CompileRun( 4798 CompileRun(
4759 "function add(a, b) {" 4799 "function add(a, b) {"
4760 " return a + b;" 4800 " return a + b;"
4761 "}" 4801 "}"
4762 "add(1, 2);" 4802 "add(1, 2);"
4763 "add(\"a\", \"b\");" 4803 "add(\"a\", \"b\");"
(...skipping 22 matching lines...) Expand all
4786 } 4826 }
4787 4827
4788 4828
4789 void OnFatalErrorExpectOOM(const char* location, const char* message) { 4829 void OnFatalErrorExpectOOM(const char* location, const char* message) {
4790 // Exit with 0 if the location matches our expectation. 4830 // Exit with 0 if the location matches our expectation.
4791 exit(strcmp(location, "CALL_AND_RETRY_LAST")); 4831 exit(strcmp(location, "CALL_AND_RETRY_LAST"));
4792 } 4832 }
4793 4833
4794 4834
4795 TEST(CEntryStubOOM) { 4835 TEST(CEntryStubOOM) {
4796 i::FLAG_allow_natives_syntax = true; 4836 FLAG_allow_natives_syntax = true;
4797 CcTest::InitializeVM(); 4837 CcTest::InitializeVM();
4798 v8::HandleScope scope(CcTest::isolate()); 4838 v8::HandleScope scope(CcTest::isolate());
4799 CcTest::isolate()->SetFatalErrorHandler(OnFatalErrorExpectOOM); 4839 CcTest::isolate()->SetFatalErrorHandler(OnFatalErrorExpectOOM);
4800 4840
4801 v8::Local<v8::Value> result = CompileRun( 4841 v8::Local<v8::Value> result = CompileRun(
4802 "%SetFlags('--gc-interval=1');" 4842 "%SetFlags('--gc-interval=1');"
4803 "var a = [];" 4843 "var a = [];"
4804 "a.__proto__ = [];" 4844 "a.__proto__ = [];"
4805 "a.unshift(1)"); 4845 "a.unshift(1)");
4806 4846
4807 CHECK(result->IsNumber()); 4847 CHECK(result->IsNumber());
4808 } 4848 }
4809 4849
4810 #endif // DEBUG 4850 #endif // DEBUG
4811 4851
4812 4852
4813 static void InterruptCallback357137(v8::Isolate* isolate, void* data) { } 4853 static void InterruptCallback357137(v8::Isolate* isolate, void* data) { }
4814 4854
4815 4855
4816 static void RequestInterrupt(const v8::FunctionCallbackInfo<v8::Value>& args) { 4856 static void RequestInterrupt(const v8::FunctionCallbackInfo<v8::Value>& args) {
4817 CcTest::isolate()->RequestInterrupt(&InterruptCallback357137, NULL); 4857 CcTest::isolate()->RequestInterrupt(&InterruptCallback357137, NULL);
4818 } 4858 }
4819 4859
4820 HEAP_TEST(Regress538257) { 4860 HEAP_TEST(Regress538257) {
4821 i::FLAG_manual_evacuation_candidates_selection = true; 4861 FLAG_manual_evacuation_candidates_selection = true;
4822 v8::Isolate::CreateParams create_params; 4862 v8::Isolate::CreateParams create_params;
4823 // Set heap limits. 4863 // Set heap limits.
4824 create_params.constraints.set_max_semi_space_size(1); 4864 create_params.constraints.set_max_semi_space_size(1);
4825 create_params.constraints.set_max_old_space_size(6); 4865 create_params.constraints.set_max_old_space_size(6);
4826 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 4866 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
4827 v8::Isolate* isolate = v8::Isolate::New(create_params); 4867 v8::Isolate* isolate = v8::Isolate::New(create_params);
4828 isolate->Enter(); 4868 isolate->Enter();
4829 { 4869 {
4830 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 4870 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
4831 Heap* heap = i_isolate->heap(); 4871 Heap* heap = i_isolate->heap();
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
4893 o1->Shrink(kFixedArrayLen - 1); 4933 o1->Shrink(kFixedArrayLen - 1);
4894 4934
4895 for (HeapObject* obj = it.next(); obj != NULL; obj = it.next()) { 4935 for (HeapObject* obj = it.next(); obj != NULL; obj = it.next()) {
4896 // Let's not optimize the loop away. 4936 // Let's not optimize the loop away.
4897 CHECK(obj->address() != nullptr); 4937 CHECK(obj->address() != nullptr);
4898 } 4938 }
4899 } 4939 }
4900 4940
4901 4941
4902 UNINITIALIZED_TEST(PromotionQueue) { 4942 UNINITIALIZED_TEST(PromotionQueue) {
4903 i::FLAG_expose_gc = true; 4943 FLAG_expose_gc = true;
4904 i::FLAG_max_semi_space_size = 2 * Page::kPageSize / MB; 4944 FLAG_max_semi_space_size = 2 * Page::kPageSize / MB;
4905 i::FLAG_min_semi_space_size = i::FLAG_max_semi_space_size; 4945 FLAG_min_semi_space_size = FLAG_max_semi_space_size;
4906 v8::Isolate::CreateParams create_params; 4946 v8::Isolate::CreateParams create_params;
4907 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 4947 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
4908 v8::Isolate* isolate = v8::Isolate::New(create_params); 4948 v8::Isolate* isolate = v8::Isolate::New(create_params);
4909 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 4949 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
4910 { 4950 {
4911 v8::Isolate::Scope isolate_scope(isolate); 4951 v8::Isolate::Scope isolate_scope(isolate);
4912 v8::HandleScope handle_scope(isolate); 4952 v8::HandleScope handle_scope(isolate);
4913 v8::Context::New(isolate)->Enter(); 4953 v8::Context::New(isolate)->Enter();
4914 Heap* heap = i_isolate->heap(); 4954 Heap* heap = i_isolate->heap();
4915 NewSpace* new_space = heap->new_space(); 4955 NewSpace* new_space = heap->new_space();
(...skipping 12 matching lines...) Expand all
4928 // (2) and will create promotion queue entries at the end of the second 4968 // (2) and will create promotion queue entries at the end of the second
4929 // semi-space page during the next scavenge when it promotes the objects to 4969 // semi-space page during the next scavenge when it promotes the objects to
4930 // the old generation. The first allocation of (3) will fill up the first 4970 // the old generation. The first allocation of (3) will fill up the first
4931 // semi-space page. The second allocation in (3) will not fit into the 4971 // semi-space page. The second allocation in (3) will not fit into the
4932 // first semi-space page, but it will overwrite the promotion queue which 4972 // first semi-space page, but it will overwrite the promotion queue which
4933 // are in the second semi-space page. If the right guards are in place, the 4973 // are in the second semi-space page. If the right guards are in place, the
4934 // promotion queue will be evacuated in that case. 4974 // promotion queue will be evacuated in that case.
4935 4975
4936 4976
4937 CHECK(new_space->IsAtMaximumCapacity()); 4977 CHECK(new_space->IsAtMaximumCapacity());
4938 CHECK_EQ(static_cast<size_t>(i::FLAG_min_semi_space_size * MB), 4978 CHECK_EQ(static_cast<size_t>(FLAG_min_semi_space_size * MB),
4939 new_space->TotalCapacity()); 4979 new_space->TotalCapacity());
4940 4980
4941 // Call the scavenger two times to get an empty new space 4981 // Call the scavenger two times to get an empty new space
4942 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); 4982 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting);
4943 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); 4983 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting);
4944 4984
4945 // First create a few objects which will survive a scavenge, and will get 4985 // First create a few objects which will survive a scavenge, and will get
4946 // promoted to the old generation later on. These objects will create 4986 // promoted to the old generation later on. These objects will create
4947 // promotion queue entries at the end of the second semi-space page. 4987 // promotion queue entries at the end of the second semi-space page.
4948 const int number_handles = 12; 4988 const int number_handles = 12;
4949 Handle<FixedArray> handles[number_handles]; 4989 Handle<FixedArray> handles[number_handles];
4950 for (int i = 0; i < number_handles; i++) { 4990 for (int i = 0; i < number_handles; i++) {
4951 handles[i] = i_isolate->factory()->NewFixedArray(1, NOT_TENURED); 4991 handles[i] = i_isolate->factory()->NewFixedArray(1, NOT_TENURED);
4952 } 4992 }
4953 4993
4954 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); 4994 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting);
4955 CHECK_EQ(static_cast<size_t>(i::FLAG_min_semi_space_size * MB), 4995 CHECK_EQ(static_cast<size_t>(FLAG_min_semi_space_size * MB),
4956 new_space->TotalCapacity()); 4996 new_space->TotalCapacity());
4957 4997
4958 // Fill-up the first semi-space page. 4998 // Fill-up the first semi-space page.
4959 heap::FillUpOnePage(new_space); 4999 heap::FillUpOnePage(new_space);
4960 5000
4961 // Create a small object to initialize the bump pointer on the second 5001 // Create a small object to initialize the bump pointer on the second
4962 // semi-space page. 5002 // semi-space page.
4963 Handle<FixedArray> small = 5003 Handle<FixedArray> small =
4964 i_isolate->factory()->NewFixedArray(1, NOT_TENURED); 5004 i_isolate->factory()->NewFixedArray(1, NOT_TENURED);
4965 CHECK(heap->InNewSpace(*small)); 5005 CHECK(heap->InNewSpace(*small));
4966 5006
4967 // Fill-up the second semi-space page. 5007 // Fill-up the second semi-space page.
4968 heap::FillUpOnePage(new_space); 5008 heap::FillUpOnePage(new_space);
4969 5009
4970 // This scavenge will corrupt memory if the promotion queue is not 5010 // This scavenge will corrupt memory if the promotion queue is not
4971 // evacuated. 5011 // evacuated.
4972 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); 5012 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting);
4973 } 5013 }
4974 isolate->Dispose(); 5014 isolate->Dispose();
4975 } 5015 }
4976 5016
4977 5017
4978 TEST(Regress388880) { 5018 TEST(Regress388880) {
4979 if (!FLAG_incremental_marking) return; 5019 if (!FLAG_incremental_marking) return;
4980 i::FLAG_expose_gc = true; 5020 FLAG_stress_incremental_marking = false;
5021 FLAG_expose_gc = true;
4981 CcTest::InitializeVM(); 5022 CcTest::InitializeVM();
4982 v8::HandleScope scope(CcTest::isolate()); 5023 v8::HandleScope scope(CcTest::isolate());
4983 Isolate* isolate = CcTest::i_isolate(); 5024 Isolate* isolate = CcTest::i_isolate();
4984 Factory* factory = isolate->factory(); 5025 Factory* factory = isolate->factory();
4985 Heap* heap = isolate->heap(); 5026 Heap* heap = isolate->heap();
4986 5027
4987 Handle<Map> map1 = Map::Create(isolate, 1); 5028 Handle<Map> map1 = Map::Create(isolate, 1);
4988 Handle<String> name = factory->NewStringFromStaticChars("foo"); 5029 Handle<String> name = factory->NewStringFromStaticChars("foo");
4989 name = factory->InternalizeString(name); 5030 name = factory->InternalizeString(name);
4990 Handle<Map> map2 = 5031 Handle<Map> map2 =
(...skipping 27 matching lines...) Expand all
5018 CHECK(marking->IsMarking()); 5059 CHECK(marking->IsMarking());
5019 5060
5020 // Now everything is set up for crashing in JSObject::MigrateFastToFast() 5061 // Now everything is set up for crashing in JSObject::MigrateFastToFast()
5021 // when it calls heap->AdjustLiveBytes(...). 5062 // when it calls heap->AdjustLiveBytes(...).
5022 JSObject::MigrateToMap(o, map2); 5063 JSObject::MigrateToMap(o, map2);
5023 } 5064 }
5024 5065
5025 5066
5026 TEST(Regress3631) { 5067 TEST(Regress3631) {
5027 if (!FLAG_incremental_marking) return; 5068 if (!FLAG_incremental_marking) return;
5028 i::FLAG_expose_gc = true; 5069 FLAG_expose_gc = true;
5029 CcTest::InitializeVM(); 5070 CcTest::InitializeVM();
5030 v8::HandleScope scope(CcTest::isolate()); 5071 v8::HandleScope scope(CcTest::isolate());
5031 Isolate* isolate = CcTest::i_isolate(); 5072 Isolate* isolate = CcTest::i_isolate();
5032 Heap* heap = isolate->heap(); 5073 Heap* heap = isolate->heap();
5033 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); 5074 IncrementalMarking* marking = CcTest::heap()->incremental_marking();
5034 v8::Local<v8::Value> result = CompileRun( 5075 v8::Local<v8::Value> result = CompileRun(
5035 "var weak_map = new WeakMap();" 5076 "var weak_map = new WeakMap();"
5036 "var future_keys = [];" 5077 "var future_keys = [];"
5037 "for (var i = 0; i < 50; i++) {" 5078 "for (var i = 0; i < 50; i++) {"
5038 " var key = {'k' : i + 0.1};" 5079 " var key = {'k' : i + 0.1};"
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
5153 } 5194 }
5154 CHECK(!weak_cell->cleared()); 5195 CHECK(!weak_cell->cleared());
5155 heap::SimulateIncrementalMarking(heap); 5196 heap::SimulateIncrementalMarking(heap);
5156 CcTest::CollectGarbage(OLD_SPACE); 5197 CcTest::CollectGarbage(OLD_SPACE);
5157 CHECK(weak_cell->cleared()); 5198 CHECK(weak_cell->cleared());
5158 } 5199 }
5159 5200
5160 5201
5161 TEST(MapRetaining) { 5202 TEST(MapRetaining) {
5162 if (!FLAG_incremental_marking) return; 5203 if (!FLAG_incremental_marking) return;
5204 FLAG_stress_incremental_marking = false;
5163 CcTest::InitializeVM(); 5205 CcTest::InitializeVM();
5164 v8::HandleScope scope(CcTest::isolate()); 5206 v8::HandleScope scope(CcTest::isolate());
5165 CheckMapRetainingFor(FLAG_retain_maps_for_n_gc); 5207 CheckMapRetainingFor(FLAG_retain_maps_for_n_gc);
5166 CheckMapRetainingFor(0); 5208 CheckMapRetainingFor(0);
5167 CheckMapRetainingFor(1); 5209 CheckMapRetainingFor(1);
5168 CheckMapRetainingFor(7); 5210 CheckMapRetainingFor(7);
5169 } 5211 }
5170 5212
5171 5213
5172 TEST(RegressArrayListGC) { 5214 TEST(RegressArrayListGC) {
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after
5838 Isolate* isolate = heap->isolate(); 5880 Isolate* isolate = heap->isolate();
5839 5881
5840 intptr_t size_before = heap->SizeOfObjects(); 5882 intptr_t size_before = heap->SizeOfObjects();
5841 Handle<FixedArray> array = isolate->factory()->NewFixedArray(200000); 5883 Handle<FixedArray> array = isolate->factory()->NewFixedArray(200000);
5842 array->Shrink(1); 5884 array->Shrink(1);
5843 intptr_t size_after = heap->SizeOfObjects(); 5885 intptr_t size_after = heap->SizeOfObjects();
5844 CHECK_EQ(size_after, size_before + array->Size()); 5886 CHECK_EQ(size_after, size_before + array->Size());
5845 } 5887 }
5846 5888
5847 TEST(Regress615489) { 5889 TEST(Regress615489) {
5848 if (!i::FLAG_incremental_marking) return; 5890 if (!FLAG_incremental_marking) return;
5849 FLAG_black_allocation = true; 5891 FLAG_black_allocation = true;
5850 CcTest::InitializeVM(); 5892 CcTest::InitializeVM();
5851 v8::HandleScope scope(CcTest::isolate()); 5893 v8::HandleScope scope(CcTest::isolate());
5852 Heap* heap = CcTest::heap(); 5894 Heap* heap = CcTest::heap();
5853 Isolate* isolate = heap->isolate(); 5895 Isolate* isolate = heap->isolate();
5854 CcTest::CollectAllGarbage(); 5896 CcTest::CollectAllGarbage();
5855 5897
5856 i::MarkCompactCollector* collector = heap->mark_compact_collector(); 5898 i::MarkCompactCollector* collector = heap->mark_compact_collector();
5857 i::IncrementalMarking* marking = heap->incremental_marking(); 5899 i::IncrementalMarking* marking = heap->incremental_marking();
5858 if (collector->sweeping_in_progress()) { 5900 if (collector->sweeping_in_progress()) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
5939 } 5981 }
5940 5982
5941 { 5983 {
5942 StaticOneByteResource external_string("12345678901234"); 5984 StaticOneByteResource external_string("12345678901234");
5943 s3->MakeExternal(&external_string); 5985 s3->MakeExternal(&external_string);
5944 CcTest::CollectGarbage(OLD_SPACE); 5986 CcTest::CollectGarbage(OLD_SPACE);
5945 } 5987 }
5946 } 5988 }
5947 5989
5948 TEST(LeftTrimFixedArrayInBlackArea) { 5990 TEST(LeftTrimFixedArrayInBlackArea) {
5949 if (!i::FLAG_incremental_marking) return; 5991 if (!FLAG_incremental_marking) return;
5950 FLAG_black_allocation = true; 5992 FLAG_black_allocation = true;
5951 CcTest::InitializeVM(); 5993 CcTest::InitializeVM();
5952 v8::HandleScope scope(CcTest::isolate()); 5994 v8::HandleScope scope(CcTest::isolate());
5953 Heap* heap = CcTest::heap(); 5995 Heap* heap = CcTest::heap();
5954 Isolate* isolate = heap->isolate(); 5996 Isolate* isolate = heap->isolate();
5955 CcTest::CollectAllGarbage(); 5997 CcTest::CollectAllGarbage();
5956 5998
5957 i::MarkCompactCollector* collector = heap->mark_compact_collector(); 5999 i::MarkCompactCollector* collector = heap->mark_compact_collector();
5958 i::IncrementalMarking* marking = heap->incremental_marking(); 6000 i::IncrementalMarking* marking = heap->incremental_marking();
5959 if (collector->sweeping_in_progress()) { 6001 if (collector->sweeping_in_progress()) {
(...skipping 18 matching lines...) Expand all
5978 // Now left trim the allocated black area. A filler has to be installed 6020 // Now left trim the allocated black area. A filler has to be installed
5979 // for the trimmed area and all mark bits of the trimmed area have to be 6021 // for the trimmed area and all mark bits of the trimmed area have to be
5980 // cleared. 6022 // cleared.
5981 FixedArrayBase* trimmed = heap->LeftTrimFixedArray(*array, 10); 6023 FixedArrayBase* trimmed = heap->LeftTrimFixedArray(*array, 10);
5982 CHECK(ObjectMarking::IsBlack(trimmed, MarkingState::Internal(trimmed))); 6024 CHECK(ObjectMarking::IsBlack(trimmed, MarkingState::Internal(trimmed)));
5983 6025
5984 heap::GcAndSweep(heap, OLD_SPACE); 6026 heap::GcAndSweep(heap, OLD_SPACE);
5985 } 6027 }
5986 6028
5987 TEST(ContinuousLeftTrimFixedArrayInBlackArea) { 6029 TEST(ContinuousLeftTrimFixedArrayInBlackArea) {
5988 if (!i::FLAG_incremental_marking) return; 6030 if (!FLAG_incremental_marking) return;
5989 FLAG_black_allocation = true; 6031 FLAG_black_allocation = true;
5990 CcTest::InitializeVM(); 6032 CcTest::InitializeVM();
5991 v8::HandleScope scope(CcTest::isolate()); 6033 v8::HandleScope scope(CcTest::isolate());
5992 Heap* heap = CcTest::heap(); 6034 Heap* heap = CcTest::heap();
5993 Isolate* isolate = heap->isolate(); 6035 Isolate* isolate = heap->isolate();
5994 CcTest::CollectAllGarbage(); 6036 CcTest::CollectAllGarbage();
5995 6037
5996 i::MarkCompactCollector* collector = heap->mark_compact_collector(); 6038 i::MarkCompactCollector* collector = heap->mark_compact_collector();
5997 i::IncrementalMarking* marking = heap->incremental_marking(); 6039 i::IncrementalMarking* marking = heap->incremental_marking();
5998 if (collector->sweeping_in_progress()) { 6040 if (collector->sweeping_in_progress()) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
6044 CHECK(ObjectMarking::IsBlack(trimmed, MarkingState::Internal(trimmed))); 6086 CHECK(ObjectMarking::IsBlack(trimmed, MarkingState::Internal(trimmed)));
6045 CHECK(ObjectMarking::IsBlack(previous, MarkingState::Internal(previous))); 6087 CHECK(ObjectMarking::IsBlack(previous, MarkingState::Internal(previous)));
6046 previous = trimmed; 6088 previous = trimmed;
6047 } 6089 }
6048 } 6090 }
6049 6091
6050 heap::GcAndSweep(heap, OLD_SPACE); 6092 heap::GcAndSweep(heap, OLD_SPACE);
6051 } 6093 }
6052 6094
6053 TEST(ContinuousRightTrimFixedArrayInBlackArea) { 6095 TEST(ContinuousRightTrimFixedArrayInBlackArea) {
6054 if (!i::FLAG_incremental_marking) return; 6096 if (!FLAG_incremental_marking) return;
6055 FLAG_black_allocation = true; 6097 FLAG_black_allocation = true;
6056 CcTest::InitializeVM(); 6098 CcTest::InitializeVM();
6057 v8::HandleScope scope(CcTest::isolate()); 6099 v8::HandleScope scope(CcTest::isolate());
6058 Heap* heap = CcTest::heap(); 6100 Heap* heap = CcTest::heap();
6059 Isolate* isolate = heap->isolate(); 6101 Isolate* isolate = heap->isolate();
6060 CcTest::CollectAllGarbage(); 6102 CcTest::CollectAllGarbage();
6061 6103
6062 i::MarkCompactCollector* collector = heap->mark_compact_collector(); 6104 i::MarkCompactCollector* collector = heap->mark_compact_collector();
6063 i::IncrementalMarking* marking = heap->incremental_marking(); 6105 i::IncrementalMarking* marking = heap->incremental_marking();
6064 if (collector->sweeping_in_progress()) { 6106 if (collector->sweeping_in_progress()) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
6104 HeapObject* filler = HeapObject::FromAddress(previous); 6146 HeapObject* filler = HeapObject::FromAddress(previous);
6105 CHECK(filler->IsFiller()); 6147 CHECK(filler->IsFiller());
6106 CHECK(ObjectMarking::IsWhite(filler, MarkingState::Internal(filler))); 6148 CHECK(ObjectMarking::IsWhite(filler, MarkingState::Internal(filler)));
6107 } 6149 }
6108 } 6150 }
6109 6151
6110 heap::GcAndSweep(heap, OLD_SPACE); 6152 heap::GcAndSweep(heap, OLD_SPACE);
6111 } 6153 }
6112 6154
6113 TEST(Regress618958) { 6155 TEST(Regress618958) {
6114 if (!i::FLAG_incremental_marking) return; 6156 if (!FLAG_incremental_marking) return;
6115 CcTest::InitializeVM(); 6157 CcTest::InitializeVM();
6116 v8::HandleScope scope(CcTest::isolate()); 6158 v8::HandleScope scope(CcTest::isolate());
6117 Heap* heap = CcTest::heap(); 6159 Heap* heap = CcTest::heap();
6118 bool isolate_is_locked = true; 6160 bool isolate_is_locked = true;
6119 heap->update_external_memory(100 * MB); 6161 heap->update_external_memory(100 * MB);
6120 int mark_sweep_count_before = heap->ms_count(); 6162 int mark_sweep_count_before = heap->ms_count();
6121 heap->MemoryPressureNotification(MemoryPressureLevel::kCritical, 6163 heap->MemoryPressureNotification(MemoryPressureLevel::kCritical,
6122 isolate_is_locked); 6164 isolate_is_locked);
6123 int mark_sweep_count_after = heap->ms_count(); 6165 int mark_sweep_count_after = heap->ms_count();
6124 int mark_sweeps_performed = mark_sweep_count_after - mark_sweep_count_before; 6166 int mark_sweeps_performed = mark_sweep_count_after - mark_sweep_count_before;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
6214 SlotSet::FREE_EMPTY_BUCKETS); 6256 SlotSet::FREE_EMPTY_BUCKETS);
6215 slots[chunk->area_end() - kPointerSize] = false; 6257 slots[chunk->area_end() - kPointerSize] = false;
6216 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { 6258 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) {
6217 CHECK(slots[addr]); 6259 CHECK(slots[addr]);
6218 return KEEP_SLOT; 6260 return KEEP_SLOT;
6219 }); 6261 });
6220 } 6262 }
6221 6263
6222 HEAP_TEST(Regress670675) { 6264 HEAP_TEST(Regress670675) {
6223 if (!FLAG_incremental_marking) return; 6265 if (!FLAG_incremental_marking) return;
6266 FLAG_stress_incremental_marking = false;
6224 CcTest::InitializeVM(); 6267 CcTest::InitializeVM();
6225 v8::HandleScope scope(CcTest::isolate()); 6268 v8::HandleScope scope(CcTest::isolate());
6226 Heap* heap = CcTest::heap(); 6269 Heap* heap = CcTest::heap();
6227 Isolate* isolate = heap->isolate(); 6270 Isolate* isolate = heap->isolate();
6228 i::MarkCompactCollector* collector = heap->mark_compact_collector(); 6271 i::MarkCompactCollector* collector = heap->mark_compact_collector();
6229 CcTest::CollectAllGarbage(); 6272 CcTest::CollectAllGarbage();
6230 6273
6231 if (collector->sweeping_in_progress()) { 6274 if (collector->sweeping_in_progress()) {
6232 collector->EnsureSweepingCompleted(); 6275 collector->EnsureSweepingCompleted();
6233 } 6276 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
6298 CHECK(!heap->code_space()->FirstPage()->Contains(code->address())); 6341 CHECK(!heap->code_space()->FirstPage()->Contains(code->address()));
6299 6342
6300 // Ensure it's not in large object space. 6343 // Ensure it's not in large object space.
6301 MemoryChunk* chunk = MemoryChunk::FromAddress(code->address()); 6344 MemoryChunk* chunk = MemoryChunk::FromAddress(code->address());
6302 CHECK(chunk->owner()->identity() != LO_SPACE); 6345 CHECK(chunk->owner()->identity() != LO_SPACE);
6303 CHECK(chunk->NeverEvacuate()); 6346 CHECK(chunk->NeverEvacuate());
6304 } 6347 }
6305 6348
6306 } // namespace internal 6349 } // namespace internal
6307 } // namespace v8 6350 } // namespace v8
OLDNEW
« no previous file with comments | « test/cctest/heap/test-compaction.cc ('k') | test/cctest/heap/test-incremental-marking.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698