| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #include "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "heap-snapshot-generator-inl.h" | 7 #include "heap-snapshot-generator-inl.h" |
| 8 | 8 |
| 9 #include "allocation-tracker.h" | 9 #include "allocation-tracker.h" |
| 10 #include "code-stubs.h" | 10 #include "code-stubs.h" |
| (...skipping 1038 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1049 void VisitPointers(Object** start, Object** end) { | 1049 void VisitPointers(Object** start, Object** end) { |
| 1050 for (Object** p = start; p < end; p++) { | 1050 for (Object** p = start; p < end; p++) { |
| 1051 ++next_index_; | 1051 ++next_index_; |
| 1052 if (CheckVisitedAndUnmark(p)) continue; | 1052 if (CheckVisitedAndUnmark(p)) continue; |
| 1053 generator_->SetHiddenReference(parent_obj_, parent_, next_index_, *p); | 1053 generator_->SetHiddenReference(parent_obj_, parent_, next_index_, *p); |
| 1054 } | 1054 } |
| 1055 } | 1055 } |
| 1056 static void MarkVisitedField(HeapObject* obj, int offset) { | 1056 static void MarkVisitedField(HeapObject* obj, int offset) { |
| 1057 if (offset < 0) return; | 1057 if (offset < 0) return; |
| 1058 Address field = obj->address() + offset; | 1058 Address field = obj->address() + offset; |
| 1059 ASSERT(!Memory::Object_at(field)->IsFailure()); | |
| 1060 ASSERT(Memory::Object_at(field)->IsHeapObject()); | 1059 ASSERT(Memory::Object_at(field)->IsHeapObject()); |
| 1061 Object* untagged = *reinterpret_cast<Object**>(field); | 1060 intptr_t p = reinterpret_cast<intptr_t>(Memory::Object_at(field)); |
| 1062 intptr_t tagged = reinterpret_cast<intptr_t>(untagged) | kFailureTag; | 1061 ASSERT(!IsMarked(p)); |
| 1063 *reinterpret_cast<Object**>(field) = reinterpret_cast<Object*>(tagged); | 1062 intptr_t p_tagged = p | kTag; |
| 1063 Memory::Object_at(field) = reinterpret_cast<Object*>(p_tagged); |
| 1064 } | 1064 } |
| 1065 | 1065 |
| 1066 private: | 1066 private: |
| 1067 bool CheckVisitedAndUnmark(Object** field) { | 1067 bool CheckVisitedAndUnmark(Object** field) { |
| 1068 if ((*field)->IsFailure()) { | 1068 intptr_t p = reinterpret_cast<intptr_t>(*field); |
| 1069 intptr_t untagged = reinterpret_cast<intptr_t>(*field) & ~kFailureTagMask; | 1069 if (IsMarked(p)) { |
| 1070 *field = reinterpret_cast<Object*>(untagged | kHeapObjectTag); | 1070 intptr_t p_untagged = (p & ~kTaggingMask) | kHeapObjectTag; |
| 1071 *field = reinterpret_cast<Object*>(p_untagged); |
| 1071 ASSERT((*field)->IsHeapObject()); | 1072 ASSERT((*field)->IsHeapObject()); |
| 1072 return true; | 1073 return true; |
| 1073 } | 1074 } |
| 1074 return false; | 1075 return false; |
| 1075 } | 1076 } |
| 1077 |
| 1078 static const intptr_t kTaggingMask = 3; |
| 1079 static const intptr_t kTag = 3; |
| 1080 |
| 1081 static bool IsMarked(intptr_t p) { return (p & kTaggingMask) == kTag; } |
| 1082 |
| 1076 V8HeapExplorer* generator_; | 1083 V8HeapExplorer* generator_; |
| 1077 HeapObject* parent_obj_; | 1084 HeapObject* parent_obj_; |
| 1078 int parent_; | 1085 int parent_; |
| 1079 int next_index_; | 1086 int next_index_; |
| 1080 }; | 1087 }; |
| 1081 | 1088 |
| 1082 | 1089 |
| 1083 bool V8HeapExplorer::ExtractReferencesPass1(int entry, HeapObject* obj) { | 1090 bool V8HeapExplorer::ExtractReferencesPass1(int entry, HeapObject* obj) { |
| 1084 if (obj->IsFixedArray()) return false; // FixedArrays are processed on pass 2 | 1091 if (obj->IsFixedArray()) return false; // FixedArrays are processed on pass 2 |
| 1085 | 1092 |
| (...skipping 2056 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3142 writer_->AddString("\"<dummy>\""); | 3149 writer_->AddString("\"<dummy>\""); |
| 3143 for (int i = 1; i < sorted_strings.length(); ++i) { | 3150 for (int i = 1; i < sorted_strings.length(); ++i) { |
| 3144 writer_->AddCharacter(','); | 3151 writer_->AddCharacter(','); |
| 3145 SerializeString(sorted_strings[i]); | 3152 SerializeString(sorted_strings[i]); |
| 3146 if (writer_->aborted()) return; | 3153 if (writer_->aborted()) return; |
| 3147 } | 3154 } |
| 3148 } | 3155 } |
| 3149 | 3156 |
| 3150 | 3157 |
| 3151 } } // namespace v8::internal | 3158 } } // namespace v8::internal |
| OLD | NEW |