src/3rdparty/webkit/JavaScriptCore/runtime/CollectorHeapIterator.h
changeset 0 1918ee327afb
child 30 5dc02b23752f
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     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 "Collector.h"
       
    28 
       
    29 #ifndef CollectorHeapIterator_h
       
    30 #define CollectorHeapIterator_h
       
    31 
       
    32 namespace JSC {
       
    33 
       
    34     template <HeapType heapType> class CollectorHeapIterator {
       
    35     public:
       
    36         CollectorHeapIterator(CollectorBlock** block, CollectorBlock** endBlock);
       
    37 
       
    38         bool operator!=(const CollectorHeapIterator<heapType>& other) { return m_block != other.m_block || m_cell != other.m_cell; }
       
    39         CollectorHeapIterator<heapType>& operator++();
       
    40         JSCell* operator*() const;
       
    41     
       
    42     private:
       
    43         typedef typename HeapConstants<heapType>::Block Block;
       
    44         typedef typename HeapConstants<heapType>::Cell Cell;
       
    45 
       
    46         Block** m_block;
       
    47         Block** m_endBlock;
       
    48         Cell* m_cell;
       
    49         Cell* m_endCell;
       
    50     };
       
    51 
       
    52     template <HeapType heapType> 
       
    53     CollectorHeapIterator<heapType>::CollectorHeapIterator(CollectorBlock** block, CollectorBlock** endBlock)
       
    54         : m_block(reinterpret_cast<Block**>(block))
       
    55         , m_endBlock(reinterpret_cast<Block**>(endBlock))
       
    56         , m_cell(m_block == m_endBlock ? 0 : (*m_block)->cells)
       
    57         , m_endCell(m_block == m_endBlock ? 0 : (*m_block)->cells + HeapConstants<heapType>::cellsPerBlock)
       
    58     {
       
    59         if (m_cell && m_cell->u.freeCell.zeroIfFree == 0)
       
    60             ++*this;
       
    61     }
       
    62 
       
    63     template <HeapType heapType> 
       
    64     CollectorHeapIterator<heapType>& CollectorHeapIterator<heapType>::operator++()
       
    65     {
       
    66         do {
       
    67             for (++m_cell; m_cell != m_endCell; ++m_cell)
       
    68                 if (m_cell->u.freeCell.zeroIfFree != 0) {
       
    69                     return *this;
       
    70                 }
       
    71 
       
    72             if (++m_block != m_endBlock) {
       
    73                 m_cell = (*m_block)->cells;
       
    74                 m_endCell = (*m_block)->cells + HeapConstants<heapType>::cellsPerBlock;
       
    75             }
       
    76         } while(m_block != m_endBlock);
       
    77 
       
    78         m_cell = 0;
       
    79         return *this;
       
    80     }
       
    81 
       
    82     template <HeapType heapType> 
       
    83     JSCell* CollectorHeapIterator<heapType>::operator*() const
       
    84     {
       
    85         return reinterpret_cast<JSCell*>(m_cell);
       
    86     }
       
    87 
       
    88 } // namespace JSC
       
    89 
       
    90 #endif // CollectorHeapIterator_h