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

Unified Diff: src/objects.cc

Issue 1107233004: Implement kToBeExecutedOnceCodeAge. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@mandreel
Patch Set: Fix comment. Created 5 years, 8 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.h ('k') | src/ppc/builtins-ppc.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 4909c95258fbbd44f76299be87a6e67bb883c7f7..c9386b61e80e58e79ac204920673e24f30805c07 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 object.
+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;
« no previous file with comments | « src/objects.h ('k') | src/ppc/builtins-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698