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 |