OLD | NEW |
---|---|
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 16 matching lines...) Expand all Loading... | |
27 | 27 |
28 #include "v8.h" | 28 #include "v8.h" |
29 | 29 |
30 #include "heap-snapshot-generator-inl.h" | 30 #include "heap-snapshot-generator-inl.h" |
31 | 31 |
32 #include "allocation-tracker.h" | 32 #include "allocation-tracker.h" |
33 #include "code-stubs.h" | 33 #include "code-stubs.h" |
34 #include "heap-profiler.h" | 34 #include "heap-profiler.h" |
35 #include "debug.h" | 35 #include "debug.h" |
36 #include "types.h" | 36 #include "types.h" |
37 #include "v8conversions.h" | |
37 | 38 |
38 namespace v8 { | 39 namespace v8 { |
39 namespace internal { | 40 namespace internal { |
40 | 41 |
41 | 42 |
42 HeapGraphEdge::HeapGraphEdge(Type type, const char* name, int from, int to) | 43 HeapGraphEdge::HeapGraphEdge(Type type, const char* name, int from, int to) |
43 : type_(type), | 44 : type_(type), |
44 from_index_(from), | 45 from_index_(from), |
45 to_index_(to), | 46 to_index_(to), |
46 name_(name) { | 47 name_(name) { |
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
892 } else if (object->IsHeapNumber()) { | 893 } else if (object->IsHeapNumber()) { |
893 return AddEntry(object, HeapEntry::kHeapNumber, "number"); | 894 return AddEntry(object, HeapEntry::kHeapNumber, "number"); |
894 } | 895 } |
895 return AddEntry(object, HeapEntry::kHidden, GetSystemEntryName(object)); | 896 return AddEntry(object, HeapEntry::kHidden, GetSystemEntryName(object)); |
896 } | 897 } |
897 | 898 |
898 | 899 |
899 HeapEntry* V8HeapExplorer::AddEntry(HeapObject* object, | 900 HeapEntry* V8HeapExplorer::AddEntry(HeapObject* object, |
900 HeapEntry::Type type, | 901 HeapEntry::Type type, |
901 const char* name) { | 902 const char* name) { |
902 int object_size = object->Size(); | 903 return AddEntry(object->address(), type, name, object->Size()); |
903 SnapshotObjectId object_id = | |
904 heap_object_map_->FindOrAddEntry(object->address(), object_size); | |
905 return snapshot_->AddEntry(type, name, object_id, object_size); | |
906 } | 904 } |
907 | 905 |
908 | 906 |
907 HeapEntry* V8HeapExplorer::AddEntry(Address address, | |
908 HeapEntry::Type type, | |
909 const char* name, | |
910 int size) { | |
911 SnapshotObjectId object_id = heap_object_map_->FindOrAddEntry(address, size); | |
912 return snapshot_->AddEntry(type, name, object_id, size); | |
913 } | |
914 | |
915 | |
909 class GcSubrootsEnumerator : public ObjectVisitor { | 916 class GcSubrootsEnumerator : public ObjectVisitor { |
910 public: | 917 public: |
911 GcSubrootsEnumerator( | 918 GcSubrootsEnumerator( |
912 SnapshotFillerInterface* filler, V8HeapExplorer* explorer) | 919 SnapshotFillerInterface* filler, V8HeapExplorer* explorer) |
913 : filler_(filler), | 920 : filler_(filler), |
914 explorer_(explorer), | 921 explorer_(explorer), |
915 previous_object_count_(0), | 922 previous_object_count_(0), |
916 object_count_(0) { | 923 object_count_(0) { |
917 } | 924 } |
918 void VisitPointers(Object** start, Object** end) { | 925 void VisitPointers(Object** start, Object** end) { |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1022 }; | 1029 }; |
1023 | 1030 |
1024 | 1031 |
1025 void V8HeapExplorer::ExtractReferences(HeapObject* obj) { | 1032 void V8HeapExplorer::ExtractReferences(HeapObject* obj) { |
1026 HeapEntry* heap_entry = GetEntry(obj); | 1033 HeapEntry* heap_entry = GetEntry(obj); |
1027 if (heap_entry == NULL) return; // No interest in this object. | 1034 if (heap_entry == NULL) return; // No interest in this object. |
1028 int entry = heap_entry->index(); | 1035 int entry = heap_entry->index(); |
1029 | 1036 |
1030 if (obj->IsJSGlobalProxy()) { | 1037 if (obj->IsJSGlobalProxy()) { |
1031 ExtractJSGlobalProxyReferences(entry, JSGlobalProxy::cast(obj)); | 1038 ExtractJSGlobalProxyReferences(entry, JSGlobalProxy::cast(obj)); |
1039 } else if (obj->IsJSArrayBuffer()) { | |
1040 ExtractJSArrayBufferReferences(entry, JSArrayBuffer::cast(obj)); | |
1032 } else if (obj->IsJSObject()) { | 1041 } else if (obj->IsJSObject()) { |
1033 ExtractJSObjectReferences(entry, JSObject::cast(obj)); | 1042 ExtractJSObjectReferences(entry, JSObject::cast(obj)); |
1034 } else if (obj->IsString()) { | 1043 } else if (obj->IsString()) { |
1035 ExtractStringReferences(entry, String::cast(obj)); | 1044 ExtractStringReferences(entry, String::cast(obj)); |
1036 } else if (obj->IsContext()) { | 1045 } else if (obj->IsContext()) { |
1037 ExtractContextReferences(entry, Context::cast(obj)); | 1046 ExtractContextReferences(entry, Context::cast(obj)); |
1038 } else if (obj->IsMap()) { | 1047 } else if (obj->IsMap()) { |
1039 ExtractMapReferences(entry, Map::cast(obj)); | 1048 ExtractMapReferences(entry, Map::cast(obj)); |
1040 } else if (obj->IsSharedFunctionInfo()) { | 1049 } else if (obj->IsSharedFunctionInfo()) { |
1041 ExtractSharedFunctionInfoReferences(entry, SharedFunctionInfo::cast(obj)); | 1050 ExtractSharedFunctionInfoReferences(entry, SharedFunctionInfo::cast(obj)); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1140 "global_receiver", global_obj->global_receiver(), | 1149 "global_receiver", global_obj->global_receiver(), |
1141 GlobalObject::kGlobalReceiverOffset); | 1150 GlobalObject::kGlobalReceiverOffset); |
1142 STATIC_CHECK(GlobalObject::kHeaderSize - JSObject::kHeaderSize == | 1151 STATIC_CHECK(GlobalObject::kHeaderSize - JSObject::kHeaderSize == |
1143 4 * kPointerSize); | 1152 4 * kPointerSize); |
1144 } else if (obj->IsJSArrayBufferView()) { | 1153 } else if (obj->IsJSArrayBufferView()) { |
1145 JSArrayBufferView* view = JSArrayBufferView::cast(obj); | 1154 JSArrayBufferView* view = JSArrayBufferView::cast(obj); |
1146 SetInternalReference(view, entry, "buffer", view->buffer(), | 1155 SetInternalReference(view, entry, "buffer", view->buffer(), |
1147 JSArrayBufferView::kBufferOffset); | 1156 JSArrayBufferView::kBufferOffset); |
1148 SetWeakReference(view, entry, "weak_next", view->weak_next(), | 1157 SetWeakReference(view, entry, "weak_next", view->weak_next(), |
1149 JSArrayBufferView::kWeakNextOffset); | 1158 JSArrayBufferView::kWeakNextOffset); |
1150 } else if (obj->IsJSArrayBuffer()) { | |
1151 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); | |
1152 SetWeakReference(buffer, entry, "weak_next", buffer->weak_next(), | |
1153 JSArrayBuffer::kWeakNextOffset); | |
1154 SetWeakReference(buffer, entry, | |
1155 "weak_first_view", buffer->weak_first_view(), | |
1156 JSArrayBuffer::kWeakFirstViewOffset); | |
1157 } | 1159 } |
1158 TagObject(js_obj->properties(), "(object properties)"); | 1160 TagObject(js_obj->properties(), "(object properties)"); |
1159 SetInternalReference(obj, entry, | 1161 SetInternalReference(obj, entry, |
1160 "properties", js_obj->properties(), | 1162 "properties", js_obj->properties(), |
1161 JSObject::kPropertiesOffset); | 1163 JSObject::kPropertiesOffset); |
1162 TagObject(js_obj->elements(), "(object elements)"); | 1164 TagObject(js_obj->elements(), "(object elements)"); |
1163 SetInternalReference(obj, entry, | 1165 SetInternalReference(obj, entry, |
1164 "elements", js_obj->elements(), | 1166 "elements", js_obj->elements(), |
1165 JSObject::kElementsOffset); | 1167 JSObject::kElementsOffset); |
1166 } | 1168 } |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1447 AllocationSite::kNestedSiteOffset); | 1449 AllocationSite::kNestedSiteOffset); |
1448 SetInternalReference(site, entry, "dependent_code", site->dependent_code(), | 1450 SetInternalReference(site, entry, "dependent_code", site->dependent_code(), |
1449 AllocationSite::kDependentCodeOffset); | 1451 AllocationSite::kDependentCodeOffset); |
1450 // Do not visit weak_next as it is not visited by the StaticVisitor, | 1452 // Do not visit weak_next as it is not visited by the StaticVisitor, |
1451 // and we're not very interested in weak_next field here. | 1453 // and we're not very interested in weak_next field here. |
1452 STATIC_CHECK(AllocationSite::kWeakNextOffset >= | 1454 STATIC_CHECK(AllocationSite::kWeakNextOffset >= |
1453 AllocationSite::BodyDescriptor::kEndOffset); | 1455 AllocationSite::BodyDescriptor::kEndOffset); |
1454 } | 1456 } |
1455 | 1457 |
1456 | 1458 |
1459 void V8HeapExplorer::ExtractJSArrayBufferReferences( | |
1460 int entry, JSArrayBuffer* array) { | |
Dmitry Lomov (no reviews)
2014/02/13 14:28:01
Nit: array -> buffer
alph
2014/02/13 14:49:14
Done.
| |
1461 SetWeakReference(array, entry, "weak_next", array->weak_next(), | |
1462 JSArrayBuffer::kWeakNextOffset); | |
1463 SetWeakReference(array, entry, | |
1464 "weak_first_view", array->weak_first_view(), | |
1465 JSArrayBuffer::kWeakFirstViewOffset); | |
1466 // Setup a reference to a native memory backing_store object. | |
1467 int data_size = NumberToInt32(array->byte_length()); | |
Dmitry Lomov (no reviews)
2014/02/13 14:28:01
ArrayBuffer's byte length should be size_t, not in
alph
2014/02/13 14:49:14
I thought about it, but I found that [currently] A
| |
1468 HeapEntry* data_entry = AddEntry( | |
1469 static_cast<Address>(array->backing_store()), | |
1470 HeapEntry::kNative, "system / ArrayBufferData", data_size); | |
1471 filler_->SetNamedReference(HeapGraphEdge::kInternal, | |
1472 entry, "backing_store", data_entry); | |
1473 } | |
1474 | |
1475 | |
1457 void V8HeapExplorer::ExtractClosureReferences(JSObject* js_obj, int entry) { | 1476 void V8HeapExplorer::ExtractClosureReferences(JSObject* js_obj, int entry) { |
1458 if (!js_obj->IsJSFunction()) return; | 1477 if (!js_obj->IsJSFunction()) return; |
1459 | 1478 |
1460 JSFunction* func = JSFunction::cast(js_obj); | 1479 JSFunction* func = JSFunction::cast(js_obj); |
1461 if (func->shared()->bound()) { | 1480 if (func->shared()->bound()) { |
1462 FixedArray* bindings = func->function_bindings(); | 1481 FixedArray* bindings = func->function_bindings(); |
1463 SetNativeBindReference(js_obj, entry, "bound_this", | 1482 SetNativeBindReference(js_obj, entry, "bound_this", |
1464 bindings->get(JSFunction::kBoundThisIndex)); | 1483 bindings->get(JSFunction::kBoundThisIndex)); |
1465 SetNativeBindReference(js_obj, entry, "bound_function", | 1484 SetNativeBindReference(js_obj, entry, "bound_function", |
1466 bindings->get(JSFunction::kBoundFunctionIndex)); | 1485 bindings->get(JSFunction::kBoundFunctionIndex)); |
(...skipping 1533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3000 writer_->AddString("\"<dummy>\""); | 3019 writer_->AddString("\"<dummy>\""); |
3001 for (int i = 1; i < sorted_strings.length(); ++i) { | 3020 for (int i = 1; i < sorted_strings.length(); ++i) { |
3002 writer_->AddCharacter(','); | 3021 writer_->AddCharacter(','); |
3003 SerializeString(sorted_strings[i]); | 3022 SerializeString(sorted_strings[i]); |
3004 if (writer_->aborted()) return; | 3023 if (writer_->aborted()) return; |
3005 } | 3024 } |
3006 } | 3025 } |
3007 | 3026 |
3008 | 3027 |
3009 } } // namespace v8::internal | 3028 } } // namespace v8::internal |
OLD | NEW |