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/mark-compact.h" | 9 #include "src/heap/mark-compact.h" |
10 #include "src/heap/objects-visiting.h" | 10 #include "src/heap/objects-visiting.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 table_.Register( | 43 table_.Register( |
44 kVisitSymbol, | 44 kVisitSymbol, |
45 &FixedBodyVisitor<StaticVisitor, Symbol::BodyDescriptor, int>::Visit); | 45 &FixedBodyVisitor<StaticVisitor, Symbol::BodyDescriptor, int>::Visit); |
46 | 46 |
47 table_.Register(kVisitFixedArray, | 47 table_.Register(kVisitFixedArray, |
48 &FlexibleBodyVisitor<StaticVisitor, | 48 &FlexibleBodyVisitor<StaticVisitor, |
49 FixedArray::BodyDescriptor, int>::Visit); | 49 FixedArray::BodyDescriptor, int>::Visit); |
50 | 50 |
51 table_.Register(kVisitFixedDoubleArray, &VisitFixedDoubleArray); | 51 table_.Register(kVisitFixedDoubleArray, &VisitFixedDoubleArray); |
52 table_.Register( | 52 table_.Register( |
53 kVisitFixedTypedArray, | 53 kVisitFixedTypedArrayBase, |
54 &FlexibleBodyVisitor<StaticVisitor, FixedTypedArrayBase::BodyDescriptor, | 54 &FlexibleBodyVisitor<StaticVisitor, FixedTypedArrayBase::BodyDescriptor, |
55 int>::Visit); | 55 int>::Visit); |
56 | 56 |
57 table_.Register( | 57 table_.Register( |
58 kVisitFixedFloat64Array, | 58 kVisitFixedFloat64Array, |
59 &FlexibleBodyVisitor<StaticVisitor, FixedTypedArrayBase::BodyDescriptor, | 59 &FlexibleBodyVisitor<StaticVisitor, FixedTypedArrayBase::BodyDescriptor, |
60 int>::Visit); | 60 int>::Visit); |
61 | 61 |
62 table_.Register( | 62 table_.Register( |
63 kVisitNativeContext, | 63 kVisitNativeContext, |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 | 129 |
130 table_.Register( | 130 table_.Register( |
131 kVisitSymbol, | 131 kVisitSymbol, |
132 &FixedBodyVisitor<StaticVisitor, Symbol::BodyDescriptor, void>::Visit); | 132 &FixedBodyVisitor<StaticVisitor, Symbol::BodyDescriptor, void>::Visit); |
133 | 133 |
134 table_.Register(kVisitFixedArray, &FixedArrayVisitor::Visit); | 134 table_.Register(kVisitFixedArray, &FixedArrayVisitor::Visit); |
135 | 135 |
136 table_.Register(kVisitFixedDoubleArray, &DataObjectVisitor::Visit); | 136 table_.Register(kVisitFixedDoubleArray, &DataObjectVisitor::Visit); |
137 | 137 |
138 table_.Register( | 138 table_.Register( |
139 kVisitFixedTypedArray, | 139 kVisitFixedTypedArrayBase, |
140 &FlexibleBodyVisitor<StaticVisitor, FixedTypedArrayBase::BodyDescriptor, | 140 &FlexibleBodyVisitor<StaticVisitor, FixedTypedArrayBase::BodyDescriptor, |
141 void>::Visit); | 141 void>::Visit); |
142 | 142 |
143 table_.Register( | 143 table_.Register( |
144 kVisitFixedFloat64Array, | 144 kVisitFixedFloat64Array, |
145 &FlexibleBodyVisitor<StaticVisitor, FixedTypedArrayBase::BodyDescriptor, | 145 &FlexibleBodyVisitor<StaticVisitor, FixedTypedArrayBase::BodyDescriptor, |
146 void>::Visit); | 146 void>::Visit); |
147 | 147 |
148 table_.Register(kVisitNativeContext, &VisitNativeContext); | 148 table_.Register(kVisitNativeContext, &VisitNativeContext); |
149 | 149 |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 | 621 |
622 template <typename StaticVisitor> | 622 template <typename StaticVisitor> |
623 void StaticMarkingVisitor<StaticVisitor>::VisitJSFunctionStrongCode( | 623 void StaticMarkingVisitor<StaticVisitor>::VisitJSFunctionStrongCode( |
624 Map* map, HeapObject* object) { | 624 Map* map, HeapObject* object) { |
625 typedef FlexibleBodyVisitor<StaticVisitor, | 625 typedef FlexibleBodyVisitor<StaticVisitor, |
626 JSFunction::BodyDescriptorStrongCode, | 626 JSFunction::BodyDescriptorStrongCode, |
627 void> JSFunctionStrongCodeBodyVisitor; | 627 void> JSFunctionStrongCodeBodyVisitor; |
628 JSFunctionStrongCodeBodyVisitor::Visit(map, object); | 628 JSFunctionStrongCodeBodyVisitor::Visit(map, object); |
629 } | 629 } |
630 | 630 |
631 | |
632 template <typename StaticVisitor> | 631 template <typename StaticVisitor> |
633 void StaticMarkingVisitor<StaticVisitor>::VisitJSFunctionWeakCode( | 632 void StaticMarkingVisitor<StaticVisitor>::VisitJSFunctionWeakCode( |
634 Map* map, HeapObject* object) { | 633 Map* map, HeapObject* object) { |
635 typedef FlexibleBodyVisitor<StaticVisitor, JSFunction::BodyDescriptorWeakCode, | 634 typedef FlexibleBodyVisitor<StaticVisitor, JSFunction::BodyDescriptorWeakCode, |
636 void> JSFunctionWeakCodeBodyVisitor; | 635 void> JSFunctionWeakCodeBodyVisitor; |
637 JSFunctionWeakCodeBodyVisitor::Visit(map, object); | 636 JSFunctionWeakCodeBodyVisitor::Visit(map, object); |
638 } | 637 } |
639 | 638 |
| 639 template <typename ResultType, typename ConcreteVisitor> |
| 640 ResultType HeapVisitor<ResultType, ConcreteVisitor>::IterateBody( |
| 641 HeapObject* object) { |
| 642 Map* map = object->map(); |
| 643 ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this); |
| 644 switch (static_cast<VisitorId>(map->visitor_id())) { |
| 645 #define CASE(type) \ |
| 646 case kVisit##type: \ |
| 647 return visitor->Visit##type(map, type::cast(object)); |
| 648 TYPED_VISITOR_ID_LIST(CASE) |
| 649 #undef CASE |
| 650 case kVisitShortcutCandidate: |
| 651 return visitor->VisitShortcutCandidate(map, ConsString::cast(object)); |
| 652 case kVisitNativeContext: |
| 653 return visitor->VisitNativeContext(map, Context::cast(object)); |
| 654 case kVisitDataObject: |
| 655 return visitor->VisitDataObject(map, HeapObject::cast(object)); |
| 656 case kVisitJSObjectFast: |
| 657 return visitor->VisitJSObjectFast(map, JSObject::cast(object)); |
| 658 case kVisitJSApiObject: |
| 659 return visitor->VisitJSApiObject(map, JSObject::cast(object)); |
| 660 case kVisitStruct: |
| 661 return visitor->VisitStruct(map, HeapObject::cast(object)); |
| 662 case kVisitFreeSpace: |
| 663 return visitor->VisitFreeSpace(map, FreeSpace::cast(object)); |
| 664 case kVisitorIdCount: |
| 665 UNREACHABLE(); |
| 666 } |
| 667 UNREACHABLE(); |
| 668 // Make the compiler happy. |
| 669 return ResultType(); |
| 670 } |
| 671 |
| 672 #define VISIT(type) \ |
| 673 template <typename ResultType, typename ConcreteVisitor> \ |
| 674 ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit##type( \ |
| 675 Map* map, type* object) { \ |
| 676 int size = type::BodyDescriptor::SizeOf(map, object); \ |
| 677 type::BodyDescriptor::IterateBody(object, size, \ |
| 678 static_cast<ConcreteVisitor*>(this)); \ |
| 679 return static_cast<ResultType>(size); \ |
| 680 } |
| 681 TYPED_VISITOR_ID_LIST(VISIT) |
| 682 #undef VISIT |
| 683 |
| 684 template <typename ResultType, typename ConcreteVisitor> |
| 685 ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitShortcutCandidate( |
| 686 Map* map, ConsString* object) { |
| 687 int size = ConsString::BodyDescriptor::SizeOf(map, object); |
| 688 ConsString::BodyDescriptor::IterateBody(object, size, |
| 689 static_cast<ConcreteVisitor*>(this)); |
| 690 return static_cast<ResultType>(size); |
| 691 } |
| 692 |
| 693 template <typename ResultType, typename ConcreteVisitor> |
| 694 ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitNativeContext( |
| 695 Map* map, Context* object) { |
| 696 int size = Context::BodyDescriptor::SizeOf(map, object); |
| 697 Context::BodyDescriptor::IterateBody(object, size, |
| 698 static_cast<ConcreteVisitor*>(this)); |
| 699 return static_cast<ResultType>(size); |
| 700 } |
| 701 |
| 702 template <typename ResultType, typename ConcreteVisitor> |
| 703 ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitDataObject( |
| 704 Map* map, HeapObject* object) { |
| 705 int size = map->instance_size(); |
| 706 return static_cast<ResultType>(size); |
| 707 } |
| 708 |
| 709 template <typename ResultType, typename ConcreteVisitor> |
| 710 ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSObjectFast( |
| 711 Map* map, JSObject* object) { |
| 712 int size = JSObject::FastBodyDescriptor::SizeOf(map, object); |
| 713 JSObject::FastBodyDescriptor::IterateBody( |
| 714 object, size, static_cast<ConcreteVisitor*>(this)); |
| 715 return static_cast<ResultType>(size); |
| 716 } |
| 717 template <typename ResultType, typename ConcreteVisitor> |
| 718 ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSApiObject( |
| 719 Map* map, JSObject* object) { |
| 720 int size = JSObject::BodyDescriptor::SizeOf(map, object); |
| 721 JSObject::BodyDescriptor::IterateBody(object, size, |
| 722 static_cast<ConcreteVisitor*>(this)); |
| 723 return static_cast<ResultType>(size); |
| 724 } |
| 725 template <typename ResultType, typename ConcreteVisitor> |
| 726 ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitStruct( |
| 727 Map* map, HeapObject* object) { |
| 728 int size = map->instance_size(); |
| 729 StructBodyDescriptor::IterateBody(object, size, |
| 730 static_cast<ConcreteVisitor*>(this)); |
| 731 return static_cast<ResultType>(size); |
| 732 } |
| 733 template <typename ResultType, typename ConcreteVisitor> |
| 734 ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitFreeSpace( |
| 735 Map* map, FreeSpace* object) { |
| 736 return static_cast<ResultType>(FreeSpace::cast(object)->size()); |
| 737 } |
640 | 738 |
641 } // namespace internal | 739 } // namespace internal |
642 } // namespace v8 | 740 } // namespace v8 |
643 | 741 |
644 #endif // V8_OBJECTS_VISITING_INL_H_ | 742 #endif // V8_OBJECTS_VISITING_INL_H_ |
OLD | NEW |