ASSERTION FAILED: Heap::isMarked(cell) in SlotVisitor::appendToMarkStack(JSC::JSCell *)
authormsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Jul 2016 00:24:25 +0000 (00:24 +0000)
committermsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Jul 2016 00:24:25 +0000 (00:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=159588

Reviewed by Geoffrey Garen.

We were jettisoning a CodeBlock during GC that won't survive and its owning script
won't survive either.  We can't install any code on the owning script as that involves
a write barrier that will "pull" the script back into the remembered set.  Badness would
ensue.  Added an early return in CodeBlock::jettison() when we are garbage collecting
and the owning script isn't marked.

* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::jettison):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@203012 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecode/CodeBlock.cpp

index 3b1efd7..646f4fc 100644 (file)
@@ -1,3 +1,19 @@
+2016-07-08  Michael Saboff  <msaboff@apple.com>
+
+        ASSERTION FAILED: Heap::isMarked(cell) in SlotVisitor::appendToMarkStack(JSC::JSCell *)
+        https://bugs.webkit.org/show_bug.cgi?id=159588
+
+        Reviewed by Geoffrey Garen.
+
+        We were jettisoning a CodeBlock during GC that won't survive and its owning script
+        won't survive either.  We can't install any code on the owning script as that involves
+        a write barrier that will "pull" the script back into the remembered set.  Badness would
+        ensue.  Added an early return in CodeBlock::jettison() when we are garbage collecting
+        and the owning script isn't marked.
+
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::jettison):
+
 2016-07-08  Mark Lam  <mark.lam@apple.com>
 
         Move CallFrame header info from JSStack.h to CallFrame.h
index 80294d2..99da5f3 100644 (file)
@@ -3477,6 +3477,11 @@ void CodeBlock::jettison(Profiler::JettisonReason reason, ReoptimizationMode mod
         tallyFrequentExitSites();
 #endif // ENABLE(DFG_JIT)
 
+    // Jettison can happen during GC. We don't want to install code to a dead executable
+    // because that would add a dead object to the remembered set.
+    if (m_vm->heap.isCollecting() && !Heap::isMarked(ownerScriptExecutable()))
+        return;
+
     // This accomplishes (2).
     ownerScriptExecutable()->installCode(
         m_globalObject->vm(), alternative(), codeType(), specializationKind());