Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(316)

Side by Side Diff: src/heap/objects-visiting.h

Issue 1328003002: [heap] No leakage of objects-visiting.h outside of heap. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@local_cleanup-heap-scavenger
Patch Set: Rebased. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/heap/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_H_ 5 #ifndef V8_OBJECTS_VISITING_H_
6 #define V8_OBJECTS_VISITING_H_ 6 #define V8_OBJECTS_VISITING_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/heap/heap.h"
9 #include "src/heap/spaces.h" 10 #include "src/heap/spaces.h"
10 #include "src/layout-descriptor.h" 11 #include "src/layout-descriptor.h"
11 12
12 // This file provides base classes and auxiliary methods for defining 13 // This file provides base classes and auxiliary methods for defining
13 // static object visitors used during GC. 14 // static object visitors used during GC.
14 // Visiting HeapObject body with a normal ObjectVisitor requires performing 15 // Visiting HeapObject body with a normal ObjectVisitor requires performing
15 // two switches on object's instance type to determine object size and layout 16 // two switches on object's instance type to determine object size and layout
16 // and one or more virtual method calls on visitor itself. 17 // and one or more virtual method calls on visitor itself.
17 // Static visitor is different: it provides a dispatch table which contains 18 // Static visitor is different: it provides a dispatch table which contains
18 // pointers to specialized visit functions. Each map has the visitor_id 19 // pointers to specialized visit functions. Each map has the visitor_id
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 // id of specialized visitor from given instance size, base visitor id and 93 // id of specialized visitor from given instance size, base visitor id and
93 // generic visitor's id. 94 // generic visitor's id.
94 enum VisitorId { 95 enum VisitorId {
95 #define VISITOR_ID_ENUM_DECL(id) kVisit##id, 96 #define VISITOR_ID_ENUM_DECL(id) kVisit##id,
96 VISITOR_ID_LIST(VISITOR_ID_ENUM_DECL) 97 VISITOR_ID_LIST(VISITOR_ID_ENUM_DECL)
97 #undef VISITOR_ID_ENUM_DECL 98 #undef VISITOR_ID_ENUM_DECL
98 kVisitorIdCount, 99 kVisitorIdCount,
99 kVisitDataObject = kVisitDataObject2, 100 kVisitDataObject = kVisitDataObject2,
100 kVisitJSObject = kVisitJSObject2, 101 kVisitJSObject = kVisitJSObject2,
101 kVisitStruct = kVisitStruct2, 102 kVisitStruct = kVisitStruct2,
102 kMinObjectSizeInWords = 2
103 }; 103 };
104 104
105 // Visitor ID should fit in one byte. 105 // Visitor ID should fit in one byte.
106 STATIC_ASSERT(kVisitorIdCount <= 256); 106 STATIC_ASSERT(kVisitorIdCount <= 256);
107 107
108 // Determine which specialized visitor should be used for given instance type 108 // Determine which specialized visitor should be used for given instance type
109 // and instance type. 109 // and instance type.
110 static VisitorId GetVisitorId(int instance_type, int instance_size, 110 static VisitorId GetVisitorId(int instance_type, int instance_size,
111 bool has_unboxed_fields); 111 bool has_unboxed_fields);
112 112
113 // Determine which specialized visitor should be used for given map. 113 // Determine which specialized visitor should be used for given map.
114 static VisitorId GetVisitorId(Map* map); 114 static VisitorId GetVisitorId(Map* map);
115 115
116 // For visitors that allow specialization by size calculate VisitorId based 116 // For visitors that allow specialization by size calculate VisitorId based
117 // on size, base visitor id and generic visitor id. 117 // on size, base visitor id and generic visitor id.
118 static VisitorId GetVisitorIdForSize(VisitorId base, VisitorId generic, 118 static VisitorId GetVisitorIdForSize(VisitorId base, VisitorId generic,
119 int object_size, 119 int object_size,
120 bool has_unboxed_fields) { 120 bool has_unboxed_fields) {
121 DCHECK((base == kVisitDataObject) || (base == kVisitStruct) || 121 DCHECK((base == kVisitDataObject) || (base == kVisitStruct) ||
122 (base == kVisitJSObject)); 122 (base == kVisitJSObject));
123 DCHECK(IsAligned(object_size, kPointerSize)); 123 DCHECK(IsAligned(object_size, kPointerSize));
124 DCHECK(kMinObjectSizeInWords * kPointerSize <= object_size); 124 DCHECK(Heap::kMinObjectSizeInWords * kPointerSize <= object_size);
125 DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); 125 DCHECK(object_size <= Page::kMaxRegularHeapObjectSize);
126 DCHECK(!has_unboxed_fields || (base == kVisitJSObject)); 126 DCHECK(!has_unboxed_fields || (base == kVisitJSObject));
127 127
128 if (has_unboxed_fields) return generic; 128 if (has_unboxed_fields) return generic;
129 129
130 int visitor_id = 130 int visitor_id = Min(
131 Min(base + (object_size >> kPointerSizeLog2) - kMinObjectSizeInWords, 131 base + (object_size >> kPointerSizeLog2) - Heap::kMinObjectSizeInWords,
132 static_cast<int>(generic)); 132 static_cast<int>(generic));
133 133
134 return static_cast<VisitorId>(visitor_id); 134 return static_cast<VisitorId>(visitor_id);
135 } 135 }
136 }; 136 };
137 137
138 138
139 template <typename Callback> 139 template <typename Callback>
140 class VisitorDispatchTable { 140 class VisitorDispatchTable {
141 public: 141 public:
142 void CopyFrom(VisitorDispatchTable* other) { 142 void CopyFrom(VisitorDispatchTable* other) {
(...skipping 21 matching lines...) Expand all
164 void RegisterSpecialization() { 164 void RegisterSpecialization() {
165 static const int size = object_size_in_words * kPointerSize; 165 static const int size = object_size_in_words * kPointerSize;
166 Register(StaticVisitorBase::GetVisitorIdForSize(base, generic, size, false), 166 Register(StaticVisitorBase::GetVisitorIdForSize(base, generic, size, false),
167 &Visitor::template VisitSpecialized<size>); 167 &Visitor::template VisitSpecialized<size>);
168 } 168 }
169 169
170 170
171 template <typename Visitor, StaticVisitorBase::VisitorId base, 171 template <typename Visitor, StaticVisitorBase::VisitorId base,
172 StaticVisitorBase::VisitorId generic> 172 StaticVisitorBase::VisitorId generic>
173 void RegisterSpecializations() { 173 void RegisterSpecializations() {
174 STATIC_ASSERT((generic - base + StaticVisitorBase::kMinObjectSizeInWords) == 174 STATIC_ASSERT((generic - base + Heap::kMinObjectSizeInWords) == 10);
175 10);
176 RegisterSpecialization<Visitor, base, generic, 2>(); 175 RegisterSpecialization<Visitor, base, generic, 2>();
177 RegisterSpecialization<Visitor, base, generic, 3>(); 176 RegisterSpecialization<Visitor, base, generic, 3>();
178 RegisterSpecialization<Visitor, base, generic, 4>(); 177 RegisterSpecialization<Visitor, base, generic, 4>();
179 RegisterSpecialization<Visitor, base, generic, 5>(); 178 RegisterSpecialization<Visitor, base, generic, 5>();
180 RegisterSpecialization<Visitor, base, generic, 6>(); 179 RegisterSpecialization<Visitor, base, generic, 6>();
181 RegisterSpecialization<Visitor, base, generic, 7>(); 180 RegisterSpecialization<Visitor, base, generic, 7>();
182 RegisterSpecialization<Visitor, base, generic, 8>(); 181 RegisterSpecialization<Visitor, base, generic, 8>();
183 RegisterSpecialization<Visitor, base, generic, 9>(); 182 RegisterSpecialization<Visitor, base, generic, 9>();
184 Register(generic, &Visitor::Visit); 183 Register(generic, &Visitor::Visit);
185 } 184 }
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 // the next element. Given the head of the list, this function removes dead 488 // the next element. Given the head of the list, this function removes dead
490 // elements from the list and if requested records slots for next-element 489 // elements from the list and if requested records slots for next-element
491 // pointers. The template parameter T is a WeakListVisitor that defines how to 490 // pointers. The template parameter T is a WeakListVisitor that defines how to
492 // access the next-element pointers. 491 // access the next-element pointers.
493 template <class T> 492 template <class T>
494 Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer); 493 Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer);
495 } 494 }
496 } // namespace v8::internal 495 } // namespace v8::internal
497 496
498 #endif // V8_OBJECTS_VISITING_H_ 497 #endif // V8_OBJECTS_VISITING_H_
OLDNEW
« no previous file with comments | « src/heap/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698