| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 1830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1841 return entry; | 1841 return entry; |
| 1842 } | 1842 } |
| 1843 | 1843 |
| 1844 if (snapshot_->WillAddEntry(object)) entry = filler_->AddEntry(object); | 1844 if (snapshot_->WillAddEntry(object)) entry = filler_->AddEntry(object); |
| 1845 } | 1845 } |
| 1846 | 1846 |
| 1847 return entry; | 1847 return entry; |
| 1848 } | 1848 } |
| 1849 | 1849 |
| 1850 | 1850 |
| 1851 int HeapSnapshotGenerator::GetGlobalSecurityToken() { | |
| 1852 return collection_->token_enumerator()->GetTokenId( | |
| 1853 Top::context()->global()->global_context()->security_token()); | |
| 1854 } | |
| 1855 | |
| 1856 | |
| 1857 int HeapSnapshotGenerator::GetObjectSecurityToken(HeapObject* obj) { | |
| 1858 if (obj->IsGlobalContext()) { | |
| 1859 return collection_->token_enumerator()->GetTokenId( | |
| 1860 Context::cast(obj)->security_token()); | |
| 1861 } else { | |
| 1862 return TokenEnumerator::kNoSecurityToken; | |
| 1863 } | |
| 1864 } | |
| 1865 | |
| 1866 | |
| 1867 class IndexedReferencesExtractor : public ObjectVisitor { | 1851 class IndexedReferencesExtractor : public ObjectVisitor { |
| 1868 public: | 1852 public: |
| 1869 IndexedReferencesExtractor(HeapSnapshotGenerator* generator, | 1853 IndexedReferencesExtractor(HeapSnapshotGenerator* generator, |
| 1870 HeapObject* parent_obj, | 1854 HeapObject* parent_obj, |
| 1871 HeapEntry* parent_entry) | 1855 HeapEntry* parent_entry) |
| 1872 : generator_(generator), | 1856 : generator_(generator), |
| 1873 parent_obj_(parent_obj), | 1857 parent_obj_(parent_obj), |
| 1874 parent_(parent_entry), | 1858 parent_(parent_entry), |
| 1875 next_index_(1) { | 1859 next_index_(1) { |
| 1876 } | 1860 } |
| 1877 | 1861 |
| 1878 void VisitPointer(Object** o) { | 1862 void VisitPointer(Object** o) { |
| 1879 generator_->SetElementReference(parent_obj_, parent_, next_index_++, *o); | 1863 generator_->SetElementReference(parent_obj_, parent_, next_index_++, *o); |
| 1880 } | 1864 } |
| 1881 | 1865 |
| 1882 void VisitPointers(Object** start, Object** end) { | 1866 void VisitPointers(Object** start, Object** end) { |
| 1883 for (Object** p = start; p < end; p++) VisitPointer(p); | 1867 for (Object** p = start; p < end; p++) VisitPointer(p); |
| 1884 } | 1868 } |
| 1885 | 1869 |
| 1886 private: | 1870 private: |
| 1887 HeapSnapshotGenerator* generator_; | 1871 HeapSnapshotGenerator* generator_; |
| 1888 HeapObject* parent_obj_; | 1872 HeapObject* parent_obj_; |
| 1889 HeapEntry* parent_; | 1873 HeapEntry* parent_; |
| 1890 int next_index_; | 1874 int next_index_; |
| 1891 }; | 1875 }; |
| 1892 | 1876 |
| 1893 | 1877 |
| 1894 void HeapSnapshotGenerator::ExtractReferences(HeapObject* obj) { | 1878 void HeapSnapshotGenerator::ExtractReferences(HeapObject* obj) { |
| 1895 // We need to reference JS global objects from snapshot's root. | 1879 // We need to reference JS global objects from snapshot's root. |
| 1896 // We also need to only include global objects from the current | 1880 // We use JSGlobalProxy because this is what embedder (e.g. browser) |
| 1897 // security context. And we don't want to add the global proxy, | 1881 // uses for the global object. |
| 1898 // as we don't have a special type for it. | |
| 1899 if (obj->IsJSGlobalProxy()) { | 1882 if (obj->IsJSGlobalProxy()) { |
| 1900 int global_security_token = GetGlobalSecurityToken(); | |
| 1901 JSGlobalProxy* proxy = JSGlobalProxy::cast(obj); | 1883 JSGlobalProxy* proxy = JSGlobalProxy::cast(obj); |
| 1902 int object_security_token = | 1884 SetRootReference(proxy->map()->prototype()); |
| 1903 collection_->token_enumerator()->GetTokenId( | |
| 1904 Context::cast(proxy->context())->security_token()); | |
| 1905 if (object_security_token == TokenEnumerator::kNoSecurityToken | |
| 1906 || object_security_token == global_security_token) { | |
| 1907 SetRootReference(proxy->map()->prototype()); | |
| 1908 } | |
| 1909 return; | 1885 return; |
| 1910 } | 1886 } |
| 1911 | 1887 |
| 1912 HeapEntry* entry = GetEntry(obj); | 1888 HeapEntry* entry = GetEntry(obj); |
| 1913 if (entry == NULL) return; // No interest in this object. | 1889 if (entry == NULL) return; // No interest in this object. |
| 1914 | 1890 |
| 1915 if (obj->IsJSObject()) { | 1891 if (obj->IsJSObject()) { |
| 1916 JSObject* js_obj = JSObject::cast(obj); | 1892 JSObject* js_obj = JSObject::cast(obj); |
| 1917 ExtractClosureReferences(js_obj, entry); | 1893 ExtractClosureReferences(js_obj, entry); |
| 1918 ExtractPropertyReferences(js_obj, entry); | 1894 ExtractPropertyReferences(js_obj, entry); |
| (...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2546 void HeapSnapshotJSONSerializer::SortHashMap( | 2522 void HeapSnapshotJSONSerializer::SortHashMap( |
| 2547 HashMap* map, List<HashMap::Entry*>* sorted_entries) { | 2523 HashMap* map, List<HashMap::Entry*>* sorted_entries) { |
| 2548 for (HashMap::Entry* p = map->Start(); p != NULL; p = map->Next(p)) | 2524 for (HashMap::Entry* p = map->Start(); p != NULL; p = map->Next(p)) |
| 2549 sorted_entries->Add(p); | 2525 sorted_entries->Add(p); |
| 2550 sorted_entries->Sort(SortUsingEntryValue); | 2526 sorted_entries->Sort(SortUsingEntryValue); |
| 2551 } | 2527 } |
| 2552 | 2528 |
| 2553 } } // namespace v8::internal | 2529 } } // namespace v8::internal |
| 2554 | 2530 |
| 2555 #endif // ENABLE_LOGGING_AND_PROFILING | 2531 #endif // ENABLE_LOGGING_AND_PROFILING |
| OLD | NEW |