Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index f82e92c904adcea112e05778334a7f036c5ee212..889f4ed4812aa44865c28d6f2c054131f79da4fe 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -10367,6 +10367,10 @@ void Code::CopyFrom(const CodeDesc& desc) { |
} else if (RelocInfo::IsRuntimeEntry(mode)) { |
Address p = it.rinfo()->target_runtime_entry(origin); |
it.rinfo()->set_target_runtime_entry(p, SKIP_WRITE_BARRIER); |
+ } else if (mode == RelocInfo::CODE_AGE_SEQUENCE) { |
+ Handle<Object> p = it.rinfo()->code_age_stub_handle(origin); |
+ Code* code = Code::cast(*p); |
+ it.rinfo()->set_code_age_stub(code); |
} else { |
it.rinfo()->apply(delta); |
} |
@@ -10608,6 +10612,12 @@ void Code::MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate) { |
} |
+void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) { |
+ PatchPlatformCodeAge(isolate, sequence, kExecutedOnceCodeAge, |
+ NO_MARKING_PARITY); |
+} |
+ |
+ |
void Code::MakeOlder(MarkingParity current_parity) { |
byte* sequence = FindCodeAgeSequence(); |
if (sequence != NULL) { |
@@ -10625,18 +10635,14 @@ void Code::MakeOlder(MarkingParity current_parity) { |
bool Code::IsOld() { |
- byte* sequence = FindCodeAgeSequence(); |
- if (sequence == NULL) return false; |
- Age age; |
- MarkingParity parity; |
- GetCodeAgeAndParity(sequence, &age, &parity); |
- return age >= kSexagenarianCodeAge; |
+ Age age = GetAge(); |
+ return age >= kIsOldCodeAge; |
} |
byte* Code::FindCodeAgeSequence() { |
return FLAG_age_code && |
- prologue_offset() != kPrologueOffsetNotSet && |
+ prologue_offset() != Code::kPrologueOffsetNotSet && |
(kind() == OPTIMIZED_FUNCTION || |
(kind() == FUNCTION && !has_debug_break_slots())) |
? instruction_start() + prologue_offset() |
@@ -10644,7 +10650,7 @@ byte* Code::FindCodeAgeSequence() { |
} |
-int Code::GetAge() { |
+Code::Age Code::GetAge() { |
byte* sequence = FindCodeAgeSequence(); |
if (sequence == NULL) { |
return Code::kNoAge; |
@@ -10676,6 +10682,20 @@ void Code::GetCodeAgeAndParity(Code* code, Age* age, |
} |
CODE_AGE_LIST(HANDLE_CODE_AGE) |
#undef HANDLE_CODE_AGE |
+ stub = *builtins->MarkCodeAsExecutedOnce(); |
+ if (code == stub) { |
+ // Treat that's never been executed as old immediatly. |
+ *age = kIsOldCodeAge; |
+ *parity = NO_MARKING_PARITY; |
+ return; |
+ } |
+ stub = *builtins->MarkCodeAsExecutedTwice(); |
+ if (code == stub) { |
+ // Pre-age code that has only been executed once. |
+ *age = kPreAgedCodeAge; |
+ *parity = NO_MARKING_PARITY; |
+ return; |
+ } |
UNREACHABLE(); |
} |
@@ -10692,6 +10712,14 @@ Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) { |
} |
CODE_AGE_LIST(HANDLE_CODE_AGE) |
#undef HANDLE_CODE_AGE |
+ case kNotExecutedCodeAge: { |
+ ASSERT(parity == NO_MARKING_PARITY); |
+ return *builtins->MarkCodeAsExecutedOnce(); |
+ } |
+ case kExecutedOnceCodeAge: { |
+ ASSERT(parity == NO_MARKING_PARITY); |
+ return *builtins->MarkCodeAsExecutedTwice(); |
+ } |
default: |
UNREACHABLE(); |
break; |