]>
git.saurik.com Git - apple/javascriptcore.git/blob - heap/ConservativeRoots.cpp
   2  * Copyright (C) 2011 Apple Inc. All rights reserved. 
   4  * Redistribution and use in source and binary forms, with or without 
   5  * modification, are permitted provided that the following conditions 
   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. 
  13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 
  14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
  15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 
  17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
  18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
  19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
  20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
  21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
  22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
  23  * THE POSSIBILITY OF SUCH DAMAGE. 
  27 #include "ConservativeRoots.h" 
  29 #include "CopiedSpace.h" 
  30 #include "CopiedSpaceInlineMethods.h" 
  31 #include "CodeBlock.h" 
  32 #include "DFGCodeBlocks.h" 
  35 #include "Structure.h" 
  39 ConservativeRoots::ConservativeRoots(const MarkedBlockSet
* blocks
, CopiedSpace
* copiedSpace
) 
  40     : m_roots(m_inlineRoots
) 
  42     , m_capacity(inlineCapacity
) 
  44     , m_copiedSpace(copiedSpace
) 
  48 ConservativeRoots::~ConservativeRoots() 
  50     if (m_roots 
!= m_inlineRoots
) 
  51         OSAllocator::decommitAndRelease(m_roots
, m_capacity 
* sizeof(JSCell
*)); 
  54 void ConservativeRoots::grow() 
  56     size_t newCapacity 
= m_capacity 
== inlineCapacity 
? nonInlineCapacity 
: m_capacity 
* 2; 
  57     JSCell
** newRoots 
= static_cast<JSCell
**>(OSAllocator::reserveAndCommit(newCapacity 
* sizeof(JSCell
*))); 
  58     memcpy(newRoots
, m_roots
, m_size 
* sizeof(JSCell
*)); 
  59     if (m_roots 
!= m_inlineRoots
) 
  60         OSAllocator::decommitAndRelease(m_roots
, m_capacity 
* sizeof(JSCell
*)); 
  61     m_capacity 
= newCapacity
; 
  70 template<typename MarkHook
> 
  71 inline void ConservativeRoots::genericAddPointer(void* p
, TinyBloomFilter filter
, MarkHook
& markHook
) 
  76     if (m_copiedSpace
->contains(p
, block
)) 
  77         m_copiedSpace
->pin(block
); 
  79     MarkedBlock
* candidate 
= MarkedBlock::blockFor(p
); 
  80     if (filter
.ruleOut(reinterpret_cast<Bits
>(candidate
))) { 
  81         ASSERT(!candidate 
|| !m_blocks
->set().contains(candidate
)); 
  85     if (!MarkedBlock::isAtomAligned(p
)) 
  88     if (!m_blocks
->set().contains(candidate
)) 
  91     if (!candidate
->isLiveCell(p
)) 
  94     if (m_size 
== m_capacity
) 
  97     m_roots
[m_size
++] = static_cast<JSCell
*>(p
); 
 100 template<typename MarkHook
> 
 101 void ConservativeRoots::genericAddSpan(void* begin
, void* end
, MarkHook
& markHook
) 
 103     ASSERT(begin 
<= end
); 
 104     ASSERT((static_cast<char*>(end
) - static_cast<char*>(begin
)) < 0x1000000); 
 105     ASSERT(isPointerAligned(begin
)); 
 106     ASSERT(isPointerAligned(end
)); 
 108     TinyBloomFilter filter 
= m_blocks
->filter(); // Make a local copy of filter to show the compiler it won't alias, and can be register-allocated. 
 109     for (char** it 
= static_cast<char**>(begin
); it 
!= static_cast<char**>(end
); ++it
) 
 110         genericAddPointer(*it
, filter
, markHook
); 
 113 void ConservativeRoots::add(void* begin
, void* end
) 
 116     genericAddSpan(begin
, end
, hook
); 
 119 void ConservativeRoots::add(void* begin
, void* end
, DFGCodeBlocks
& dfgCodeBlocks
) 
 121     genericAddSpan(begin
, end
, dfgCodeBlocks
);