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

Unified Diff: src/heap/objects-visiting.h

Issue 1441453002: Avoid manual object's body traversal in GC. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/mark-compact.cc ('k') | src/heap/objects-visiting.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/objects-visiting.h
diff --git a/src/heap/objects-visiting.h b/src/heap/objects-visiting.h
index 787410d76f14ef7627ba2058ec25897c02d2202c..cf3e838c4e6c7213604ab055704622dafa56216e 100644
--- a/src/heap/objects-visiting.h
+++ b/src/heap/objects-visiting.h
@@ -191,21 +191,37 @@ class VisitorDispatchTable {
template <typename StaticVisitor, typename BodyDescriptor, typename ReturnType>
class FlexibleBodyVisitor : public AllStatic {
public:
- INLINE(static ReturnType Visit(Map* map, HeapObject* object)) {
+ V8_INLINE static ReturnType Visit(Map* map, HeapObject* object) {
int object_size = BodyDescriptor::SizeOf(map, object);
BodyDescriptor::template IterateBody<StaticVisitor>(object, object_size);
return static_cast<ReturnType>(object_size);
}
+ V8_INLINE static ReturnType Visit(Map* map, HeapObject* object,
ulan 2015/11/12 12:27:27 Is this leftover from the previous patch?
+ StaticVisitor* v) {
+ int object_size = BodyDescriptor::SizeOf(map, object);
+ BodyDescriptor::template IterateBody(object, object_size, v);
+ return static_cast<ReturnType>(object_size);
+ }
+
+ // This specialization is only suitable for objects containing pointer fields.
+ template <int object_size>
+ V8_INLINE static ReturnType VisitSpecialized(Map* map, HeapObject* object) {
+ DCHECK(BodyDescriptor::SizeOf(map, object) == object_size);
+ DCHECK(!FLAG_unbox_double_fields || map->HasFastPointerLayout());
+ BodyDescriptor::template IteratePointers<StaticVisitor>(
+ object->GetHeap(), object, BodyDescriptor::kStartOffset, object_size);
+ return static_cast<ReturnType>(object_size);
+ }
+
// This specialization is only suitable for objects containing pointer fields.
template <int object_size>
- static inline ReturnType VisitSpecialized(Map* map, HeapObject* object) {
+ V8_INLINE static ReturnType VisitSpecialized(Map* map, HeapObject* object,
+ StaticVisitor* v) {
DCHECK(BodyDescriptor::SizeOf(map, object) == object_size);
DCHECK(!FLAG_unbox_double_fields || map->HasFastPointerLayout());
- StaticVisitor::VisitPointers(
- object->GetHeap(), object,
- HeapObject::RawField(object, BodyDescriptor::kStartOffset),
- HeapObject::RawField(object, object_size));
+ BodyDescriptor::template IteratePointers(
+ object, BodyDescriptor::kStartOffset, object_size, v);
return static_cast<ReturnType>(object_size);
}
};
@@ -214,10 +230,45 @@ class FlexibleBodyVisitor : public AllStatic {
template <typename StaticVisitor, typename BodyDescriptor, typename ReturnType>
class FixedBodyVisitor : public AllStatic {
public:
- INLINE(static ReturnType Visit(Map* map, HeapObject* object)) {
+ V8_INLINE static ReturnType Visit(Map* map, HeapObject* object) {
BodyDescriptor::template IterateBody<StaticVisitor>(object);
return static_cast<ReturnType>(BodyDescriptor::kSize);
}
+
+ V8_INLINE static ReturnType Visit(Map* map, HeapObject* object,
+ StaticVisitor* v) {
+ BodyDescriptor::template IterateBody(object, v);
+ return static_cast<ReturnType>(BodyDescriptor::kSize);
+ }
+};
+
+
+template <typename StaticVisitor, typename BodyDescriptor, typename ReturnType>
+class DataBodyVisitor {
+ public:
+ V8_INLINE static ReturnType Visit(Map* map, HeapObject* object) {
+ int object_size = BodyDescriptor::SizeOf(map, object);
+ return static_cast<ReturnType>(object_size);
+ }
+
+ V8_INLINE static ReturnType Visit(Map* map, HeapObject* object,
+ StaticVisitor* v) {
+ int object_size = BodyDescriptor::SizeOf(map, object);
+ return static_cast<ReturnType>(object_size);
+ }
+
+ template <int object_size>
+ V8_INLINE static ReturnType VisitSpecialized(Map* map, HeapObject* object) {
+ DCHECK(BodyDescriptor::SizeOf(map, object) == object_size);
+ return static_cast<ReturnType>(object_size);
+ }
+
+ template <int object_size>
+ V8_INLINE static ReturnType VisitSpecialized(Map* map, HeapObject* object,
+ StaticVisitor* v) {
+ DCHECK(BodyDescriptor::SizeOf(map, object) == object_size);
+ return static_cast<ReturnType>(object_size);
+ }
};
@@ -296,17 +347,8 @@ class StaticNewSpaceVisitor : public StaticVisitorBase {
INLINE(static int VisitJSDataView(Map* map, HeapObject* object));
INLINE(static int VisitBytecodeArray(Map* map, HeapObject* object));
- class DataObjectVisitor {
- public:
- template <int object_size>
- static inline int VisitSpecialized(Map* map, HeapObject* object) {
- return object_size;
- }
-
- INLINE(static int Visit(Map* map, HeapObject* object)) {
- return map->instance_size();
- }
- };
+ typedef DataBodyVisitor<StaticVisitor, StructBodyDescriptor, int>
+ DataObjectVisitor;
typedef FlexibleBodyVisitor<StaticVisitor, StructBodyDescriptor, int>
StructVisitor;
@@ -401,13 +443,8 @@ class StaticMarkingVisitor : public StaticVisitorBase {
static void VisitJSFunctionStrongCode(Map* map, HeapObject* object);
static void VisitJSFunctionWeakCode(Map* map, HeapObject* object);
- class DataObjectVisitor {
- public:
- template <int size>
- static inline void VisitSpecialized(Map* map, HeapObject* object) {}
-
- INLINE(static void Visit(Map* map, HeapObject* object)) {}
- };
+ typedef DataBodyVisitor<StaticVisitor, StructBodyDescriptor, void>
+ DataObjectVisitor;
typedef FlexibleBodyVisitor<StaticVisitor, FixedArray::BodyDescriptor, void>
FixedArrayVisitor;
« no previous file with comments | « src/heap/mark-compact.cc ('k') | src/heap/objects-visiting.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698