2011-02-10 Geoffrey Garen <ggaren@apple.com>
[WebKit-https.git] / Source / JavaScriptCore / runtime / CollectorHeapIterator.h
1 /*
2  * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "Heap.h"
28
29 #ifndef CollectorHeapIterator_h
30 #define CollectorHeapIterator_h
31
32 namespace JSC {
33
34     class CollectorHeapIterator {
35     public:
36         bool operator!=(const CollectorHeapIterator& other);
37         JSCell* operator*() const;
38     
39     protected:
40         CollectorHeapIterator(CollectorHeap&, size_t startBlock, size_t startCell);
41         void advance();
42         bool isValid();
43         bool isLive();
44
45         CollectorHeap& m_heap;
46         size_t m_block;
47         size_t m_cell;
48     };
49
50     class LiveObjectIterator : public CollectorHeapIterator {
51     public:
52         LiveObjectIterator(CollectorHeap&, size_t startBlock, size_t startCell = 0);
53         LiveObjectIterator& operator++();
54     };
55
56     inline CollectorHeapIterator::CollectorHeapIterator(CollectorHeap& heap, size_t startBlock, size_t startCell)
57         : m_heap(heap)
58         , m_block(startBlock)
59         , m_cell(startCell)
60     {
61     }
62
63     inline bool CollectorHeapIterator::operator!=(const CollectorHeapIterator& other)
64     {
65         return m_block != other.m_block || m_cell != other.m_cell;
66     }
67
68     inline bool CollectorHeapIterator::isValid()
69     {
70         return m_block < m_heap.blocks.size();
71     }
72
73     inline bool CollectorHeapIterator::isLive()
74     {
75         return m_heap.collectorBlock(m_block)->marked.get(m_cell);
76     }
77
78     inline JSCell* CollectorHeapIterator::operator*() const
79     {
80         return reinterpret_cast<JSCell*>(&m_heap.collectorBlock(m_block)->cells[m_cell]);
81     }
82     
83     // Iterators advance up to the next-to-last -- and not the last -- cell in a
84     // block, since the last cell is a dummy sentinel.
85     inline void CollectorHeapIterator::advance()
86     {
87         ++m_cell;
88         if (m_cell == MarkedBlock::CELLS_PER_BLOCK - 1) {
89             m_cell = 0;
90             ++m_block;
91         }
92     }
93
94     inline LiveObjectIterator::LiveObjectIterator(CollectorHeap& heap, size_t startBlock, size_t startCell)
95         : CollectorHeapIterator(heap, startBlock, startCell)
96     {
97         if (isValid() && !isLive())
98             ++(*this);
99     }
100
101     inline LiveObjectIterator& LiveObjectIterator::operator++()
102     {
103         do {
104             advance();
105         } while (isValid() && !isLive());
106         return *this;
107     }
108
109 } // namespace JSC
110
111 #endif // CollectorHeapIterator_h