Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index ce17d449023896d0e8af407cac62978e379044d7..cc7ac5ca7acc047e93bc638af40c3ec555ab3677 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -7792,6 +7792,7 @@ void SharedFunctionInfo::InstallFromOptimizedCodeMap(JSFunction* function, |
ASSERT(code != NULL); |
ASSERT(function->context()->native_context() == code_map->get(index - 1)); |
function->ReplaceCode(code); |
+ code->MakeYoung(); |
} |
@@ -8388,6 +8389,15 @@ void ObjectVisitor::VisitCodeTarget(RelocInfo* rinfo) { |
} |
+void ObjectVisitor::VisitCodeAgeSequence(RelocInfo* rinfo) { |
+ ASSERT(RelocInfo::IsCodeAgeSequence(rinfo->rmode())); |
+ Object* stub = rinfo->code_age_stub(); |
+ if (stub) { |
+ VisitPointer(&stub); |
+ } |
+} |
+ |
+ |
void ObjectVisitor::VisitCodeEntry(Address entry_address) { |
Object* code = Code::GetObjectFromEntryAddress(entry_address); |
Object* old_code = code; |
@@ -8600,6 +8610,99 @@ bool Code::allowed_in_shared_map_code_cache() { |
} |
+void Code::MakeCodeAgeSequenceYoung(byte* sequence) { |
+ PatchPlatformCodeAge(sequence, kNoAge, NO_MARKING_PARITY); |
+} |
+ |
+ |
+void Code::MakeYoung() { |
+ byte* sequence = FindCodeAgeSequence(); |
+ if (sequence != NULL) { |
+ PatchPlatformCodeAge(sequence, kNoAge, NO_MARKING_PARITY); |
+ } |
+} |
+ |
+ |
+void Code::MakeOlder(MarkingParity current_parity) { |
+ byte* sequence = FindCodeAgeSequence(); |
+ if (sequence != NULL) { |
+ Age age; |
+ MarkingParity code_parity; |
+ GetCodeAgeAndParity(sequence, &age, &code_parity); |
+ if (age != kLastCodeAge && code_parity != current_parity) { |
+ PatchPlatformCodeAge(sequence, static_cast<Age>(age + 1), |
+ current_parity); |
+ } |
+ } |
+} |
+ |
+ |
+bool Code::IsOld() { |
+ byte* sequence = FindCodeAgeSequence(); |
+ if (sequence == NULL) return false; |
+ Age age; |
+ MarkingParity parity; |
+ GetCodeAgeAndParity(sequence, &age, &parity); |
+ return age >= kSexagenarianCodeAge; |
+} |
+ |
+ |
+byte* Code::FindCodeAgeSequence() { |
+ if (kind() != FUNCTION && kind() != OPTIMIZED_FUNCTION) return NULL; |
+ if (strlen(FLAG_stop_at) == 0 && |
+ !ProfileEntryHookStub::HasEntryHook() && |
+ (kind() == FUNCTION && !has_debug_break_slots())) { |
+ return FindPlatformCodeAgeSequence(); |
+ } |
+ return NULL; |
+} |
+ |
+ |
+void Code::GetCodeAgeAndParity(Code* code, Age* age, |
+ MarkingParity* parity) { |
+ Isolate* isolate = Isolate::Current(); |
+ Builtins* builtins = isolate->builtins(); |
+ Code* stub = NULL; |
+#define HANDLE_CODE_AGE(AGE) \ |
+ stub = *builtins->Make##AGE##CodeYoungAgainEvenMarking(); \ |
+ if (code == stub) { \ |
+ *age = k##AGE##CodeAge; \ |
+ *parity = EVEN_MARKING_PARITY; \ |
+ return; \ |
+ } \ |
+ stub = *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ |
+ if (code == stub) { \ |
+ *age = k##AGE##CodeAge; \ |
+ *parity = ODD_MARKING_PARITY; \ |
+ return; \ |
+ } |
+ CODE_AGE_LIST(HANDLE_CODE_AGE) |
+#undef HANDLE_CODE_AGE |
+ UNREACHABLE(); |
+} |
+ |
+ |
+Code* Code::GetCodeAgeStub(Age age, MarkingParity parity) { |
+ Isolate* isolate = Isolate::Current(); |
+ Builtins* builtins = isolate->builtins(); |
+ switch (age) { |
+#define HANDLE_CODE_AGE(AGE) \ |
+ case k##AGE##CodeAge: { \ |
+ Code* stub = parity == EVEN_MARKING_PARITY \ |
+ ? *builtins->Make##AGE##CodeYoungAgainEvenMarking() \ |
+ : *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ |
+ return stub; \ |
+ } |
+ CODE_AGE_LIST(HANDLE_CODE_AGE) |
+#undef HANDLE_CODE_AGE |
+ default: |
+ UNREACHABLE(); |
+ break; |
+ } |
+ return NULL; |
+} |
+ |
+ |
#ifdef ENABLE_DISASSEMBLER |
void DeoptimizationInputData::DeoptimizationInputDataPrint(FILE* out) { |