Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index 4909c95258fbbd44f76299be87a6e67bb883c7f7..31afa891878144e2e31a0bf1f3194c19d0f2d384 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -11316,15 +11316,25 @@ void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) { |
| } |
| -static Code::Age EffectiveAge(Code::Age age) { |
| - if (age == Code::kNotExecutedCodeAge) { |
| - // Treat that's never been executed as old immediately. |
| - age = Code::kIsOldCodeAge; |
| - } else if (age == Code::kExecutedOnceCodeAge) { |
| - // Pre-age code that has only been executed once. |
| - age = Code::kPreAgedCodeAge; |
| +// NextAge defines the Code::Age state transitions during a GC cycle. |
| +static Code::Age NextAge(Code::Age age) { |
| + switch (age) { |
| + case Code::kNotExecutedCodeAge: // Keep, until we've been executed. |
| + case Code::kToBeExecutedOnceCodeAge: // Keep, until we've been executed. |
| + case Code::kLastCodeAge: // Clamp at last Code::Age value. |
| + return age; |
| + case Code::kExecutedOnceCodeAge: |
| + // Pre-age code that has only been executed once. |
| + return static_cast<Code::Age>(Code::kPreAgedCodeAge + 1); |
| + default: |
| + return static_cast<Code::Age>(age + 1); // Default case: Increase age. |
| } |
| - return age; |
| +} |
| + |
| + |
| +// IsOldAge defines the collection criteria for a Code objectsgit diff. |
|
rmcilroy
2015/04/30 10:42:03
remove "git diff" (typing into the wrong window?
vogelheim
2015/04/30 11:01:47
Yes. :)
|
| +static bool IsOldAge(Code::Age age) { |
| + return age >= Code::kIsOldCodeAge || age == Code::kNotExecutedCodeAge; |
| } |
| @@ -11334,6 +11344,15 @@ void Code::MakeYoung(Isolate* isolate) { |
| } |
| +void Code::MarkToBeExecutedOnce(Isolate* isolate) { |
| + byte* sequence = FindCodeAgeSequence(); |
| + if (sequence != NULL) { |
| + PatchPlatformCodeAge(isolate, sequence, kToBeExecutedOnceCodeAge, |
| + NO_MARKING_PARITY); |
| + } |
| +} |
| + |
| + |
| void Code::MakeOlder(MarkingParity current_parity) { |
| byte* sequence = FindCodeAgeSequence(); |
| if (sequence != NULL) { |
| @@ -11341,19 +11360,16 @@ void Code::MakeOlder(MarkingParity current_parity) { |
| MarkingParity code_parity; |
| Isolate* isolate = GetIsolate(); |
| GetCodeAgeAndParity(isolate, sequence, &age, &code_parity); |
| - age = EffectiveAge(age); |
| - if (age != kLastCodeAge && code_parity != current_parity) { |
| - PatchPlatformCodeAge(isolate, |
| - sequence, |
| - static_cast<Age>(age + 1), |
| - current_parity); |
| + Age next_age = NextAge(age); |
| + if (age != next_age && code_parity != current_parity) { |
| + PatchPlatformCodeAge(isolate, sequence, next_age, current_parity); |
| } |
| } |
| } |
| bool Code::IsOld() { |
| - return GetAge() >= kIsOldCodeAge; |
| + return IsOldAge(GetAge()); |
| } |
| @@ -11368,11 +11384,6 @@ byte* Code::FindCodeAgeSequence() { |
| Code::Age Code::GetAge() { |
| - return EffectiveAge(GetRawAge()); |
| -} |
| - |
| - |
| -Code::Age Code::GetRawAge() { |
| byte* sequence = FindCodeAgeSequence(); |
| if (sequence == NULL) { |
| return kNoAgeCodeAge; |
| @@ -11416,6 +11427,12 @@ void Code::GetCodeAgeAndParity(Code* code, Age* age, |
| *parity = NO_MARKING_PARITY; |
| return; |
| } |
| + stub = *builtins->MarkCodeAsToBeExecutedOnce(); |
| + if (code == stub) { |
| + *age = kToBeExecutedOnceCodeAge; |
| + *parity = NO_MARKING_PARITY; |
| + return; |
| + } |
| UNREACHABLE(); |
| } |
| @@ -11440,6 +11457,10 @@ Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) { |
| DCHECK(parity == NO_MARKING_PARITY); |
| return *builtins->MarkCodeAsExecutedTwice(); |
| } |
| + case kToBeExecutedOnceCodeAge: { |
| + DCHECK(parity == NO_MARKING_PARITY); |
| + return *builtins->MarkCodeAsToBeExecutedOnce(); |
| + } |
| default: |
| UNREACHABLE(); |
| break; |