| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 530fb6d804d5d7eb5a4bccd380eaa40b60733ff3..a5316b95c1e26b6d30fbe2c2626fd0d8da7621c5 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -10271,6 +10271,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);
|
| }
|
| @@ -10512,6 +10516,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) {
|
| @@ -10529,18 +10539,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()
|
| @@ -10548,7 +10554,7 @@ byte* Code::FindCodeAgeSequence() {
|
| }
|
|
|
|
|
| -int Code::GetAge() {
|
| +Code::Age Code::GetAge() {
|
| byte* sequence = FindCodeAgeSequence();
|
| if (sequence == NULL) {
|
| return Code::kNoAge;
|
| @@ -10580,6 +10586,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();
|
| }
|
|
|
| @@ -10596,6 +10616,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;
|
|
|