Index: src/liveobjectlist.h |
diff --git a/src/liveobjectlist.h b/src/liveobjectlist.h |
deleted file mode 100644 |
index 1aa91960512ae30f129612bf97271ec0e46149a9..0000000000000000000000000000000000000000 |
--- a/src/liveobjectlist.h |
+++ /dev/null |
@@ -1,319 +0,0 @@ |
-// Copyright 2011 the V8 project authors. All rights reserved. |
-// Redistribution and use in source and binary forms, with or without |
-// modification, are permitted provided that the following conditions are |
-// met: |
-// |
-// * Redistributions of source code must retain the above copyright |
-// notice, this list of conditions and the following disclaimer. |
-// * Redistributions in binary form must reproduce the above |
-// copyright notice, this list of conditions and the following |
-// disclaimer in the documentation and/or other materials provided |
-// with the distribution. |
-// * Neither the name of Google Inc. nor the names of its |
-// contributors may be used to endorse or promote products derived |
-// from this software without specific prior written permission. |
-// |
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- |
-#ifndef V8_LIVEOBJECTLIST_H_ |
-#define V8_LIVEOBJECTLIST_H_ |
- |
-#include "v8.h" |
- |
-#include "checks.h" |
-#include "heap.h" |
-#include "objects.h" |
-#include "globals.h" |
- |
-namespace v8 { |
-namespace internal { |
- |
-#ifdef LIVE_OBJECT_LIST |
- |
-#ifdef DEBUG |
-// The following symbol when defined enables thorough verification of lol data. |
-// FLAG_verify_lol will also need to set to true to enable the verification. |
-#define VERIFY_LOL |
-#endif |
- |
- |
-typedef int LiveObjectType; |
-class LolFilter; |
-class LiveObjectSummary; |
-class DumpWriter; |
-class SummaryWriter; |
- |
- |
-// The LiveObjectList is both a mechanism for tracking a live capture of |
-// objects in the JS heap, as well as is the data structure which represents |
-// each of those captures. Unlike a snapshot, the lol is live. For example, |
-// if an object in a captured lol dies and is collected by the GC, the lol |
-// will reflect that the object is no longer available. The term |
-// LiveObjectList (and lol) is used to describe both the mechanism and the |
-// data structure depending on context of use. |
-// |
-// In captured lols, objects are tracked using their address and an object id. |
-// The object id is unique. Once assigned to an object, the object id can never |
-// be assigned to another object. That is unless all captured lols are deleted |
-// which allows the user to start over with a fresh set of lols and object ids. |
-// The uniqueness of the object ids allows the user to track specific objects |
-// and inspect its longevity while debugging JS code in execution. |
-// |
-// The lol comes with utility functions to capture, dump, summarize, and diff |
-// captured lols amongst other functionality. These functionality are |
-// accessible via the v8 debugger interface. |
-class LiveObjectList { |
- public: |
- inline static void GCEpilogue(); |
- inline static void GCPrologue(); |
- inline static void IterateElements(ObjectVisitor* v); |
- inline static void ProcessNonLive(HeapObject* obj); |
- inline static void UpdateReferencesForScavengeGC(); |
- |
- // Note: LOLs can be listed by calling Dump(0, <lol id>), and 2 LOLs can be |
- // compared/diff'ed using Dump(<lol id1>, <lol id2>, ...). This will yield |
- // a verbose dump of all the objects in the resultant lists. |
- // Similarly, a summarized result of a LOL listing or a diff can be |
- // attained using the Summarize(0, <lol id>) and Summarize(<lol id1, |
- // <lol id2>, ...) respectively. |
- |
- static MaybeObject* Capture(); |
- static bool Delete(int id); |
- static MaybeObject* Dump(int id1, |
- int id2, |
- int start_idx, |
- int dump_limit, |
- Handle<JSObject> filter_obj); |
- static MaybeObject* Info(int start_idx, int dump_limit); |
- static MaybeObject* Summarize(int id1, int id2, Handle<JSObject> filter_obj); |
- |
- static void Reset(); |
- static Object* GetObj(int obj_id); |
- static int GetObjId(Object* obj); |
- static Object* GetObjId(Handle<String> address); |
- static MaybeObject* GetObjRetainers(int obj_id, |
- Handle<JSObject> instance_filter, |
- bool verbose, |
- int start, |
- int count, |
- Handle<JSObject> filter_obj); |
- |
- static Object* GetPath(int obj_id1, |
- int obj_id2, |
- Handle<JSObject> instance_filter); |
- static Object* PrintObj(int obj_id); |
- |
- private: |
- struct Element { |
- int id_; |
- HeapObject* obj_; |
- }; |
- |
- explicit LiveObjectList(LiveObjectList* prev, int capacity); |
- ~LiveObjectList(); |
- |
- static void GCEpiloguePrivate(); |
- static void IterateElementsPrivate(ObjectVisitor* v); |
- |
- static void DoProcessNonLive(HeapObject* obj); |
- |
- static int CompareElement(const Element* a, const Element* b); |
- |
- static Object* GetPathPrivate(HeapObject* obj1, HeapObject* obj2); |
- |
- static int GetRetainers(Handle<HeapObject> target, |
- Handle<JSObject> instance_filter, |
- Handle<FixedArray> retainers_arr, |
- int start, |
- int dump_limit, |
- int* total_count, |
- LolFilter* filter, |
- LiveObjectSummary* summary, |
- JSFunction* arguments_function, |
- Handle<Object> error); |
- |
- static MaybeObject* DumpPrivate(DumpWriter* writer, |
- int start, |
- int dump_limit, |
- LolFilter* filter); |
- static MaybeObject* SummarizePrivate(SummaryWriter* writer, |
- LolFilter* filter, |
- bool is_tracking_roots); |
- |
- static bool NeedLOLProcessing() { return (last() != NULL); } |
- static void NullifyNonLivePointer(HeapObject** p) { |
- // Mask out the low bit that marks this as a heap object. We'll use this |
- // cleared bit as an indicator that this pointer needs to be collected. |
- // |
- // Meanwhile, we still preserve its approximate value so that we don't |
- // have to resort the elements list all the time. |
- // |
- // Note: Doing so also makes this HeapObject* look like an SMI. Hence, |
- // GC pointer updater will ignore it when it gets scanned. |
- *p = reinterpret_cast<HeapObject*>((*p)->address()); |
- } |
- |
- LiveObjectList* prev() { return prev_; } |
- LiveObjectList* next() { return next_; } |
- int id() { return id_; } |
- |
- static int list_count() { return list_count_; } |
- static LiveObjectList* last() { return last_; } |
- |
- inline static LiveObjectList* FindLolForId(int id, LiveObjectList* start_lol); |
- int TotalObjCount() { return GetTotalObjCountAndSize(NULL); } |
- int GetTotalObjCountAndSize(int* size_p); |
- |
- bool Add(HeapObject* obj); |
- Element* Find(HeapObject* obj); |
- static void NullifyMostRecent(HeapObject* obj); |
- void Sort(); |
- static void SortAll(); |
- |
- static void PurgeDuplicates(); // Only to be called by GCEpilogue. |
- |
-#ifdef VERIFY_LOL |
- static void Verify(bool match_heap_exactly = false); |
- static void VerifyNotInFromSpace(); |
-#endif |
- |
- // Iterates the elements in every lol and returns the one that matches the |
- // specified key. If no matching element is found, then it returns NULL. |
- template <typename T> |
- inline static LiveObjectList::Element* |
- FindElementFor(T (*GetValue)(LiveObjectList::Element*), T key); |
- |
- inline static int GetElementId(Element* element); |
- inline static HeapObject* GetElementObj(Element* element); |
- |
- // Instance fields. |
- LiveObjectList* prev_; |
- LiveObjectList* next_; |
- int id_; |
- int capacity_; |
- int obj_count_; |
- Element* elements_; |
- |
- // Statics for managing all the lists. |
- static uint32_t next_element_id_; |
- static int list_count_; |
- static int last_id_; |
- static LiveObjectList* first_; |
- static LiveObjectList* last_; |
- |
- friend class LolIterator; |
- friend class LolForwardIterator; |
- friend class LolDumpWriter; |
- friend class RetainersDumpWriter; |
- friend class RetainersSummaryWriter; |
- friend class UpdateLiveObjectListVisitor; |
-}; |
- |
- |
-// Helper class for updating the LiveObjectList HeapObject pointers. |
-class UpdateLiveObjectListVisitor: public ObjectVisitor { |
- public: |
- void VisitPointer(Object** p) { UpdatePointer(p); } |
- |
- void VisitPointers(Object** start, Object** end) { |
- // Copy all HeapObject pointers in [start, end). |
- for (Object** p = start; p < end; p++) UpdatePointer(p); |
- } |
- |
- private: |
- // Based on Heap::ScavengeObject() but only does forwarding of pointers |
- // to live new space objects, and not actually keep them alive. |
- void UpdatePointer(Object** p) { |
- Object* object = *p; |
- if (!HEAP->InNewSpace(object)) return; |
- |
- HeapObject* heap_obj = HeapObject::cast(object); |
- ASSERT(HEAP->InFromSpace(heap_obj)); |
- |
- // We use the first word (where the map pointer usually is) of a heap |
- // object to record the forwarding pointer. A forwarding pointer can |
- // point to an old space, the code space, or the to space of the new |
- // generation. |
- MapWord first_word = heap_obj->map_word(); |
- |
- // If the first word is a forwarding address, the object has already been |
- // copied. |
- if (first_word.IsForwardingAddress()) { |
- *p = first_word.ToForwardingAddress(); |
- return; |
- |
- // Else, it's a dead object. |
- } else { |
- LiveObjectList::NullifyNonLivePointer(reinterpret_cast<HeapObject**>(p)); |
- } |
- } |
-}; |
- |
- |
-#else // !LIVE_OBJECT_LIST |
- |
- |
-class LiveObjectList { |
- public: |
- inline static void GCEpilogue() {} |
- inline static void GCPrologue() {} |
- inline static void IterateElements(ObjectVisitor* v) {} |
- inline static void ProcessNonLive(HeapObject* obj) {} |
- inline static void UpdateReferencesForScavengeGC() {} |
- |
- inline static MaybeObject* Capture() { return HEAP->undefined_value(); } |
- inline static bool Delete(int id) { return false; } |
- inline static MaybeObject* Dump(int id1, |
- int id2, |
- int start_idx, |
- int dump_limit, |
- Handle<JSObject> filter_obj) { |
- return HEAP->undefined_value(); |
- } |
- inline static MaybeObject* Info(int start_idx, int dump_limit) { |
- return HEAP->undefined_value(); |
- } |
- inline static MaybeObject* Summarize(int id1, |
- int id2, |
- Handle<JSObject> filter_obj) { |
- return HEAP->undefined_value(); |
- } |
- |
- inline static void Reset() {} |
- inline static Object* GetObj(int obj_id) { return HEAP->undefined_value(); } |
- inline static Object* GetObjId(Handle<String> address) { |
- return HEAP->undefined_value(); |
- } |
- inline static MaybeObject* GetObjRetainers(int obj_id, |
- Handle<JSObject> instance_filter, |
- bool verbose, |
- int start, |
- int count, |
- Handle<JSObject> filter_obj) { |
- return HEAP->undefined_value(); |
- } |
- |
- inline static Object* GetPath(int obj_id1, |
- int obj_id2, |
- Handle<JSObject> instance_filter) { |
- return HEAP->undefined_value(); |
- } |
- inline static Object* PrintObj(int obj_id) { return HEAP->undefined_value(); } |
-}; |
- |
- |
-#endif // LIVE_OBJECT_LIST |
- |
-} } // namespace v8::internal |
- |
-#endif // V8_LIVEOBJECTLIST_H_ |