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

Unified Diff: src/objects-body-descriptors-inl.h

Issue 1440243002: Object's body descriptors refactoring. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@new-visitor-base
Patch Set: New files added to the lists 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/objects-body-descriptors.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects-body-descriptors-inl.h
diff --git a/src/objects-body-descriptors-inl.h b/src/objects-body-descriptors-inl.h
new file mode 100644
index 0000000000000000000000000000000000000000..8fe507ea3c07533e7667ea95c1c0193200379b9b
--- /dev/null
+++ b/src/objects-body-descriptors-inl.h
@@ -0,0 +1,584 @@
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_OBJECTS_BODY_DESCRIPTORS_INL_H_
+#define V8_OBJECTS_BODY_DESCRIPTORS_INL_H_
+
+#include "src/objects-body-descriptors.h"
+
+namespace v8 {
+namespace internal {
+
+template <int start_offset>
+int FlexibleBodyDescriptor<start_offset>::SizeOf(Map* map, HeapObject* object) {
+ return object->SizeFromMap(map);
+}
+
+
+bool BodyDescriptorBase::IsValidSlotImpl(HeapObject* obj, int offset) {
+ if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) {
+ return true;
+ } else {
+ DCHECK(FLAG_unbox_double_fields);
+ DCHECK(IsAligned(offset, kPointerSize));
+
+ LayoutDescriptorHelper helper(obj->map());
+ DCHECK(!helper.all_fields_tagged());
+ return helper.IsTagged(offset);
+ }
+}
+
+template <typename ObjectVisitor>
+void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset,
+ int end_offset, ObjectVisitor* v) {
+ if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) {
+ IteratePointers(obj, start_offset, end_offset, v);
+ } else {
+ DCHECK(FLAG_unbox_double_fields);
+ DCHECK(IsAligned(start_offset, kPointerSize) &&
+ IsAligned(end_offset, kPointerSize));
+
+ LayoutDescriptorHelper helper(obj->map());
+ DCHECK(!helper.all_fields_tagged());
+ for (int offset = start_offset; offset < end_offset;) {
+ int end_of_region_offset;
+ if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) {
+ IteratePointers(obj, offset, end_of_region_offset, v);
+ }
+ offset = end_of_region_offset;
+ }
+ }
+}
+
+
+template <typename StaticVisitor>
+void BodyDescriptorBase::IterateBodyImpl(Heap* heap, HeapObject* obj,
+ int start_offset, int end_offset) {
+ if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) {
+ IteratePointers<StaticVisitor>(heap, obj, start_offset, end_offset);
+ } else {
+ DCHECK(FLAG_unbox_double_fields);
+ DCHECK(IsAligned(start_offset, kPointerSize) &&
+ IsAligned(end_offset, kPointerSize));
+
+ LayoutDescriptorHelper helper(obj->map());
+ DCHECK(!helper.all_fields_tagged());
+ for (int offset = start_offset; offset < end_offset;) {
+ int end_of_region_offset;
+ if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) {
+ IteratePointers<StaticVisitor>(heap, obj, offset, end_of_region_offset);
+ }
+ offset = end_of_region_offset;
+ }
+ }
+}
+
+
+template <typename ObjectVisitor>
+void BodyDescriptorBase::IteratePointers(HeapObject* obj, int start_offset,
+ int end_offset, ObjectVisitor* v) {
+ v->VisitPointers(HeapObject::RawField(obj, start_offset),
+ HeapObject::RawField(obj, end_offset));
+}
+
+
+template <typename StaticVisitor>
+void BodyDescriptorBase::IteratePointers(Heap* heap, HeapObject* obj,
+ int start_offset, int end_offset) {
+ StaticVisitor::VisitPointers(heap, obj,
+ HeapObject::RawField(obj, start_offset),
+ HeapObject::RawField(obj, end_offset));
+}
+
+
+template <typename ObjectVisitor>
+void BodyDescriptorBase::IteratePointer(HeapObject* obj, int offset,
+ ObjectVisitor* v) {
+ v->VisitPointer(HeapObject::RawField(obj, offset));
+}
+
+
+template <typename StaticVisitor>
+void BodyDescriptorBase::IteratePointer(Heap* heap, HeapObject* obj,
+ int offset) {
+ StaticVisitor::VisitPointer(heap, obj, HeapObject::RawField(obj, offset));
+}
+
+
+// Iterates the function object according to the visiting policy.
+template <JSFunction::BodyVisitingPolicy body_visiting_policy>
+class JSFunction::BodyDescriptorImpl final : public BodyDescriptorBase {
+ public:
+ STATIC_ASSERT(kNonWeakFieldsEndOffset == kCodeEntryOffset);
+ STATIC_ASSERT(kCodeEntryOffset + kPointerSize == kNextFunctionLinkOffset);
+ STATIC_ASSERT(kNextFunctionLinkOffset + kPointerSize == kSize);
+
+ static bool IsValidSlot(HeapObject* obj, int offset) {
+ if (offset < kSize) return true;
+ // TODO(ishell): v8:4531, fix when JFunctions are allowed to have
+ // in-object properties
+ // return IsValidSlotImpl(obj, offset);
+ return true;
+ }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size,
+ ObjectVisitor* v) {
+ IteratePointers(obj, kPropertiesOffset, kNonWeakFieldsEndOffset, v);
+
+ if (body_visiting_policy & kVisitCodeEntry) {
+ v->VisitCodeEntry(obj->address() + kCodeEntryOffset);
+ }
+
+ if (body_visiting_policy & kVisitNextFunction) {
+ IteratePointers(obj, kNextFunctionLinkOffset, kSize, v);
+ }
+
+ // TODO(ishell): v8:4531, fix when JFunctions are allowed to have in-object
+ // properties
+ // IterateBodyImpl(obj, kSize, object_size, v);
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size) {
+ Heap* heap = obj->GetHeap();
+ IteratePointers<StaticVisitor>(heap, obj, kPropertiesOffset,
+ kNonWeakFieldsEndOffset);
+
+ if (body_visiting_policy & kVisitCodeEntry) {
+ StaticVisitor::VisitCodeEntry(heap, obj,
+ obj->address() + kCodeEntryOffset);
+ }
+
+ if (body_visiting_policy & kVisitNextFunction) {
+ IteratePointers<StaticVisitor>(heap, obj, kNextFunctionLinkOffset, kSize);
+ }
+
+ // TODO(ishell): v8:4531, fix when JFunctions are allowed to have in-object
+ // properties
+ // IterateBodyImpl<StaticVisitor>(heap, obj, kSize, object_size);
+ }
+
+ static inline int SizeOf(Map* map, HeapObject* object) {
+ // TODO(ishell): v8:4531, fix when JFunctions are allowed to have in-object
+ // properties
+ return JSFunction::kSize;
+ }
+};
+
+
+class JSArrayBuffer::BodyDescriptor final : public BodyDescriptorBase {
+ public:
+ STATIC_ASSERT(kByteLengthOffset + kPointerSize == kBackingStoreOffset);
+ STATIC_ASSERT(kBackingStoreOffset + kPointerSize == kBitFieldSlot);
+ STATIC_ASSERT(kBitFieldSlot + kPointerSize == kSize);
+
+ static bool IsValidSlot(HeapObject* obj, int offset) {
+ if (offset < kBackingStoreOffset) return true;
+ if (offset < kSize) return false;
+ if (offset < kSizeWithInternalFields) return true;
+ // TODO(ishell): v8:4531, fix when JSArrayBuffers are allowed to have
+ // in-object properties
+ // return IsValidSlotImpl(obj, offset);
+ return true;
+ }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size,
+ ObjectVisitor* v) {
+ IteratePointers(obj, kPropertiesOffset, kBackingStoreOffset, v);
+ IteratePointers(obj, kSize, kSizeWithInternalFields, v);
+
+ // TODO(ishell): v8:4531, fix when JSArrayBuffers are allowed to have
+ // in-object properties
+ // IterateBodyImpl(obj, kSize, object_size, v);
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size) {
+ Heap* heap = obj->GetHeap();
+ IteratePointers<StaticVisitor>(heap, obj, kPropertiesOffset,
+ kBackingStoreOffset);
+ IteratePointers<StaticVisitor>(heap, obj, kSize, kSizeWithInternalFields);
+
+ // TODO(ishell): v8:4531, fix when JSArrayBuffers are allowed to have
+ // in-object properties
+ // IterateBodyImpl<StaticVisitor>(heap, obj, kSize, object_size);
+ }
+
+ static inline int SizeOf(Map* map, HeapObject* object) {
+ // TODO(ishell): v8:4531, fix when JSArrayBuffers are allowed to have
+ // in-object properties
+ // return map->instance_size();
+ return kSizeWithInternalFields;
+ }
+};
+
+
+class BytecodeArray::BodyDescriptor final : public BodyDescriptorBase {
+ public:
+ static bool IsValidSlot(HeapObject* obj, int offset) {
+ return offset == kConstantPoolOffset;
+ }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size,
+ ObjectVisitor* v) {
+ IteratePointer(obj, kConstantPoolOffset, v);
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size) {
+ Heap* heap = obj->GetHeap();
+ IteratePointer<StaticVisitor>(heap, obj, kConstantPoolOffset);
+ }
+
+ static inline int SizeOf(Map* map, HeapObject* object) {
+ return SizeFor(
+ reinterpret_cast<FixedArray*>(object)->synchronized_length());
+ }
+};
+
+
+class FixedTypedArrayBase::BodyDescriptor final : public BodyDescriptorBase {
+ public:
+ static bool IsValidSlot(HeapObject* obj, int offset) {
+ return offset == kBasePointerOffset;
+ }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size,
+ ObjectVisitor* v) {
+ IteratePointer(obj, kBasePointerOffset, v);
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size) {
+ Heap* heap = obj->GetHeap();
+ IteratePointer<StaticVisitor>(heap, obj, kBasePointerOffset);
+ }
+
+ static inline int SizeOf(Map* map, HeapObject* object) {
+ return reinterpret_cast<FixedTypedArrayBase*>(object)->size();
+ }
+};
+
+
+class JSWeakCollection::BodyDescriptor final : public BodyDescriptorBase {
+ public:
+ static bool IsValidSlot(HeapObject* obj, int offset) {
+ // TODO(ishell): v8:4531, fix when JSWeakCollections are allowed to have
+ // in-object properties
+ // return IsValidSlotImpl(obj, offset);
+ return true;
+ }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size,
+ ObjectVisitor* v) {
+ IteratePointers(obj, kPropertiesOffset, kSize, v);
+
+ // TODO(ishell): v8:4531, fix when JSWeakCollections are allowed to have
+ // in-object properties
+ // IterateBodyImpl(obj, kSize, object_size, v);
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size) {
+ Heap* heap = obj->GetHeap();
+ IteratePointers<StaticVisitor>(heap, obj, kPropertiesOffset, kSize);
+
+ // TODO(ishell): v8:4531, fix when JSWeakCollections are allowed to have
+ // in-object properties
+ // IterateBodyImpl<StaticVisitor>(heap, obj, kSize, object_size);
+ }
+
+ static inline int SizeOf(Map* map, HeapObject* object) { return kSize; }
+};
+
+
+class Foreign::BodyDescriptor final : public BodyDescriptorBase {
+ public:
+ static bool IsValidSlot(HeapObject* obj, int offset) { return false; }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size,
+ ObjectVisitor* v) {
+ v->VisitExternalReference(reinterpret_cast<Address*>(
+ HeapObject::RawField(obj, kForeignAddressOffset)));
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size) {
+ StaticVisitor::VisitExternalReference(reinterpret_cast<Address*>(
+ HeapObject::RawField(obj, kForeignAddressOffset)));
+ }
+
+ static inline int SizeOf(Map* map, HeapObject* object) { return kSize; }
+};
+
+
+class ExternalOneByteString::BodyDescriptor final : public BodyDescriptorBase {
+ public:
+ static bool IsValidSlot(HeapObject* obj, int offset) { return false; }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size,
+ ObjectVisitor* v) {
+ typedef v8::String::ExternalOneByteStringResource Resource;
+ v->VisitExternalOneByteString(reinterpret_cast<Resource**>(
+ HeapObject::RawField(obj, kResourceOffset)));
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size) {
+ typedef v8::String::ExternalOneByteStringResource Resource;
+ StaticVisitor::VisitExternalOneByteString(reinterpret_cast<Resource**>(
+ HeapObject::RawField(obj, kResourceOffset)));
+ }
+
+ static inline int SizeOf(Map* map, HeapObject* object) { return kSize; }
+};
+
+
+class ExternalTwoByteString::BodyDescriptor final : public BodyDescriptorBase {
+ public:
+ static bool IsValidSlot(HeapObject* obj, int offset) { return false; }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size,
+ ObjectVisitor* v) {
+ typedef v8::String::ExternalStringResource Resource;
+ v->VisitExternalTwoByteString(reinterpret_cast<Resource**>(
+ HeapObject::RawField(obj, kResourceOffset)));
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size) {
+ typedef v8::String::ExternalStringResource Resource;
+ StaticVisitor::VisitExternalTwoByteString(reinterpret_cast<Resource**>(
+ HeapObject::RawField(obj, kResourceOffset)));
+ }
+
+ static inline int SizeOf(Map* map, HeapObject* object) { return kSize; }
+};
+
+
+class Code::BodyDescriptor final : public BodyDescriptorBase {
+ public:
+ STATIC_ASSERT(kRelocationInfoOffset + kPointerSize == kHandlerTableOffset);
+ STATIC_ASSERT(kHandlerTableOffset + kPointerSize ==
+ kDeoptimizationDataOffset);
+ STATIC_ASSERT(kDeoptimizationDataOffset + kPointerSize ==
+ kTypeFeedbackInfoOffset);
+ STATIC_ASSERT(kTypeFeedbackInfoOffset + kPointerSize == kNextCodeLinkOffset);
+
+ static bool IsValidSlot(HeapObject* obj, int offset) {
+ // Slots in code can't be invalid because we never trim code objects.
+ return true;
+ }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, ObjectVisitor* v) {
+ int mode_mask = RelocInfo::kCodeTargetMask |
+ RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
+ RelocInfo::ModeMask(RelocInfo::CELL) |
+ RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
+ RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
+ RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
+ RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
+ RelocInfo::kDebugBreakSlotMask;
+
+ IteratePointers(obj, kRelocationInfoOffset, kNextCodeLinkOffset, v);
+ v->VisitNextCodeLink(HeapObject::RawField(obj, kNextCodeLinkOffset));
+
+ RelocIterator it(reinterpret_cast<Code*>(obj), mode_mask);
+ Isolate* isolate = obj->GetIsolate();
+ for (; !it.done(); it.next()) {
+ it.rinfo()->Visit(isolate, v);
+ }
+ }
+
+ template <typename ObjectVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size,
+ ObjectVisitor* v) {
+ IterateBody(obj, v);
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj) {
+ int mode_mask = RelocInfo::kCodeTargetMask |
+ RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
+ RelocInfo::ModeMask(RelocInfo::CELL) |
+ RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
+ RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
+ RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
+ RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
+ RelocInfo::kDebugBreakSlotMask;
+
+ Heap* heap = obj->GetHeap();
+ IteratePointers<StaticVisitor>(heap, obj, kRelocationInfoOffset,
+ kNextCodeLinkOffset);
+ StaticVisitor::VisitNextCodeLink(
+ heap, HeapObject::RawField(obj, kNextCodeLinkOffset));
+
+ RelocIterator it(reinterpret_cast<Code*>(obj), mode_mask);
+ for (; !it.done(); it.next()) {
+ it.rinfo()->template Visit<StaticVisitor>(heap);
+ }
+ }
+
+ template <typename StaticVisitor>
+ static inline void IterateBody(HeapObject* obj, int object_size) {
+ IterateBody<StaticVisitor>(obj);
+ }
+
+ static inline int SizeOf(Map* map, HeapObject* object) {
+ return reinterpret_cast<Code*>(object)->CodeSize();
+ }
+};
+
+
+template <typename Op, typename ReturnType, typename T1, typename T2,
+ typename T3>
+ReturnType BodyDescriptorApply(InstanceType type, T1 p1, T2 p2, T3 p3) {
+ if (type < FIRST_NONSTRING_TYPE) {
+ switch (type & kStringRepresentationMask) {
+ case kSeqStringTag:
+ return ReturnType();
+ case kConsStringTag:
+ return Op::template apply<ConsString::BodyDescriptor>(p1, p2, p3);
+ case kSlicedStringTag:
+ return Op::template apply<SlicedString::BodyDescriptor>(p1, p2, p3);
+ case kExternalStringTag:
+ if ((type & kStringEncodingMask) == kOneByteStringTag) {
+ return Op::template apply<ExternalOneByteString::BodyDescriptor>(
+ p1, p2, p3);
+ } else {
+ return Op::template apply<ExternalTwoByteString::BodyDescriptor>(
+ p1, p2, p3);
+ }
+ }
+ UNREACHABLE();
+ return ReturnType();
+ }
+
+ switch (type) {
+ case FIXED_ARRAY_TYPE:
+ return Op::template apply<FixedArray::BodyDescriptor>(p1, p2, p3);
+ case FIXED_DOUBLE_ARRAY_TYPE:
+ return ReturnType();
+ case JS_OBJECT_TYPE:
+ case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
+ case JS_GENERATOR_OBJECT_TYPE:
+ case JS_MODULE_TYPE:
+ case JS_VALUE_TYPE:
+ case JS_DATE_TYPE:
+ case JS_ARRAY_TYPE:
+ case JS_TYPED_ARRAY_TYPE:
+ case JS_DATA_VIEW_TYPE:
+ case JS_SET_TYPE:
+ case JS_MAP_TYPE:
+ case JS_SET_ITERATOR_TYPE:
+ case JS_MAP_ITERATOR_TYPE:
+ case JS_ITERATOR_RESULT_TYPE:
+ case JS_REGEXP_TYPE:
+ case JS_GLOBAL_PROXY_TYPE:
+ case JS_GLOBAL_OBJECT_TYPE:
+ case JS_MESSAGE_OBJECT_TYPE:
+ return Op::template apply<JSObject::BodyDescriptor>(p1, p2, p3);
+ case JS_WEAK_MAP_TYPE:
+ case JS_WEAK_SET_TYPE:
+ return Op::template apply<JSWeakCollection::BodyDescriptor>(p1, p2, p3);
+ case JS_ARRAY_BUFFER_TYPE:
+ return Op::template apply<JSArrayBuffer::BodyDescriptor>(p1, p2, p3);
+ case JS_FUNCTION_TYPE:
+ return Op::template apply<JSFunction::BodyDescriptor>(p1, p2, p3);
+ case ODDBALL_TYPE:
+ return Op::template apply<Oddball::BodyDescriptor>(p1, p2, p3);
+ case JS_PROXY_TYPE:
+ return Op::template apply<JSProxy::BodyDescriptor>(p1, p2, p3);
+ case JS_FUNCTION_PROXY_TYPE:
+ return Op::template apply<JSFunctionProxy::BodyDescriptor>(p1, p2, p3);
+ case FOREIGN_TYPE:
+ return Op::template apply<Foreign::BodyDescriptor>(p1, p2, p3);
+ case MAP_TYPE:
+ return Op::template apply<Map::BodyDescriptor>(p1, p2, p3);
+ case CODE_TYPE:
+ return Op::template apply<Code::BodyDescriptor>(p1, p2, p3);
+ case CELL_TYPE:
+ return Op::template apply<Cell::BodyDescriptor>(p1, p2, p3);
+ case PROPERTY_CELL_TYPE:
+ return Op::template apply<PropertyCell::BodyDescriptor>(p1, p2, p3);
+ case WEAK_CELL_TYPE:
+ return Op::template apply<WeakCell::BodyDescriptor>(p1, p2, p3);
+ case SYMBOL_TYPE:
+ return Op::template apply<Symbol::BodyDescriptor>(p1, p2, p3);
+ case BYTECODE_ARRAY_TYPE:
+ return Op::template apply<BytecodeArray::BodyDescriptor>(p1, p2, p3);
+
+ case HEAP_NUMBER_TYPE:
+ case MUTABLE_HEAP_NUMBER_TYPE:
+ case SIMD128_VALUE_TYPE:
+ case FILLER_TYPE:
+ case BYTE_ARRAY_TYPE:
+ case FREE_SPACE_TYPE:
+ return ReturnType();
+
+#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
+ case FIXED_##TYPE##_ARRAY_TYPE: \
+ return Op::template apply<FixedTypedArrayBase::BodyDescriptor>(p1, p2, p3);
+ TYPED_ARRAYS(TYPED_ARRAY_CASE)
+#undef TYPED_ARRAY_CASE
+
+ case SHARED_FUNCTION_INFO_TYPE: {
+ return Op::template apply<SharedFunctionInfo::BodyDescriptor>(p1, p2, p3);
+ }
+
+#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE:
+ STRUCT_LIST(MAKE_STRUCT_CASE)
+#undef MAKE_STRUCT_CASE
+ if (type == ALLOCATION_SITE_TYPE) {
+ return Op::template apply<AllocationSite::BodyDescriptor>(p1, p2, p3);
+ } else {
+ return Op::template apply<StructBodyDescriptor>(p1, p2, p3);
+ }
+ default:
+ PrintF("Unknown type: %d\n", type);
+ UNREACHABLE();
+ return ReturnType();
+ }
+}
+
+
+template <typename ObjectVisitor>
+void HeapObject::IterateFast(ObjectVisitor* v) {
+ BodyDescriptorBase::IteratePointer(this, kMapOffset, v);
+ IterateBody(v);
+}
+
+
+template <typename ObjectVisitor>
+void HeapObject::IterateBodyFast(ObjectVisitor* v) {
+ Map* m = map();
+ IterateBody(m->instance_type(), SizeFromMap(m), v);
+}
+
+
+struct CallIterateBody {
+ template <typename BodyDescriptor, typename ObjectVisitor>
+ static void apply(HeapObject* obj, int object_size, ObjectVisitor* v) {
+ BodyDescriptor::IterateBody(obj, object_size, v);
+ }
+};
+
+template <typename ObjectVisitor>
+void HeapObject::IterateBodyFast(InstanceType type, int object_size,
+ ObjectVisitor* v) {
+ BodyDescriptorApply<CallIterateBody, void>(type, this, object_size, v);
+}
+} // namespace internal
+} // namespace v8
+
+#endif // V8_OBJECTS_BODY_DESCRIPTORS_INL_H_
« no previous file with comments | « src/objects-body-descriptors.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698