| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 | 599 |
| 600 template<typename StaticVisitor> | 600 template<typename StaticVisitor> |
| 601 bool StaticMarkingVisitor<StaticVisitor>::IsFlushable( | 601 bool StaticMarkingVisitor<StaticVisitor>::IsFlushable( |
| 602 Heap* heap, JSFunction* function) { | 602 Heap* heap, JSFunction* function) { |
| 603 SharedFunctionInfo* shared_info = function->shared(); | 603 SharedFunctionInfo* shared_info = function->shared(); |
| 604 | 604 |
| 605 // Code is either on stack, in compilation cache or referenced | 605 // Code is either on stack, in compilation cache or referenced |
| 606 // by optimized version of function. | 606 // by optimized version of function. |
| 607 MarkBit code_mark = Marking::MarkBitFrom(function->code()); | 607 MarkBit code_mark = Marking::MarkBitFrom(function->code()); |
| 608 if (code_mark.Get()) { | 608 if (code_mark.Get()) { |
| 609 if (!FLAG_age_code) { | |
| 610 if (!Marking::MarkBitFrom(shared_info).Get()) { | |
| 611 shared_info->set_code_age(0); | |
| 612 } | |
| 613 } | |
| 614 return false; | 609 return false; |
| 615 } | 610 } |
| 616 | 611 |
| 617 // The function must have a valid context and not be a builtin. | 612 // The function must have a valid context and not be a builtin. |
| 618 if (!IsValidNonBuiltinContext(function->unchecked_context())) { | 613 if (!IsValidNonBuiltinContext(function->unchecked_context())) { |
| 619 return false; | 614 return false; |
| 620 } | 615 } |
| 621 | 616 |
| 622 // We do not (yet) flush code for optimized functions. | 617 // We do not (yet) flush code for optimized functions. |
| 623 if (function->code() != shared_info->code()) { | 618 if (function->code() != shared_info->code()) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 if (shared_info->is_toplevel()) { | 670 if (shared_info->is_toplevel()) { |
| 676 return false; | 671 return false; |
| 677 } | 672 } |
| 678 | 673 |
| 679 // If this is a function initialized with %SetCode then the one-to-one | 674 // If this is a function initialized with %SetCode then the one-to-one |
| 680 // relation between SharedFunctionInfo and Code is broken. | 675 // relation between SharedFunctionInfo and Code is broken. |
| 681 if (shared_info->dont_flush()) { | 676 if (shared_info->dont_flush()) { |
| 682 return false; | 677 return false; |
| 683 } | 678 } |
| 684 | 679 |
| 685 if (FLAG_age_code) { | 680 // Check age of code. If code aging is disabled we never flush. |
| 686 return shared_info->code()->IsOld(); | 681 if (!FLAG_age_code || !shared_info->code()->IsOld()) { |
| 687 } else { | 682 return false; |
| 688 // How many collections newly compiled code object will survive before being | 683 } |
| 689 // flushed. | |
| 690 static const int kCodeAgeThreshold = 5; | |
| 691 | 684 |
| 692 // Age this shared function info. | 685 return true; |
| 693 if (shared_info->code_age() < kCodeAgeThreshold) { | |
| 694 shared_info->set_code_age(shared_info->code_age() + 1); | |
| 695 return false; | |
| 696 } | |
| 697 return true; | |
| 698 } | |
| 699 } | 686 } |
| 700 | 687 |
| 701 | 688 |
| 702 template<typename StaticVisitor> | 689 template<typename StaticVisitor> |
| 703 void StaticMarkingVisitor<StaticVisitor>::VisitSharedFunctionInfoStrongCode( | 690 void StaticMarkingVisitor<StaticVisitor>::VisitSharedFunctionInfoStrongCode( |
| 704 Heap* heap, HeapObject* object) { | 691 Heap* heap, HeapObject* object) { |
| 705 StaticVisitor::BeforeVisitingSharedFunctionInfo(object); | 692 StaticVisitor::BeforeVisitingSharedFunctionInfo(object); |
| 706 Object** start_slot = | 693 Object** start_slot = |
| 707 HeapObject::RawField(object, | 694 HeapObject::RawField(object, |
| 708 SharedFunctionInfo::BodyDescriptor::kStartOffset); | 695 SharedFunctionInfo::BodyDescriptor::kStartOffset); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 830 RelocIterator it(this, mode_mask); | 817 RelocIterator it(this, mode_mask); |
| 831 for (; !it.done(); it.next()) { | 818 for (; !it.done(); it.next()) { |
| 832 it.rinfo()->template Visit<StaticVisitor>(heap); | 819 it.rinfo()->template Visit<StaticVisitor>(heap); |
| 833 } | 820 } |
| 834 } | 821 } |
| 835 | 822 |
| 836 | 823 |
| 837 } } // namespace v8::internal | 824 } } // namespace v8::internal |
| 838 | 825 |
| 839 #endif // V8_OBJECTS_VISITING_INL_H_ | 826 #endif // V8_OBJECTS_VISITING_INL_H_ |
| OLD | NEW |