OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_OBJECTS_VISITING_INL_H_ | 5 #ifndef V8_OBJECTS_VISITING_INL_H_ |
6 #define V8_OBJECTS_VISITING_INL_H_ | 6 #define V8_OBJECTS_VISITING_INL_H_ |
7 | 7 |
8 #include "src/heap/array-buffer-tracker.h" | 8 #include "src/heap/array-buffer-tracker.h" |
9 #include "src/heap/objects-visiting.h" | 9 #include "src/heap/objects-visiting.h" |
10 #include "src/ic/ic-state.h" | 10 #include "src/ic/ic-state.h" |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 | 421 |
422 | 422 |
423 template <typename StaticVisitor> | 423 template <typename StaticVisitor> |
424 void StaticMarkingVisitor<StaticVisitor>::VisitCode(Map* map, | 424 void StaticMarkingVisitor<StaticVisitor>::VisitCode(Map* map, |
425 HeapObject* object) { | 425 HeapObject* object) { |
426 Heap* heap = map->GetHeap(); | 426 Heap* heap = map->GetHeap(); |
427 Code* code = Code::cast(object); | 427 Code* code = Code::cast(object); |
428 if (FLAG_age_code && !heap->isolate()->serializer_enabled()) { | 428 if (FLAG_age_code && !heap->isolate()->serializer_enabled()) { |
429 code->MakeOlder(heap->mark_compact_collector()->marking_parity()); | 429 code->MakeOlder(heap->mark_compact_collector()->marking_parity()); |
430 } | 430 } |
| 431 MarkCompactCollector* collector = heap->mark_compact_collector(); |
| 432 if (collector->is_code_flushing_enabled()) { |
| 433 if (code->kind() == Code::OPTIMIZED_FUNCTION) { |
| 434 // Visit all unoptimized code objects to prevent flushing them. |
| 435 MarkInlinedFunctionsCode(heap, code); |
| 436 } |
| 437 } |
431 code->CodeIterateBody<StaticVisitor>(heap); | 438 code->CodeIterateBody<StaticVisitor>(heap); |
432 } | 439 } |
433 | 440 |
434 | 441 |
435 template <typename StaticVisitor> | 442 template <typename StaticVisitor> |
436 void StaticMarkingVisitor<StaticVisitor>::VisitSharedFunctionInfo( | 443 void StaticMarkingVisitor<StaticVisitor>::VisitSharedFunctionInfo( |
437 Map* map, HeapObject* object) { | 444 Map* map, HeapObject* object) { |
438 Heap* heap = map->GetHeap(); | 445 Heap* heap = map->GetHeap(); |
439 SharedFunctionInfo* shared = SharedFunctionInfo::cast(object); | 446 SharedFunctionInfo* shared = SharedFunctionInfo::cast(object); |
440 if (shared->ic_age() != heap->global_ic_age()) { | 447 if (shared->ic_age() != heap->global_ic_age()) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 if (StaticVisitor::MarkObjectWithoutPush(heap, shared)) { | 511 if (StaticVisitor::MarkObjectWithoutPush(heap, shared)) { |
505 StaticVisitor::MarkObject(heap, shared->map()); | 512 StaticVisitor::MarkObject(heap, shared->map()); |
506 VisitSharedFunctionInfoWeakCode(heap, shared); | 513 VisitSharedFunctionInfoWeakCode(heap, shared); |
507 } | 514 } |
508 // Treat the reference to the code object weakly. | 515 // Treat the reference to the code object weakly. |
509 VisitJSFunctionWeakCode(heap, object); | 516 VisitJSFunctionWeakCode(heap, object); |
510 return; | 517 return; |
511 } else { | 518 } else { |
512 // Visit all unoptimized code objects to prevent flushing them. | 519 // Visit all unoptimized code objects to prevent flushing them. |
513 StaticVisitor::MarkObject(heap, function->shared()->code()); | 520 StaticVisitor::MarkObject(heap, function->shared()->code()); |
514 if (function->code()->kind() == Code::OPTIMIZED_FUNCTION) { | |
515 MarkInlinedFunctionsCode(heap, function->code()); | |
516 } | |
517 } | 521 } |
518 } | 522 } |
519 VisitJSFunctionStrongCode(heap, object); | 523 VisitJSFunctionStrongCode(heap, object); |
520 } | 524 } |
521 | 525 |
522 | 526 |
523 template <typename StaticVisitor> | 527 template <typename StaticVisitor> |
524 void StaticMarkingVisitor<StaticVisitor>::VisitJSRegExp(Map* map, | 528 void StaticMarkingVisitor<StaticVisitor>::VisitJSRegExp(Map* map, |
525 HeapObject* object) { | 529 HeapObject* object) { |
526 int last_property_offset = | 530 int last_property_offset = |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 } | 652 } |
649 } | 653 } |
650 | 654 |
651 | 655 |
652 template <typename StaticVisitor> | 656 template <typename StaticVisitor> |
653 void StaticMarkingVisitor<StaticVisitor>::MarkInlinedFunctionsCode(Heap* heap, | 657 void StaticMarkingVisitor<StaticVisitor>::MarkInlinedFunctionsCode(Heap* heap, |
654 Code* code) { | 658 Code* code) { |
655 // For optimized functions we should retain both non-optimized version | 659 // For optimized functions we should retain both non-optimized version |
656 // of its code and non-optimized version of all inlined functions. | 660 // of its code and non-optimized version of all inlined functions. |
657 // This is required to support bailing out from inlined code. | 661 // This is required to support bailing out from inlined code. |
658 DeoptimizationInputData* const data = | 662 if (code->deoptimization_data() != heap->empty_fixed_array()) { |
659 DeoptimizationInputData::cast(code->deoptimization_data()); | 663 DeoptimizationInputData* const data = |
660 FixedArray* const literals = data->LiteralArray(); | 664 DeoptimizationInputData::cast(code->deoptimization_data()); |
661 int const inlined_count = data->InlinedFunctionCount()->value(); | 665 FixedArray* const literals = data->LiteralArray(); |
662 for (int i = 0; i < inlined_count; ++i) { | 666 int const inlined_count = data->InlinedFunctionCount()->value(); |
663 StaticVisitor::MarkObject( | 667 for (int i = 0; i < inlined_count; ++i) { |
664 heap, SharedFunctionInfo::cast(literals->get(i))->code()); | 668 StaticVisitor::MarkObject( |
| 669 heap, SharedFunctionInfo::cast(literals->get(i))->code()); |
| 670 } |
665 } | 671 } |
666 } | 672 } |
667 | 673 |
668 | 674 |
669 inline static bool HasValidNonBuiltinContext(JSFunction* function) { | 675 inline static bool HasValidNonBuiltinContext(JSFunction* function) { |
670 return function->context()->IsContext() && !function->shared()->IsBuiltin(); | 676 return function->context()->IsContext() && !function->shared()->IsBuiltin(); |
671 } | 677 } |
672 | 678 |
673 | 679 |
674 inline static bool HasSourceCode(Heap* heap, SharedFunctionInfo* info) { | 680 inline static bool HasSourceCode(Heap* heap, SharedFunctionInfo* info) { |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 | 903 |
898 RelocIterator it(this, mode_mask); | 904 RelocIterator it(this, mode_mask); |
899 for (; !it.done(); it.next()) { | 905 for (; !it.done(); it.next()) { |
900 it.rinfo()->template Visit<StaticVisitor>(heap); | 906 it.rinfo()->template Visit<StaticVisitor>(heap); |
901 } | 907 } |
902 } | 908 } |
903 } // namespace internal | 909 } // namespace internal |
904 } // namespace v8 | 910 } // namespace v8 |
905 | 911 |
906 #endif // V8_OBJECTS_VISITING_INL_H_ | 912 #endif // V8_OBJECTS_VISITING_INL_H_ |
OLD | NEW |