summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/heap/MarkStack.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-07-18 13:59:13 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-07-18 13:59:28 +0200
commit4d6084feccab99c0a7b3ecef26bb49c41dd50201 (patch)
treefd1195897f551eee6d5a15d07ff5733b15aa2a5c /Source/JavaScriptCore/heap/MarkStack.cpp
parentae901828d4689ab9e89113f6b6ea8042b37a9fda (diff)
downloadqtwebkit-4d6084feccab99c0a7b3ecef26bb49c41dd50201.tar.gz
Imported WebKit commit ff52235a78888e5cb8e286a828a8698042200e67 (http://svn.webkit.org/repository/webkit/trunk@122948)
New snapshot that should fix the rendering issues recently introduced
Diffstat (limited to 'Source/JavaScriptCore/heap/MarkStack.cpp')
-rw-r--r--Source/JavaScriptCore/heap/MarkStack.cpp32
1 files changed, 14 insertions, 18 deletions
diff --git a/Source/JavaScriptCore/heap/MarkStack.cpp b/Source/JavaScriptCore/heap/MarkStack.cpp
index 9d9130026..9c679b0ed 100644
--- a/Source/JavaScriptCore/heap/MarkStack.cpp
+++ b/Source/JavaScriptCore/heap/MarkStack.cpp
@@ -515,9 +515,8 @@ void MarkStack::mergeOpaqueRoots()
void SlotVisitor::startCopying()
{
- ASSERT(!m_copyBlock);
- m_copyBlock = m_shared.m_copiedSpace->allocateBlockForCopyingPhase();
-}
+ ASSERT(!m_copiedAllocator.isValid());
+}
void* SlotVisitor::allocateNewSpace(void* ptr, size_t bytes)
{
@@ -528,18 +527,17 @@ void* SlotVisitor::allocateNewSpace(void* ptr, size_t bytes)
if (m_shared.m_copiedSpace->isPinned(ptr))
return 0;
+
+ void* result = 0; // Compilers don't realize that this will be assigned.
+ if (m_copiedAllocator.tryAllocate(bytes, &result))
+ return result;
+
+ m_shared.m_copiedSpace->doneFillingBlock(m_copiedAllocator.resetCurrentBlock());
+ m_copiedAllocator.setCurrentBlock(m_shared.m_copiedSpace->allocateBlockForCopyingPhase());
- // The only time it's possible to have a null copy block is if we have just started copying.
- if (!m_copyBlock)
- startCopying();
-
- if (!CopiedSpace::fitsInBlock(m_copyBlock, bytes)) {
- // We don't need to lock across these two calls because the master thread won't
- // call doneCopying() because this thread is considered active.
- m_shared.m_copiedSpace->doneFillingBlock(m_copyBlock);
- m_copyBlock = m_shared.m_copiedSpace->allocateBlockForCopyingPhase();
- }
- return CopiedSpace::allocateFromBlock(m_copyBlock, bytes);
+ CheckedBoolean didSucceed = m_copiedAllocator.tryAllocate(bytes, &result);
+ ASSERT(didSucceed);
+ return result;
}
ALWAYS_INLINE bool JSString::tryHashConstLock()
@@ -639,12 +637,10 @@ void SlotVisitor::copyAndAppend(void** ptr, size_t bytes, JSValue* values, unsig
void SlotVisitor::doneCopying()
{
- if (!m_copyBlock)
+ if (!m_copiedAllocator.isValid())
return;
- m_shared.m_copiedSpace->doneFillingBlock(m_copyBlock);
-
- m_copyBlock = 0;
+ m_shared.m_copiedSpace->doneFillingBlock(m_copiedAllocator.resetCurrentBlock());
}
void SlotVisitor::harvestWeakReferences()