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

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

Issue 2529173002: [Heap] Remove concept of MarkingParity. (Closed)
Patch Set: Rebase Created 4 years 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 | « src/x87/codegen-x87.cc ('k') | no next file » | 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 1468 matching lines...) Expand 10 before | Expand all | Expand 10 after
1479 1479
1480 // Clear references to functions so that one of them can die. 1480 // Clear references to functions so that one of them can die.
1481 { v8::HandleScope scope(CcTest::isolate()); 1481 { v8::HandleScope scope(CcTest::isolate());
1482 CompileRun("foo = 0; bar = 0;"); 1482 CompileRun("foo = 0; bar = 0;");
1483 } 1483 }
1484 1484
1485 // Bump the code age so that flushing is triggered while the function 1485 // Bump the code age so that flushing is triggered while the function
1486 // object is still located in new-space. 1486 // object is still located in new-space.
1487 const int kAgingThreshold = 6; 1487 const int kAgingThreshold = 6;
1488 for (int i = 0; i < kAgingThreshold; i++) { 1488 for (int i = 0; i < kAgingThreshold; i++) {
1489 function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 1489 function->shared()->code()->MakeOlder();
1490 function2->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 1490 function2->shared()->code()->MakeOlder();
1491 } 1491 }
1492 1492
1493 // Simulate incremental marking so that the functions are enqueued as 1493 // Simulate incremental marking so that the functions are enqueued as
1494 // code flushing candidates. Then kill one of the functions. Finally 1494 // code flushing candidates. Then kill one of the functions. Finally
1495 // perform a scavenge while incremental marking is still running. 1495 // perform a scavenge while incremental marking is still running.
1496 heap::SimulateIncrementalMarking(CcTest::heap(), false); 1496 heap::SimulateIncrementalMarking(CcTest::heap(), false);
1497 *function2.location() = NULL; 1497 *function2.location() = NULL;
1498 CcTest::CollectGarbage(NEW_SPACE); 1498 CcTest::CollectGarbage(NEW_SPACE);
1499 1499
1500 // Simulate one final GC to make sure the candidate queue is sane. 1500 // Simulate one final GC to make sure the candidate queue is sane.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1538 CHECK(function->shared()->is_compiled()); 1538 CHECK(function->shared()->is_compiled());
1539 1539
1540 // The code will survive at least two GCs. 1540 // The code will survive at least two GCs.
1541 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); 1541 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
1542 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); 1542 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
1543 CHECK(function->shared()->is_compiled()); 1543 CHECK(function->shared()->is_compiled());
1544 1544
1545 // Bump the code age so that flushing is triggered. 1545 // Bump the code age so that flushing is triggered.
1546 const int kAgingThreshold = 6; 1546 const int kAgingThreshold = 6;
1547 for (int i = 0; i < kAgingThreshold; i++) { 1547 for (int i = 0; i < kAgingThreshold; i++) {
1548 function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 1548 function->shared()->code()->MakeOlder();
1549 } 1549 }
1550 1550
1551 // Simulate incremental marking so that the function is enqueued as 1551 // Simulate incremental marking so that the function is enqueued as
1552 // code flushing candidate. 1552 // code flushing candidate.
1553 heap::SimulateIncrementalMarking(heap); 1553 heap::SimulateIncrementalMarking(heap);
1554 1554
1555 // Enable the debugger and add a breakpoint while incremental marking 1555 // Enable the debugger and add a breakpoint while incremental marking
1556 // is running so that incremental marking aborts and code flushing is 1556 // is running so that incremental marking aborts and code flushing is
1557 // disabled. 1557 // disabled.
1558 int position = function->shared()->start_position(); 1558 int position = function->shared()->start_position();
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1657 if (!FLAG_optimize_for_size) { 1657 if (!FLAG_optimize_for_size) {
1658 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); 1658 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
1659 info = compilation_cache->LookupScript(source, Handle<Object>(), 0, 0, 1659 info = compilation_cache->LookupScript(source, Handle<Object>(), 0, 0,
1660 v8::ScriptOriginOptions(true, false), 1660 v8::ScriptOriginOptions(true, false),
1661 native_context, language_mode); 1661 native_context, language_mode);
1662 CHECK(!info.is_null()); 1662 CHECK(!info.is_null());
1663 } 1663 }
1664 1664
1665 // Progress code age until it's old and ready for GC. 1665 // Progress code age until it's old and ready for GC.
1666 while (!info.ToHandleChecked()->code()->IsOld()) { 1666 while (!info.ToHandleChecked()->code()->IsOld()) {
1667 // To guarantee progress, we have to MakeOlder with different parities. 1667 info.ToHandleChecked()->code()->MakeOlder();
1668 // We can't just use NO_MARKING_PARITY, since e.g. kExecutedOnceCodeAge is
1669 // always NO_MARKING_PARITY and the code age only progresses if the parity
1670 // is different.
1671 info.ToHandleChecked()->code()->MakeOlder(ODD_MARKING_PARITY);
1672 info.ToHandleChecked()->code()->MakeOlder(EVEN_MARKING_PARITY);
1673 } 1668 }
1674 1669
1675 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); 1670 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
1676 // Ensure code aging cleared the entry from the cache. 1671 // Ensure code aging cleared the entry from the cache.
1677 info = compilation_cache->LookupScript(source, Handle<Object>(), 0, 0, 1672 info = compilation_cache->LookupScript(source, Handle<Object>(), 0, 0,
1678 v8::ScriptOriginOptions(true, false), 1673 v8::ScriptOriginOptions(true, false),
1679 native_context, language_mode); 1674 native_context, language_mode);
1680 CHECK(info.is_null()); 1675 CHECK(info.is_null());
1681 } 1676 }
1682 1677
(...skipping 2345 matching lines...) Expand 10 before | Expand all | Expand 10 after
4028 CcTest::global()->Get(env.local(), v8_str("f")).ToLocalChecked()))); 4023 CcTest::global()->Get(env.local(), v8_str("f")).ToLocalChecked())));
4029 CHECK(f->is_compiled()); 4024 CHECK(f->is_compiled());
4030 CompileRun("f = null;"); 4025 CompileRun("f = null;");
4031 4026
4032 Handle<JSFunction> g = Handle<JSFunction>::cast( 4027 Handle<JSFunction> g = Handle<JSFunction>::cast(
4033 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 4028 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
4034 CcTest::global()->Get(env.local(), v8_str("g")).ToLocalChecked()))); 4029 CcTest::global()->Get(env.local(), v8_str("g")).ToLocalChecked())));
4035 CHECK(g->is_compiled()); 4030 CHECK(g->is_compiled());
4036 const int kAgingThreshold = 6; 4031 const int kAgingThreshold = 6;
4037 for (int i = 0; i < kAgingThreshold; i++) { 4032 for (int i = 0; i < kAgingThreshold; i++) {
4038 g->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 4033 g->code()->MakeOlder();
4039 } 4034 }
4040 4035
4041 code = inner_scope.CloseAndEscape(Handle<Code>(f->code())); 4036 code = inner_scope.CloseAndEscape(Handle<Code>(f->code()));
4042 } 4037 }
4043 4038
4044 // Simulate incremental marking so that the functions are enqueued as 4039 // Simulate incremental marking so that the functions are enqueued as
4045 // code flushing candidates. Then optimize one function. Finally 4040 // code flushing candidates. Then optimize one function. Finally
4046 // finish the GC to complete code flushing. 4041 // finish the GC to complete code flushing.
4047 heap::SimulateIncrementalMarking(heap); 4042 heap::SimulateIncrementalMarking(heap);
4048 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);"); 4043 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);");
(...skipping 27 matching lines...) Expand all
4076 "var f = mkClosure();" 4071 "var f = mkClosure();"
4077 "f(1); f(2);" 4072 "f(1); f(2);"
4078 "%OptimizeFunctionOnNextCall(f); f(3);"); 4073 "%OptimizeFunctionOnNextCall(f); f(3);");
4079 4074
4080 Handle<JSFunction> f = Handle<JSFunction>::cast( 4075 Handle<JSFunction> f = Handle<JSFunction>::cast(
4081 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 4076 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
4082 CcTest::global()->Get(env.local(), v8_str("f")).ToLocalChecked()))); 4077 CcTest::global()->Get(env.local(), v8_str("f")).ToLocalChecked())));
4083 CHECK(f->is_compiled()); 4078 CHECK(f->is_compiled());
4084 const int kAgingThreshold = 6; 4079 const int kAgingThreshold = 6;
4085 for (int i = 0; i < kAgingThreshold; i++) { 4080 for (int i = 0; i < kAgingThreshold; i++) {
4086 f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 4081 f->shared()->code()->MakeOlder();
4087 } 4082 }
4088 4083
4089 CompileRun("f = null;"); 4084 CompileRun("f = null;");
4090 } 4085 }
4091 4086
4092 // Simulate incremental marking so that unoptimized code is flushed 4087 // Simulate incremental marking so that unoptimized code is flushed
4093 // even though it still is cached in the optimized code map. 4088 // even though it still is cached in the optimized code map.
4094 heap::SimulateIncrementalMarking(heap); 4089 heap::SimulateIncrementalMarking(heap);
4095 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); 4090 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
4096 4091
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4129 "g(false);" 4124 "g(false);"
4130 "%BaselineFunctionOnNextCall(g);" 4125 "%BaselineFunctionOnNextCall(g);"
4131 "g(false);"); 4126 "g(false);");
4132 4127
4133 Handle<JSFunction> f = Handle<JSFunction>::cast( 4128 Handle<JSFunction> f = Handle<JSFunction>::cast(
4134 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 4129 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
4135 CcTest::global()->Get(env.local(), v8_str("f")).ToLocalChecked()))); 4130 CcTest::global()->Get(env.local(), v8_str("f")).ToLocalChecked())));
4136 CHECK(f->is_compiled()); 4131 CHECK(f->is_compiled());
4137 const int kAgingThreshold = 6; 4132 const int kAgingThreshold = 6;
4138 for (int i = 0; i < kAgingThreshold; i++) { 4133 for (int i = 0; i < kAgingThreshold; i++) {
4139 f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 4134 f->shared()->code()->MakeOlder();
4140 } 4135 }
4141 4136
4142 shared1 = inner_scope.CloseAndEscape(handle(f->shared(), isolate)); 4137 shared1 = inner_scope.CloseAndEscape(handle(f->shared(), isolate));
4143 } 4138 }
4144 4139
4145 // Prepare a shared function info eligible for code flushing that will 4140 // Prepare a shared function info eligible for code flushing that will
4146 // represent the dangling tail of the candidate list. 4141 // represent the dangling tail of the candidate list.
4147 Handle<SharedFunctionInfo> shared2; 4142 Handle<SharedFunctionInfo> shared2;
4148 { 4143 {
4149 HandleScope inner_scope(isolate); 4144 HandleScope inner_scope(isolate);
4150 LocalContext env; 4145 LocalContext env;
4151 CompileRun( 4146 CompileRun(
4152 "function flushMe() { return 0; }" 4147 "function flushMe() { return 0; }"
4153 "flushMe(1);" 4148 "flushMe(1);"
4154 "%BaselineFunctionOnNextCall(flushMe);" 4149 "%BaselineFunctionOnNextCall(flushMe);"
4155 "flushMe(1);"); 4150 "flushMe(1);");
4156 4151
4157 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle( 4152 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle(
4158 *v8::Local<v8::Function>::Cast(CcTest::global() 4153 *v8::Local<v8::Function>::Cast(CcTest::global()
4159 ->Get(env.local(), v8_str("flushMe")) 4154 ->Get(env.local(), v8_str("flushMe"))
4160 .ToLocalChecked()))); 4155 .ToLocalChecked())));
4161 CHECK(f->is_compiled()); 4156 CHECK(f->is_compiled());
4162 const int kAgingThreshold = 6; 4157 const int kAgingThreshold = 6;
4163 for (int i = 0; i < kAgingThreshold; i++) { 4158 for (int i = 0; i < kAgingThreshold; i++) {
4164 f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 4159 f->shared()->code()->MakeOlder();
4165 } 4160 }
4166 4161
4167 shared2 = inner_scope.CloseAndEscape(handle(f->shared(), isolate)); 4162 shared2 = inner_scope.CloseAndEscape(handle(f->shared(), isolate));
4168 } 4163 }
4169 4164
4170 // Simulate incremental marking and collect code flushing candidates. 4165 // Simulate incremental marking and collect code flushing candidates.
4171 heap::SimulateIncrementalMarking(heap); 4166 heap::SimulateIncrementalMarking(heap);
4172 CHECK(shared1->code()->gc_metadata() != NULL); 4167 CHECK(shared1->code()->gc_metadata() != NULL);
4173 4168
4174 // Optimize function and make sure the unoptimized code is replaced. 4169 // Optimize function and make sure the unoptimized code is replaced.
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
4545 "f(1); f(2);" 4540 "f(1); f(2);"
4546 "%OptimizeFunctionOnNextCall(f); f(3);"); 4541 "%OptimizeFunctionOnNextCall(f); f(3);");
4547 4542
4548 Handle<JSFunction> g = Handle<JSFunction>::cast(v8::Utils::OpenHandle( 4543 Handle<JSFunction> g = Handle<JSFunction>::cast(v8::Utils::OpenHandle(
4549 *v8::Local<v8::Function>::Cast(CcTest::global() 4544 *v8::Local<v8::Function>::Cast(CcTest::global()
4550 ->Get(context.local(), v8_str("g")) 4545 ->Get(context.local(), v8_str("g"))
4551 .ToLocalChecked()))); 4546 .ToLocalChecked())));
4552 CHECK(g->shared()->is_compiled()); 4547 CHECK(g->shared()->is_compiled());
4553 const int kAgingThreshold = 6; 4548 const int kAgingThreshold = 6;
4554 for (int i = 0; i < kAgingThreshold; i++) { 4549 for (int i = 0; i < kAgingThreshold; i++) {
4555 g->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 4550 g->shared()->code()->MakeOlder();
4556 } 4551 }
4557 4552
4558 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle( 4553 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle(
4559 *v8::Local<v8::Function>::Cast(CcTest::global() 4554 *v8::Local<v8::Function>::Cast(CcTest::global()
4560 ->Get(context.local(), v8_str("f")) 4555 ->Get(context.local(), v8_str("f"))
4561 .ToLocalChecked()))); 4556 .ToLocalChecked())));
4562 CHECK(f->is_compiled()); 4557 CHECK(f->is_compiled());
4563 shared = inner_scope.CloseAndEscape(handle(f->shared(), isolate)); 4558 shared = inner_scope.CloseAndEscape(handle(f->shared(), isolate));
4564 CompileRun("f = null"); 4559 CompileRun("f = null");
4565 } 4560 }
(...skipping 2483 matching lines...) Expand 10 before | Expand all | Expand 10 after
7049 SlotSet::FREE_EMPTY_BUCKETS); 7044 SlotSet::FREE_EMPTY_BUCKETS);
7050 slots[chunk->area_end() - kPointerSize] = false; 7045 slots[chunk->area_end() - kPointerSize] = false;
7051 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { 7046 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) {
7052 CHECK(slots[addr]); 7047 CHECK(slots[addr]);
7053 return KEEP_SLOT; 7048 return KEEP_SLOT;
7054 }); 7049 });
7055 } 7050 }
7056 7051
7057 } // namespace internal 7052 } // namespace internal
7058 } // namespace v8 7053 } // namespace v8
OLDNEW
« no previous file with comments | « src/x87/codegen-x87.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698