]>
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 "CodeBlock.h" 
  30 #include "CodeBlockSet.h" 
  31 #include "CopiedSpace.h" 
  32 #include "CopiedSpaceInlines.h" 
  35 #include "JSCInlines.h" 
  36 #include "Structure.h" 
  40 ConservativeRoots::ConservativeRoots(const MarkedBlockSet
* blocks
, CopiedSpace
* copiedSpace
) 
  41     : m_roots(m_inlineRoots
) 
  43     , m_capacity(inlineCapacity
) 
  45     , m_copiedSpace(copiedSpace
) 
  49 ConservativeRoots::~ConservativeRoots() 
  51     if (m_roots 
!= m_inlineRoots
) 
  52         OSAllocator::decommitAndRelease(m_roots
, m_capacity 
* sizeof(JSCell
*)); 
  55 void ConservativeRoots::grow() 
  57     size_t newCapacity 
= m_capacity 
== inlineCapacity 
? nonInlineCapacity 
: m_capacity 
* 2; 
  58     JSCell
** newRoots 
= static_cast<JSCell
**>(OSAllocator::reserveAndCommit(newCapacity 
* sizeof(JSCell
*))); 
  59     memcpy(newRoots
, m_roots
, m_size 
* sizeof(JSCell
*)); 
  60     if (m_roots 
!= m_inlineRoots
) 
  61         OSAllocator::decommitAndRelease(m_roots
, m_capacity 
* sizeof(JSCell
*)); 
  62     m_capacity 
= newCapacity
; 
  66 template<typename MarkHook
> 
  67 inline void ConservativeRoots::genericAddPointer(void* p
, TinyBloomFilter filter
, MarkHook
& markHook
) 
  71     m_copiedSpace
->pinIfNecessary(p
); 
  73     MarkedBlock
* candidate 
= MarkedBlock::blockFor(p
); 
  74     if (filter
.ruleOut(reinterpret_cast<Bits
>(candidate
))) { 
  75         ASSERT(!candidate 
|| !m_blocks
->set().contains(candidate
)); 
  79     if (!MarkedBlock::isAtomAligned(p
)) 
  82     if (!m_blocks
->set().contains(candidate
)) 
  85     if (!candidate
->isLiveCell(p
)) 
  88     if (m_size 
== m_capacity
) 
  91     m_roots
[m_size
++] = static_cast<JSCell
*>(p
); 
  94 template<typename MarkHook
> 
  95 void ConservativeRoots::genericAddSpan(void* begin
, void* end
, MarkHook
& markHook
) 
  98         void* swapTemp 
= begin
; 
 103     RELEASE_ASSERT(isPointerAligned(begin
)); 
 104     RELEASE_ASSERT(isPointerAligned(end
)); 
 106     TinyBloomFilter filter 
= m_blocks
->filter(); // Make a local copy of filter to show the compiler it won't alias, and can be register-allocated. 
 107     for (char** it 
= static_cast<char**>(begin
); it 
!= static_cast<char**>(end
); ++it
) 
 108         genericAddPointer(*it
, filter
, markHook
); 
 111 class DummyMarkHook 
{ 
 116 void ConservativeRoots::add(void* begin
, void* end
) 
 119     genericAddSpan(begin
, end
, dummy
); 
 122 void ConservativeRoots::add(void* begin
, void* end
, JITStubRoutineSet
& jitStubRoutines
) 
 124     genericAddSpan(begin
, end
, jitStubRoutines
); 
 127 template<typename T
, typename U
> 
 128 class CompositeMarkHook 
{ 
 130     CompositeMarkHook(T
& first
, U
& second
) 
 136     void mark(void* address
) 
 138         m_first
.mark(address
); 
 139         m_second
.mark(address
); 
 147 void ConservativeRoots::add( 
 148     void* begin
, void* end
, JITStubRoutineSet
& jitStubRoutines
, CodeBlockSet
& codeBlocks
) 
 150     CompositeMarkHook
<JITStubRoutineSet
, CodeBlockSet
> markHook(jitStubRoutines
, codeBlocks
); 
 151     genericAddSpan(begin
, end
, markHook
);