Incorrect assertion in DFG::Graph::uncheckedActivationRegisterFor()
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 31 May 2013 22:08:16 +0000 (22:08 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 31 May 2013 22:08:16 +0000 (22:08 +0000)
<rdar://problem/13989324>

Rubber stamped by Mark Hahnenberg.

This has a bogus assertion that checks that the passed CodeOrigin doesn't have
an inline call frame. This was well intentioned in the sense that it is true
that inlined call frames wouldn't have an activation register. But that doesn't
mean that people won't ask. Removing the assertion fixes a debug-only crash and
has no impact on production code. This change adds a comment to that effect.

* dfg/DFGGraph.h:
(JSC::DFG::Graph::uncheckedActivationRegisterFor):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/dfg/DFGGraph.h

index c563c1c..abc08a8 100644 (file)
@@ -1,3 +1,19 @@
+2013-05-31  Filip Pizlo  <fpizlo@apple.com>
+
+        Incorrect assertion in DFG::Graph::uncheckedActivationRegisterFor()
+        <rdar://problem/13989324>
+
+        Rubber stamped by Mark Hahnenberg.
+        
+        This has a bogus assertion that checks that the passed CodeOrigin doesn't have
+        an inline call frame. This was well intentioned in the sense that it is true
+        that inlined call frames wouldn't have an activation register. But that doesn't
+        mean that people won't ask. Removing the assertion fixes a debug-only crash and
+        has no impact on production code. This change adds a comment to that effect.
+
+        * dfg/DFGGraph.h:
+        (JSC::DFG::Graph::uncheckedActivationRegisterFor):
+
 2013-05-31  Julien Brianceau  <jbrianceau@nds.com>
 
         [sh4] Fix Overflow case of branchMul32 in baseline JIT.
index db41a6f..3e4e4b5 100644 (file)
@@ -410,9 +410,14 @@ public:
             codeOrigin.inlineCallFrame->stackOffset;
     }
     
-    int uncheckedActivationRegisterFor(const CodeOrigin& codeOrigin)
-    {
-        ASSERT_UNUSED(codeOrigin, !codeOrigin.inlineCallFrame);
+    int uncheckedActivationRegisterFor(const CodeOrigin&)
+    {
+        // This will ignore CodeOrigin because we don't inline code that uses activations.
+        // Hence for inlined call frames it will return the outermost code block's
+        // activation register. This method is only used to compare the result to a local
+        // to see if we're mucking with the activation register. Hence if we return the
+        // "wrong" activation register for the frame then it will compare false, which is
+        // what we wanted.
         return m_codeBlock->uncheckedActivationRegister();
     }