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

Side by Side Diff: src/objects-inl.h

Issue 1422773007: Make JSFunction::BodyDescriptor the only single place that knows how to iterate JSFunction's body. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressing comments 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 unified diff | Download patch
« no previous file with comments | « src/objects.cc ('k') | src/profiler/heap-snapshot-generator.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 // Review notes: 5 // Review notes:
6 // 6 //
7 // - The use of macros in these inline functions may seem superfluous 7 // - The use of macros in these inline functions may seem superfluous
8 // but it is absolutely needed to make sure gcc generates optimal 8 // but it is absolutely needed to make sure gcc generates optimal
9 // code. gcc is not happy when attempting to inline too deep. 9 // code. gcc is not happy when attempting to inline too deep.
10 // 10 //
(...skipping 7894 matching lines...) Expand 10 before | Expand all | Expand 10 after
7905 void ExternalTwoByteString::ExternalTwoByteStringIterateBody() { 7905 void ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
7906 typedef v8::String::ExternalStringResource Resource; 7906 typedef v8::String::ExternalStringResource Resource;
7907 StaticVisitor::VisitExternalTwoByteString( 7907 StaticVisitor::VisitExternalTwoByteString(
7908 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 7908 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
7909 } 7909 }
7910 7910
7911 7911
7912 void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset, 7912 void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset,
7913 int end_offset, ObjectVisitor* v) { 7913 int end_offset, ObjectVisitor* v) {
7914 if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) { 7914 if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) {
7915 v->VisitPointers(HeapObject::RawField(obj, start_offset), 7915 IteratePointers(obj, start_offset, end_offset, v);
7916 HeapObject::RawField(obj, end_offset));
7917 } else { 7916 } else {
7918 DCHECK(FLAG_unbox_double_fields); 7917 DCHECK(FLAG_unbox_double_fields);
7919 DCHECK(IsAligned(start_offset, kPointerSize) && 7918 DCHECK(IsAligned(start_offset, kPointerSize) &&
7920 IsAligned(end_offset, kPointerSize)); 7919 IsAligned(end_offset, kPointerSize));
7921 7920
7922 LayoutDescriptorHelper helper(obj->map()); 7921 LayoutDescriptorHelper helper(obj->map());
7923 DCHECK(!helper.all_fields_tagged()); 7922 DCHECK(!helper.all_fields_tagged());
7924 for (int offset = start_offset; offset < end_offset;) { 7923 for (int offset = start_offset; offset < end_offset;) {
7925 int end_of_region_offset; 7924 int end_of_region_offset;
7926 if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) { 7925 if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) {
7927 v->VisitPointers(HeapObject::RawField(obj, offset), 7926 IteratePointers(obj, offset, end_of_region_offset, v);
7928 HeapObject::RawField(obj, end_of_region_offset));
7929 } 7927 }
7930 offset = end_of_region_offset; 7928 offset = end_of_region_offset;
7931 } 7929 }
7932 } 7930 }
7933 } 7931 }
7934 7932
7935 7933
7936 template <typename StaticVisitor> 7934 template <typename StaticVisitor>
7937 void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset, 7935 void BodyDescriptorBase::IterateBodyImpl(Heap* heap, HeapObject* obj,
7938 int end_offset) { 7936 int start_offset, int end_offset) {
7939 Heap* heap = obj->GetHeap();
7940 if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) { 7937 if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) {
7941 StaticVisitor::VisitPointers(heap, obj, 7938 IteratePointers<StaticVisitor>(heap, obj, start_offset, end_offset);
7942 HeapObject::RawField(obj, start_offset),
7943 HeapObject::RawField(obj, end_offset));
7944 } else { 7939 } else {
7945 DCHECK(FLAG_unbox_double_fields); 7940 DCHECK(FLAG_unbox_double_fields);
7946 DCHECK(IsAligned(start_offset, kPointerSize) && 7941 DCHECK(IsAligned(start_offset, kPointerSize) &&
7947 IsAligned(end_offset, kPointerSize)); 7942 IsAligned(end_offset, kPointerSize));
7948 7943
7949 LayoutDescriptorHelper helper(obj->map()); 7944 LayoutDescriptorHelper helper(obj->map());
7950 DCHECK(!helper.all_fields_tagged()); 7945 DCHECK(!helper.all_fields_tagged());
7951 for (int offset = start_offset; offset < end_offset;) { 7946 for (int offset = start_offset; offset < end_offset;) {
7952 int end_of_region_offset; 7947 int end_of_region_offset;
7953 if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) { 7948 if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) {
7954 StaticVisitor::VisitPointers( 7949 IteratePointers<StaticVisitor>(heap, obj, offset, end_of_region_offset);
7955 heap, obj, HeapObject::RawField(obj, offset),
7956 HeapObject::RawField(obj, end_of_region_offset));
7957 } 7950 }
7958 offset = end_of_region_offset; 7951 offset = end_of_region_offset;
7959 } 7952 }
7960 } 7953 }
7961 } 7954 }
7962 7955
7963 7956
7957 void BodyDescriptorBase::IteratePointers(HeapObject* obj, int start_offset,
7958 int end_offset, ObjectVisitor* v) {
7959 v->VisitPointers(HeapObject::RawField(obj, start_offset),
7960 HeapObject::RawField(obj, end_offset));
7961 }
7962
7963
7964 template <typename StaticVisitor>
7965 void BodyDescriptorBase::IteratePointers(Heap* heap, HeapObject* obj,
7966 int start_offset, int end_offset) {
7967 StaticVisitor::VisitPointers(heap, obj,
7968 HeapObject::RawField(obj, start_offset),
7969 HeapObject::RawField(obj, end_offset));
7970 }
7971
7972
7973 // Iterates the function object according to the visiting policy.
7974 template <JSFunction::BodyVisitingPolicy body_visiting_policy>
7975 class JSFunction::BodyDescriptorImpl : public BodyDescriptorBase {
7976 public:
7977 STATIC_ASSERT(kNonWeakFieldsEndOffset == kCodeEntryOffset);
7978 STATIC_ASSERT(kCodeEntryOffset + kPointerSize == kNextFunctionLinkOffset);
7979 STATIC_ASSERT(kNextFunctionLinkOffset + kPointerSize == kSize);
7980
7981 static inline void IterateBody(HeapObject* obj, int object_size,
7982 ObjectVisitor* v) {
7983 IteratePointers(obj, kPropertiesOffset, kNonWeakFieldsEndOffset, v);
7984
7985 if (body_visiting_policy & kVisitCodeEntry) {
7986 v->VisitCodeEntry(obj->address() + kCodeEntryOffset);
7987 }
7988
7989 if (body_visiting_policy & kVisitNextFunction) {
7990 IteratePointers(obj, kNextFunctionLinkOffset, kSize, v);
7991 }
7992
7993 // TODO(ishell): v8:4531, fix when JFunctions are allowed to have in-object
7994 // properties
7995 // IterateBodyImpl(obj, kSize, object_size, v);
7996 }
7997
7998 template <typename StaticVisitor>
7999 static inline void IterateBody(HeapObject* obj, int object_size) {
8000 Heap* heap = obj->GetHeap();
8001 IteratePointers<StaticVisitor>(heap, obj, kPropertiesOffset,
8002 kNonWeakFieldsEndOffset);
8003
8004 if (body_visiting_policy & kVisitCodeEntry) {
8005 StaticVisitor::VisitCodeEntry(heap, obj,
8006 obj->address() + kCodeEntryOffset);
8007 }
8008
8009 if (body_visiting_policy & kVisitNextFunction) {
8010 IteratePointers<StaticVisitor>(heap, obj, kNextFunctionLinkOffset, kSize);
8011 }
8012
8013 // TODO(ishell): v8:4531, fix when JFunctions are allowed to have in-object
8014 // properties
8015 // IterateBodyImpl<StaticVisitor>(heap, obj, kSize, object_size);
8016 }
8017
8018 static inline int SizeOf(Map* map, HeapObject* object) {
8019 // TODO(ishell): v8:4531, fix when JFunctions are allowed to have in-object
8020 // properties
8021 return JSFunction::kSize;
8022 }
8023 };
8024
8025
7964 template<class Derived, class TableType> 8026 template<class Derived, class TableType>
7965 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() { 8027 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() {
7966 TableType* table(TableType::cast(this->table())); 8028 TableType* table(TableType::cast(this->table()));
7967 int index = Smi::cast(this->index())->value(); 8029 int index = Smi::cast(this->index())->value();
7968 Object* key = table->KeyAt(index); 8030 Object* key = table->KeyAt(index);
7969 DCHECK(!key->IsTheHole()); 8031 DCHECK(!key->IsTheHole());
7970 return key; 8032 return key;
7971 } 8033 }
7972 8034
7973 8035
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
8087 #undef WRITE_INT64_FIELD 8149 #undef WRITE_INT64_FIELD
8088 #undef READ_BYTE_FIELD 8150 #undef READ_BYTE_FIELD
8089 #undef WRITE_BYTE_FIELD 8151 #undef WRITE_BYTE_FIELD
8090 #undef NOBARRIER_READ_BYTE_FIELD 8152 #undef NOBARRIER_READ_BYTE_FIELD
8091 #undef NOBARRIER_WRITE_BYTE_FIELD 8153 #undef NOBARRIER_WRITE_BYTE_FIELD
8092 8154
8093 } // namespace internal 8155 } // namespace internal
8094 } // namespace v8 8156 } // namespace v8
8095 8157
8096 #endif // V8_OBJECTS_INL_H_ 8158 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | src/profiler/heap-snapshot-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698