Commit dae6e43d authored by ulan's avatar ulan Committed by Commit bot

Fast body iteration for objects without unboxed fields.

Currently BodyDescriptorBase::IterateBodyImpl does a run-time check
for obj->map()->HasFastPointerLayout(), which is redundant for all
non-JSObject heap objects.

BUG=chromium:694255

Review-Url: https://codereview.chromium.org/2774553003
Cr-Commit-Position: refs/heads/master@{#44111}
parent 885f0bc4
...@@ -17,7 +17,6 @@ int FlexibleBodyDescriptor<start_offset>::SizeOf(Map* map, HeapObject* object) { ...@@ -17,7 +17,6 @@ int FlexibleBodyDescriptor<start_offset>::SizeOf(Map* map, HeapObject* object) {
return object->SizeFromMap(map); return object->SizeFromMap(map);
} }
bool BodyDescriptorBase::IsValidSlotImpl(HeapObject* obj, int offset) { bool BodyDescriptorBase::IsValidSlotImpl(HeapObject* obj, int offset) {
if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) { if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) {
return true; return true;
...@@ -53,7 +52,6 @@ void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset, ...@@ -53,7 +52,6 @@ void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset,
} }
} }
template <typename StaticVisitor> template <typename StaticVisitor>
void BodyDescriptorBase::IterateBodyImpl(Heap* heap, HeapObject* obj, void BodyDescriptorBase::IterateBodyImpl(Heap* heap, HeapObject* obj,
int start_offset, int end_offset) { int start_offset, int end_offset) {
...@@ -76,39 +74,62 @@ void BodyDescriptorBase::IterateBodyImpl(Heap* heap, HeapObject* obj, ...@@ -76,39 +74,62 @@ void BodyDescriptorBase::IterateBodyImpl(Heap* heap, HeapObject* obj,
} }
} }
template <typename ObjectVisitor> template <typename ObjectVisitor>
DISABLE_CFI_PERF DISABLE_CFI_PERF void BodyDescriptorBase::IteratePointers(HeapObject* obj,
void BodyDescriptorBase::IteratePointers(HeapObject* obj, int start_offset, int start_offset,
int end_offset, ObjectVisitor* v) { int end_offset,
ObjectVisitor* v) {
v->VisitPointers(HeapObject::RawField(obj, start_offset), v->VisitPointers(HeapObject::RawField(obj, start_offset),
HeapObject::RawField(obj, end_offset)); HeapObject::RawField(obj, end_offset));
} }
template <typename StaticVisitor> template <typename StaticVisitor>
DISABLE_CFI_PERF DISABLE_CFI_PERF void BodyDescriptorBase::IteratePointers(Heap* heap,
void BodyDescriptorBase::IteratePointers(Heap* heap, HeapObject* obj, HeapObject* obj,
int start_offset, int end_offset) { int start_offset,
int end_offset) {
StaticVisitor::VisitPointers(heap, obj, StaticVisitor::VisitPointers(heap, obj,
HeapObject::RawField(obj, start_offset), HeapObject::RawField(obj, start_offset),
HeapObject::RawField(obj, end_offset)); HeapObject::RawField(obj, end_offset));
} }
template <typename ObjectVisitor> template <typename ObjectVisitor>
void BodyDescriptorBase::IteratePointer(HeapObject* obj, int offset, void BodyDescriptorBase::IteratePointer(HeapObject* obj, int offset,
ObjectVisitor* v) { ObjectVisitor* v) {
v->VisitPointer(HeapObject::RawField(obj, offset)); v->VisitPointer(HeapObject::RawField(obj, offset));
} }
template <typename StaticVisitor> template <typename StaticVisitor>
void BodyDescriptorBase::IteratePointer(Heap* heap, HeapObject* obj, void BodyDescriptorBase::IteratePointer(Heap* heap, HeapObject* obj,
int offset) { int offset) {
StaticVisitor::VisitPointer(heap, obj, HeapObject::RawField(obj, offset)); StaticVisitor::VisitPointer(heap, obj, HeapObject::RawField(obj, offset));
} }
class JSObject::BodyDescriptor final : public BodyDescriptorBase {
public:
static const int kStartOffset = JSReceiver::kPropertiesOffset;
static bool IsValidSlot(HeapObject* obj, int offset) {
if (offset < kStartOffset) return false;
return IsValidSlotImpl(obj, offset);
}
template <typename ObjectVisitor>
static inline void IterateBody(HeapObject* obj, int object_size,
ObjectVisitor* v) {
IterateBodyImpl(obj, kStartOffset, object_size, v);
}
template <typename StaticVisitor>
static inline void IterateBody(HeapObject* obj, int object_size) {
Heap* heap = obj->GetHeap();
IterateBodyImpl<StaticVisitor>(heap, obj, kStartOffset, object_size);
}
static inline int SizeOf(Map* map, HeapObject* object) {
return map->instance_size();
}
};
// Iterates the function object according to the visiting policy. // Iterates the function object according to the visiting policy.
template <JSFunction::BodyVisitingPolicy body_visiting_policy> template <JSFunction::BodyVisitingPolicy body_visiting_policy>
...@@ -160,7 +181,6 @@ class JSFunction::BodyDescriptorImpl final : public BodyDescriptorBase { ...@@ -160,7 +181,6 @@ class JSFunction::BodyDescriptorImpl final : public BodyDescriptorBase {
} }
}; };
class JSArrayBuffer::BodyDescriptor final : public BodyDescriptorBase { class JSArrayBuffer::BodyDescriptor final : public BodyDescriptorBase {
public: public:
STATIC_ASSERT(kByteLengthOffset + kPointerSize == kBackingStoreOffset); STATIC_ASSERT(kByteLengthOffset + kPointerSize == kBackingStoreOffset);
...@@ -193,7 +213,6 @@ class JSArrayBuffer::BodyDescriptor final : public BodyDescriptorBase { ...@@ -193,7 +213,6 @@ class JSArrayBuffer::BodyDescriptor final : public BodyDescriptorBase {
} }
}; };
class BytecodeArray::BodyDescriptor final : public BodyDescriptorBase { class BytecodeArray::BodyDescriptor final : public BodyDescriptorBase {
public: public:
static bool IsValidSlot(HeapObject* obj, int offset) { static bool IsValidSlot(HeapObject* obj, int offset) {
...@@ -222,7 +241,6 @@ class BytecodeArray::BodyDescriptor final : public BodyDescriptorBase { ...@@ -222,7 +241,6 @@ class BytecodeArray::BodyDescriptor final : public BodyDescriptorBase {
} }
}; };
class FixedTypedArrayBase::BodyDescriptor final : public BodyDescriptorBase { class FixedTypedArrayBase::BodyDescriptor final : public BodyDescriptorBase {
public: public:
static bool IsValidSlot(HeapObject* obj, int offset) { static bool IsValidSlot(HeapObject* obj, int offset) {
...@@ -246,7 +264,6 @@ class FixedTypedArrayBase::BodyDescriptor final : public BodyDescriptorBase { ...@@ -246,7 +264,6 @@ class FixedTypedArrayBase::BodyDescriptor final : public BodyDescriptorBase {
} }
}; };
template <JSWeakCollection::BodyVisitingPolicy body_visiting_policy> template <JSWeakCollection::BodyVisitingPolicy body_visiting_policy>
class JSWeakCollection::BodyDescriptorImpl final : public BodyDescriptorBase { class JSWeakCollection::BodyDescriptorImpl final : public BodyDescriptorBase {
public: public:
...@@ -285,7 +302,6 @@ class JSWeakCollection::BodyDescriptorImpl final : public BodyDescriptorBase { ...@@ -285,7 +302,6 @@ class JSWeakCollection::BodyDescriptorImpl final : public BodyDescriptorBase {
} }
}; };
class Foreign::BodyDescriptor final : public BodyDescriptorBase { class Foreign::BodyDescriptor final : public BodyDescriptorBase {
public: public:
static bool IsValidSlot(HeapObject* obj, int offset) { return false; } static bool IsValidSlot(HeapObject* obj, int offset) { return false; }
...@@ -306,7 +322,6 @@ class Foreign::BodyDescriptor final : public BodyDescriptorBase { ...@@ -306,7 +322,6 @@ class Foreign::BodyDescriptor final : public BodyDescriptorBase {
static inline int SizeOf(Map* map, HeapObject* object) { return kSize; } static inline int SizeOf(Map* map, HeapObject* object) { return kSize; }
}; };
class ExternalOneByteString::BodyDescriptor final : public BodyDescriptorBase { class ExternalOneByteString::BodyDescriptor final : public BodyDescriptorBase {
public: public:
static bool IsValidSlot(HeapObject* obj, int offset) { return false; } static bool IsValidSlot(HeapObject* obj, int offset) { return false; }
...@@ -329,7 +344,6 @@ class ExternalOneByteString::BodyDescriptor final : public BodyDescriptorBase { ...@@ -329,7 +344,6 @@ class ExternalOneByteString::BodyDescriptor final : public BodyDescriptorBase {
static inline int SizeOf(Map* map, HeapObject* object) { return kSize; } static inline int SizeOf(Map* map, HeapObject* object) { return kSize; }
}; };
class ExternalTwoByteString::BodyDescriptor final : public BodyDescriptorBase { class ExternalTwoByteString::BodyDescriptor final : public BodyDescriptorBase {
public: public:
static bool IsValidSlot(HeapObject* obj, int offset) { return false; } static bool IsValidSlot(HeapObject* obj, int offset) { return false; }
...@@ -352,7 +366,6 @@ class ExternalTwoByteString::BodyDescriptor final : public BodyDescriptorBase { ...@@ -352,7 +366,6 @@ class ExternalTwoByteString::BodyDescriptor final : public BodyDescriptorBase {
static inline int SizeOf(Map* map, HeapObject* object) { return kSize; } static inline int SizeOf(Map* map, HeapObject* object) { return kSize; }
}; };
class Code::BodyDescriptor final : public BodyDescriptorBase { class Code::BodyDescriptor final : public BodyDescriptorBase {
public: public:
STATIC_ASSERT(kRelocationInfoOffset + kPointerSize == kHandlerTableOffset); STATIC_ASSERT(kRelocationInfoOffset + kPointerSize == kHandlerTableOffset);
......
...@@ -82,7 +82,7 @@ class FixedBodyDescriptor final : public BodyDescriptorBase { ...@@ -82,7 +82,7 @@ class FixedBodyDescriptor final : public BodyDescriptorBase {
template <typename ObjectVisitor> template <typename ObjectVisitor>
static inline void IterateBody(HeapObject* obj, ObjectVisitor* v) { static inline void IterateBody(HeapObject* obj, ObjectVisitor* v) {
IterateBodyImpl(obj, start_offset, end_offset, v); IteratePointers(obj, start_offset, end_offset, v);
} }
template <typename ObjectVisitor> template <typename ObjectVisitor>
...@@ -94,7 +94,7 @@ class FixedBodyDescriptor final : public BodyDescriptorBase { ...@@ -94,7 +94,7 @@ class FixedBodyDescriptor final : public BodyDescriptorBase {
template <typename StaticVisitor> template <typename StaticVisitor>
static inline void IterateBody(HeapObject* obj) { static inline void IterateBody(HeapObject* obj) {
Heap* heap = obj->GetHeap(); Heap* heap = obj->GetHeap();
IterateBodyImpl<StaticVisitor>(heap, obj, start_offset, end_offset); IteratePointers<StaticVisitor>(heap, obj, start_offset, end_offset);
} }
template <typename StaticVisitor> template <typename StaticVisitor>
...@@ -113,20 +113,19 @@ class FlexibleBodyDescriptor final : public BodyDescriptorBase { ...@@ -113,20 +113,19 @@ class FlexibleBodyDescriptor final : public BodyDescriptorBase {
static const int kStartOffset = start_offset; static const int kStartOffset = start_offset;
static bool IsValidSlot(HeapObject* obj, int offset) { static bool IsValidSlot(HeapObject* obj, int offset) {
if (offset < kStartOffset) return false; return (offset >= kStartOffset);
return IsValidSlotImpl(obj, offset);
} }
template <typename ObjectVisitor> template <typename ObjectVisitor>
static inline void IterateBody(HeapObject* obj, int object_size, static inline void IterateBody(HeapObject* obj, int object_size,
ObjectVisitor* v) { ObjectVisitor* v) {
IterateBodyImpl(obj, start_offset, object_size, v); IteratePointers(obj, start_offset, object_size, v);
} }
template <typename StaticVisitor> template <typename StaticVisitor>
static inline void IterateBody(HeapObject* obj, int object_size) { static inline void IterateBody(HeapObject* obj, int object_size) {
Heap* heap = obj->GetHeap(); Heap* heap = obj->GetHeap();
IterateBodyImpl<StaticVisitor>(heap, obj, start_offset, object_size); IteratePointers<StaticVisitor>(heap, obj, start_offset, object_size);
} }
static inline int SizeOf(Map* map, HeapObject* object); static inline int SizeOf(Map* map, HeapObject* object);
......
...@@ -2552,7 +2552,7 @@ class JSObject: public JSReceiver { ...@@ -2552,7 +2552,7 @@ class JSObject: public JSReceiver {
STATIC_ASSERT(kHeaderSize == Internals::kJSObjectHeaderSize); STATIC_ASSERT(kHeaderSize == Internals::kJSObjectHeaderSize);
typedef FlexibleBodyDescriptor<JSReceiver::kPropertiesOffset> BodyDescriptor; class BodyDescriptor;
// Gets the number of currently used elements. // Gets the number of currently used elements.
int GetFastElementsUsage(); int GetFastElementsUsage();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment