X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..40a37d088818fc2fbeba2ef850dbcaaf294befbf:/heap/ConservativeRoots.cpp?ds=inline diff --git a/heap/ConservativeRoots.cpp b/heap/ConservativeRoots.cpp index d63faeb..f00b2fb 100644 --- a/heap/ConservativeRoots.cpp +++ b/heap/ConservativeRoots.cpp @@ -26,12 +26,13 @@ #include "config.h" #include "ConservativeRoots.h" -#include "CopiedSpace.h" -#include "CopiedSpaceInlineMethods.h" #include "CodeBlock.h" -#include "DFGCodeBlocks.h" +#include "CodeBlockSet.h" +#include "CopiedSpace.h" +#include "CopiedSpaceInlines.h" #include "JSCell.h" #include "JSObject.h" +#include "JSCInlines.h" #include "Structure.h" namespace JSC { @@ -62,19 +63,12 @@ void ConservativeRoots::grow() m_roots = newRoots; } -class DummyMarkHook { -public: - void mark(void*) { } -}; - template inline void ConservativeRoots::genericAddPointer(void* p, TinyBloomFilter filter, MarkHook& markHook) { markHook.mark(p); - - CopiedBlock* block; - if (m_copiedSpace->contains(p, block)) - m_copiedSpace->pin(block); + + m_copiedSpace->pinIfNecessary(p); MarkedBlock* candidate = MarkedBlock::blockFor(p); if (filter.ruleOut(reinterpret_cast(candidate))) { @@ -100,25 +94,61 @@ inline void ConservativeRoots::genericAddPointer(void* p, TinyBloomFilter filter template void ConservativeRoots::genericAddSpan(void* begin, void* end, MarkHook& markHook) { - ASSERT(begin <= end); - ASSERT((static_cast(end) - static_cast(begin)) < 0x1000000); - ASSERT(isPointerAligned(begin)); - ASSERT(isPointerAligned(end)); + if (begin > end) { + void* swapTemp = begin; + begin = end; + end = swapTemp; + } + + RELEASE_ASSERT(isPointerAligned(begin)); + RELEASE_ASSERT(isPointerAligned(end)); TinyBloomFilter filter = m_blocks->filter(); // Make a local copy of filter to show the compiler it won't alias, and can be register-allocated. for (char** it = static_cast(begin); it != static_cast(end); ++it) genericAddPointer(*it, filter, markHook); } +class DummyMarkHook { +public: + void mark(void*) { } +}; + void ConservativeRoots::add(void* begin, void* end) { - DummyMarkHook hook; - genericAddSpan(begin, end, hook); + DummyMarkHook dummy; + genericAddSpan(begin, end, dummy); } -void ConservativeRoots::add(void* begin, void* end, DFGCodeBlocks& dfgCodeBlocks) +void ConservativeRoots::add(void* begin, void* end, JITStubRoutineSet& jitStubRoutines) +{ + genericAddSpan(begin, end, jitStubRoutines); +} + +template +class CompositeMarkHook { +public: + CompositeMarkHook(T& first, U& second) + : m_first(first) + , m_second(second) + { + } + + void mark(void* address) + { + m_first.mark(address); + m_second.mark(address); + } + +private: + T& m_first; + U& m_second; +}; + +void ConservativeRoots::add( + void* begin, void* end, JITStubRoutineSet& jitStubRoutines, CodeBlockSet& codeBlocks) { - genericAddSpan(begin, end, dfgCodeBlocks); + CompositeMarkHook markHook(jitStubRoutines, codeBlocks); + genericAddSpan(begin, end, markHook); } } // namespace JSC