Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index b3a264e79831963d91b91818db9634ef4400244a..19c1457c476bad4bcc549a82965774f1961befab 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -10438,6 +10438,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) { |
@@ -10455,12 +10461,8 @@ 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; |
} |
@@ -10474,7 +10476,7 @@ byte* Code::FindCodeAgeSequence() { |
} |
-int Code::GetAge() { |
+Code::Age Code::GetAge() { |
byte* sequence = FindCodeAgeSequence(); |
if (sequence == NULL) { |
return Code::kNoAge; |
@@ -10506,6 +10508,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(); |
} |
@@ -10522,6 +10538,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; |