| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 14389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14400 } | 14400 } |
| 14401 | 14401 |
| 14402 int Code::LookupRangeInHandlerTable(int code_offset, int* data, | 14402 int Code::LookupRangeInHandlerTable(int code_offset, int* data, |
| 14403 HandlerTable::CatchPrediction* prediction) { | 14403 HandlerTable::CatchPrediction* prediction) { |
| 14404 DCHECK(!is_optimized_code()); | 14404 DCHECK(!is_optimized_code()); |
| 14405 HandlerTable* table = HandlerTable::cast(handler_table()); | 14405 HandlerTable* table = HandlerTable::cast(handler_table()); |
| 14406 return table->LookupRange(code_offset, data, prediction); | 14406 return table->LookupRange(code_offset, data, prediction); |
| 14407 } | 14407 } |
| 14408 | 14408 |
| 14409 void Code::MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate) { | 14409 void Code::MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate) { |
| 14410 PatchPlatformCodeAge(isolate, sequence, kNoAgeCodeAge, NO_MARKING_PARITY); | 14410 PatchPlatformCodeAge(isolate, sequence, kNoAgeCodeAge); |
| 14411 } | 14411 } |
| 14412 | 14412 |
| 14413 | 14413 |
| 14414 void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) { | 14414 void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) { |
| 14415 PatchPlatformCodeAge(isolate, sequence, kExecutedOnceCodeAge, | 14415 PatchPlatformCodeAge(isolate, sequence, kExecutedOnceCodeAge); |
| 14416 NO_MARKING_PARITY); | |
| 14417 } | 14416 } |
| 14418 | 14417 |
| 14419 | 14418 |
| 14420 // NextAge defines the Code::Age state transitions during a GC cycle. | 14419 // NextAge defines the Code::Age state transitions during a GC cycle. |
| 14421 static Code::Age NextAge(Code::Age age) { | 14420 static Code::Age NextAge(Code::Age age) { |
| 14422 switch (age) { | 14421 switch (age) { |
| 14423 case Code::kNotExecutedCodeAge: // Keep, until we've been executed. | 14422 case Code::kNotExecutedCodeAge: // Keep, until we've been executed. |
| 14424 case Code::kToBeExecutedOnceCodeAge: // Keep, until we've been executed. | 14423 case Code::kToBeExecutedOnceCodeAge: // Keep, until we've been executed. |
| 14425 case Code::kLastCodeAge: // Clamp at last Code::Age value. | 14424 case Code::kLastCodeAge: // Clamp at last Code::Age value. |
| 14426 return age; | 14425 return age; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 14440 | 14439 |
| 14441 | 14440 |
| 14442 void Code::MakeYoung(Isolate* isolate) { | 14441 void Code::MakeYoung(Isolate* isolate) { |
| 14443 byte* sequence = FindCodeAgeSequence(); | 14442 byte* sequence = FindCodeAgeSequence(); |
| 14444 if (sequence != NULL) MakeCodeAgeSequenceYoung(sequence, isolate); | 14443 if (sequence != NULL) MakeCodeAgeSequenceYoung(sequence, isolate); |
| 14445 } | 14444 } |
| 14446 | 14445 |
| 14447 void Code::PreAge(Isolate* isolate) { | 14446 void Code::PreAge(Isolate* isolate) { |
| 14448 byte* sequence = FindCodeAgeSequence(); | 14447 byte* sequence = FindCodeAgeSequence(); |
| 14449 if (sequence != NULL) { | 14448 if (sequence != NULL) { |
| 14450 PatchPlatformCodeAge(isolate, sequence, kPreAgedCodeAge, NO_MARKING_PARITY); | 14449 PatchPlatformCodeAge(isolate, sequence, kPreAgedCodeAge); |
| 14451 } | 14450 } |
| 14452 } | 14451 } |
| 14453 | 14452 |
| 14454 void Code::MarkToBeExecutedOnce(Isolate* isolate) { | 14453 void Code::MarkToBeExecutedOnce(Isolate* isolate) { |
| 14455 byte* sequence = FindCodeAgeSequence(); | 14454 byte* sequence = FindCodeAgeSequence(); |
| 14456 if (sequence != NULL) { | 14455 if (sequence != NULL) { |
| 14457 PatchPlatformCodeAge(isolate, sequence, kToBeExecutedOnceCodeAge, | 14456 PatchPlatformCodeAge(isolate, sequence, kToBeExecutedOnceCodeAge); |
| 14458 NO_MARKING_PARITY); | |
| 14459 } | 14457 } |
| 14460 } | 14458 } |
| 14461 | 14459 |
| 14462 void Code::MakeOlder(MarkingParity current_parity) { | 14460 void Code::MakeOlder() { |
| 14463 byte* sequence = FindCodeAgeSequence(); | 14461 byte* sequence = FindCodeAgeSequence(); |
| 14464 if (sequence != NULL) { | 14462 if (sequence != NULL) { |
| 14465 Age age; | |
| 14466 MarkingParity code_parity; | |
| 14467 Isolate* isolate = GetIsolate(); | 14463 Isolate* isolate = GetIsolate(); |
| 14468 GetCodeAgeAndParity(isolate, sequence, &age, &code_parity); | 14464 Age age = GetCodeAge(isolate, sequence); |
| 14469 Age next_age = NextAge(age); | 14465 Age next_age = NextAge(age); |
| 14470 if (age != next_age && code_parity != current_parity) { | 14466 if (age != next_age) { |
| 14471 PatchPlatformCodeAge(isolate, sequence, next_age, current_parity); | 14467 PatchPlatformCodeAge(isolate, sequence, next_age); |
| 14472 } | 14468 } |
| 14473 } | 14469 } |
| 14474 } | 14470 } |
| 14475 | 14471 |
| 14476 | 14472 |
| 14477 bool Code::IsOld() { | 14473 bool Code::IsOld() { |
| 14478 return IsOldAge(GetAge()); | 14474 return IsOldAge(GetAge()); |
| 14479 } | 14475 } |
| 14480 | 14476 |
| 14481 | 14477 |
| 14482 byte* Code::FindCodeAgeSequence() { | 14478 byte* Code::FindCodeAgeSequence() { |
| 14483 return FLAG_age_code && | 14479 return FLAG_age_code && |
| 14484 prologue_offset() != Code::kPrologueOffsetNotSet && | 14480 prologue_offset() != Code::kPrologueOffsetNotSet && |
| 14485 (kind() == OPTIMIZED_FUNCTION || | 14481 (kind() == OPTIMIZED_FUNCTION || |
| 14486 (kind() == FUNCTION && !has_debug_break_slots())) | 14482 (kind() == FUNCTION && !has_debug_break_slots())) |
| 14487 ? instruction_start() + prologue_offset() | 14483 ? instruction_start() + prologue_offset() |
| 14488 : NULL; | 14484 : NULL; |
| 14489 } | 14485 } |
| 14490 | 14486 |
| 14491 | 14487 |
| 14492 Code::Age Code::GetAge() { | 14488 Code::Age Code::GetAge() { |
| 14493 byte* sequence = FindCodeAgeSequence(); | 14489 byte* sequence = FindCodeAgeSequence(); |
| 14494 if (sequence == NULL) { | 14490 if (sequence == NULL) { |
| 14495 return kNoAgeCodeAge; | 14491 return kNoAgeCodeAge; |
| 14496 } | 14492 } |
| 14497 Age age; | 14493 return GetCodeAge(GetIsolate(), sequence); |
| 14498 MarkingParity parity; | |
| 14499 GetCodeAgeAndParity(GetIsolate(), sequence, &age, &parity); | |
| 14500 return age; | |
| 14501 } | 14494 } |
| 14502 | 14495 |
| 14503 | 14496 Code::Age Code::GetAgeOfCodeAgeStub(Code* code) { |
| 14504 void Code::GetCodeAgeAndParity(Code* code, Age* age, | |
| 14505 MarkingParity* parity) { | |
| 14506 Isolate* isolate = code->GetIsolate(); | 14497 Isolate* isolate = code->GetIsolate(); |
| 14507 Builtins* builtins = isolate->builtins(); | 14498 Builtins* builtins = isolate->builtins(); |
| 14508 Code* stub = NULL; | 14499 #define HANDLE_CODE_AGE(AGE) \ |
| 14509 #define HANDLE_CODE_AGE(AGE) \ | 14500 if (code == *builtins->Make##AGE##CodeYoungAgain()) { \ |
| 14510 stub = *builtins->Make##AGE##CodeYoungAgainEvenMarking(); \ | 14501 return k##AGE##CodeAge; \ |
| 14511 if (code == stub) { \ | |
| 14512 *age = k##AGE##CodeAge; \ | |
| 14513 *parity = EVEN_MARKING_PARITY; \ | |
| 14514 return; \ | |
| 14515 } \ | |
| 14516 stub = *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ | |
| 14517 if (code == stub) { \ | |
| 14518 *age = k##AGE##CodeAge; \ | |
| 14519 *parity = ODD_MARKING_PARITY; \ | |
| 14520 return; \ | |
| 14521 } | 14502 } |
| 14522 CODE_AGE_LIST(HANDLE_CODE_AGE) | 14503 CODE_AGE_LIST(HANDLE_CODE_AGE) |
| 14523 #undef HANDLE_CODE_AGE | 14504 #undef HANDLE_CODE_AGE |
| 14524 stub = *builtins->MarkCodeAsExecutedOnce(); | 14505 if (code == *builtins->MarkCodeAsExecutedOnce()) { |
| 14525 if (code == stub) { | 14506 return kNotExecutedCodeAge; |
| 14526 *age = kNotExecutedCodeAge; | |
| 14527 *parity = NO_MARKING_PARITY; | |
| 14528 return; | |
| 14529 } | 14507 } |
| 14530 stub = *builtins->MarkCodeAsExecutedTwice(); | 14508 if (code == *builtins->MarkCodeAsExecutedTwice()) { |
| 14531 if (code == stub) { | 14509 return kExecutedOnceCodeAge; |
| 14532 *age = kExecutedOnceCodeAge; | |
| 14533 *parity = NO_MARKING_PARITY; | |
| 14534 return; | |
| 14535 } | 14510 } |
| 14536 stub = *builtins->MarkCodeAsToBeExecutedOnce(); | 14511 if (code == *builtins->MarkCodeAsToBeExecutedOnce()) { |
| 14537 if (code == stub) { | 14512 return kToBeExecutedOnceCodeAge; |
| 14538 *age = kToBeExecutedOnceCodeAge; | |
| 14539 *parity = NO_MARKING_PARITY; | |
| 14540 return; | |
| 14541 } | 14513 } |
| 14542 UNREACHABLE(); | 14514 UNREACHABLE(); |
| 14515 return kNoAgeCodeAge; |
| 14543 } | 14516 } |
| 14544 | 14517 |
| 14545 | 14518 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age) { |
| 14546 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) { | |
| 14547 Builtins* builtins = isolate->builtins(); | 14519 Builtins* builtins = isolate->builtins(); |
| 14548 switch (age) { | 14520 switch (age) { |
| 14549 #define HANDLE_CODE_AGE(AGE) \ | 14521 #define HANDLE_CODE_AGE(AGE) \ |
| 14550 case k##AGE##CodeAge: { \ | 14522 case k##AGE##CodeAge: { \ |
| 14551 Code* stub = parity == EVEN_MARKING_PARITY \ | 14523 return *builtins->Make##AGE##CodeYoungAgain(); \ |
| 14552 ? *builtins->Make##AGE##CodeYoungAgainEvenMarking() \ | 14524 } |
| 14553 : *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ | |
| 14554 return stub; \ | |
| 14555 } | |
| 14556 CODE_AGE_LIST(HANDLE_CODE_AGE) | 14525 CODE_AGE_LIST(HANDLE_CODE_AGE) |
| 14557 #undef HANDLE_CODE_AGE | 14526 #undef HANDLE_CODE_AGE |
| 14558 case kNotExecutedCodeAge: { | 14527 case kNotExecutedCodeAge: { |
| 14559 DCHECK(parity == NO_MARKING_PARITY); | |
| 14560 return *builtins->MarkCodeAsExecutedOnce(); | 14528 return *builtins->MarkCodeAsExecutedOnce(); |
| 14561 } | 14529 } |
| 14562 case kExecutedOnceCodeAge: { | 14530 case kExecutedOnceCodeAge: { |
| 14563 DCHECK(parity == NO_MARKING_PARITY); | |
| 14564 return *builtins->MarkCodeAsExecutedTwice(); | 14531 return *builtins->MarkCodeAsExecutedTwice(); |
| 14565 } | 14532 } |
| 14566 case kToBeExecutedOnceCodeAge: { | 14533 case kToBeExecutedOnceCodeAge: { |
| 14567 DCHECK(parity == NO_MARKING_PARITY); | |
| 14568 return *builtins->MarkCodeAsToBeExecutedOnce(); | 14534 return *builtins->MarkCodeAsToBeExecutedOnce(); |
| 14569 } | 14535 } |
| 14570 default: | 14536 default: |
| 14571 UNREACHABLE(); | 14537 UNREACHABLE(); |
| 14572 break; | 14538 break; |
| 14573 } | 14539 } |
| 14574 return NULL; | 14540 return NULL; |
| 14575 } | 14541 } |
| 14576 | 14542 |
| 14577 | 14543 |
| (...skipping 5861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20439 // depend on this. | 20405 // depend on this. |
| 20440 return DICTIONARY_ELEMENTS; | 20406 return DICTIONARY_ELEMENTS; |
| 20441 } | 20407 } |
| 20442 DCHECK_LE(kind, LAST_ELEMENTS_KIND); | 20408 DCHECK_LE(kind, LAST_ELEMENTS_KIND); |
| 20443 return kind; | 20409 return kind; |
| 20444 } | 20410 } |
| 20445 } | 20411 } |
| 20446 | 20412 |
| 20447 } // namespace internal | 20413 } // namespace internal |
| 20448 } // namespace v8 | 20414 } // namespace v8 |
| OLD | NEW |