Fix Bug 16871: Crash when loading apple.com/startpage
authoraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 14 Jan 2008 19:02:46 +0000 (19:02 +0000)
committeraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 14 Jan 2008 19:02:46 +0000 (19:02 +0000)
        <http://bugs.webkit.org/show_bug.cgi?id=16871>
        <rdar://problem/5686670>

        Patch written by Darin, reviewed by me.

        * kjs/ExecState.cpp:
        (KJS::ExecState::mark): Call ActivationImp::markChildren if our
        m_activation is on the stack. This is what ScopeChain::mark also does,
        but apparently in some cases it's possible for an ExecState's
        ActivationImp to not be in any ScopeChain.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/ExecState.cpp

index 5bfd3da..00e1c13 100644 (file)
@@ -1,3 +1,18 @@
+2008-01-14  Adam Roben  <aroben@apple.com>
+
+        Fix Bug 16871: Crash when loading apple.com/startpage
+
+        <http://bugs.webkit.org/show_bug.cgi?id=16871>
+        <rdar://problem/5686670>
+
+        Patch written by Darin, reviewed by me.
+
+        * kjs/ExecState.cpp:
+        (KJS::ExecState::mark): Call ActivationImp::markChildren if our
+        m_activation is on the stack. This is what ScopeChain::mark also does,
+        but apparently in some cases it's possible for an ExecState's
+        ActivationImp to not be in any ScopeChain.
+
 2008-01-14  Kevin McCullough  <kmccullough@apple.com>
 
         Reviewed by Oliver.
index df6d9fa..a2ec5dd 100644 (file)
@@ -127,6 +127,13 @@ void ExecState::mark()
 {
     for (ExecState* exec = this; exec; exec = exec->m_callingExec)
         exec->m_scopeChain.mark();
+
+    // FIXME: It is surprising that this code is necessary, since at first
+    // glance it seems that all ActivationImps should be in a ScopeChain.
+    // However, <http://bugs.webkit.org/show_bug.cgi?id=16871> proves that is
+    // not the case.
+    if (m_activation && m_activation->isOnStack())
+        m_activation->markChildren();
 }
 
 JSGlobalObject* ExecState::lexicalGlobalObject() const