Title: [181181] branches/safari-600.1.4.15-branch/Source/_javascript_Core

Diff

Modified: branches/safari-600.1.4.15-branch/Source/_javascript_Core/ChangeLog (181180 => 181181)


--- branches/safari-600.1.4.15-branch/Source/_javascript_Core/ChangeLog	2015-03-06 22:01:58 UTC (rev 181180)
+++ branches/safari-600.1.4.15-branch/Source/_javascript_Core/ChangeLog	2015-03-06 22:25:05 UTC (rev 181181)
@@ -1,3 +1,29 @@
+2015-03-06  Lucas Forschler  <lforsch...@apple.com>
+
+        Merge r181030
+
+    2015-03-04  Filip Pizlo  <fpi...@apple.com>
+
+            [FTL] inlined GetMyArgumentByVal with no arguments passed causes instant crash
+            https://bugs.webkit.org/show_bug.cgi?id=141180
+            rdar://problem/19677552
+
+            Reviewed by Benjamin Poulain.
+
+            If we do a GetMyArgumentByVal on an inlined call frame that has no arguments, then the
+            bounds check already terminates execution. This means we can skip the part where we
+            previously did an out-of-bound array access on the inlined call frame arguments vector.
+
+            * ftl/FTLLowerDFGToLLVM.cpp:
+            (JSC::FTL::LowerDFGToLLVM::safelyInvalidateAfterTermination):
+            (JSC::FTL::LowerDFGToLLVM::compileGetMyArgumentByVal):
+            (JSC::FTL::LowerDFGToLLVM::terminate):
+            (JSC::FTL::LowerDFGToLLVM::didAlreadyTerminate):
+            (JSC::FTL::LowerDFGToLLVM::crash):
+            * tests/stress/get-my-argument-by-val-inlined-no-formal-parameters.js: Added.
+            (foo):
+            (bar):
+
 2015-03-04  Matthew Hanson  <matthew_han...@apple.com>
 
         Merge r180101. rdar://problem/19913017

Modified: branches/safari-600.1.4.15-branch/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp (181180 => 181181)


--- branches/safari-600.1.4.15-branch/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2015-03-06 22:01:58 UTC (rev 181180)
+++ branches/safari-600.1.4.15-branch/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2015-03-06 22:25:05 UTC (rev 181181)
@@ -1964,9 +1964,14 @@
         }
         
         TypedPointer base;
-        if (codeOrigin.inlineCallFrame)
-            base = addressFor(codeOrigin.inlineCallFrame->arguments[1].virtualRegister());
-        else
+        if (codeOrigin.inlineCallFrame) {
+            VirtualRegister reg;
+            if (codeOrigin.inlineCallFrame->arguments.size() <= 1)
+                reg = virtualRegisterForLocal(0); // Doesn't matter what we do since we would have exited anyway.
+            else
+                reg = codeOrigin.inlineCallFrame->arguments[1].virtualRegister();
+            base = addressFor(reg);
+        } else
             base = addressFor(virtualRegisterForArgument(1));
         
         LValue pointer = m_out.baseIndex(

Copied: branches/safari-600.1.4.15-branch/Source/_javascript_Core/tests/stress/get-my-argument-by-val-inlined-no-formal-parameters.js (from rev 181030, branches/safari-600.5-branch/Source/_javascript_Core/tests/stress/get-my-argument-by-val-inlined-no-formal-parameters.js) (0 => 181181)


--- branches/safari-600.1.4.15-branch/Source/_javascript_Core/tests/stress/get-my-argument-by-val-inlined-no-formal-parameters.js	                        (rev 0)
+++ branches/safari-600.1.4.15-branch/Source/_javascript_Core/tests/stress/get-my-argument-by-val-inlined-no-formal-parameters.js	2015-03-06 22:25:05 UTC (rev 181181)
@@ -0,0 +1,33 @@
+var index;
+
+function foo() {
+    if (index >= 0)
+        return arguments[index];
+    else
+        return 13;
+}
+
+function bar() {
+    return foo();
+}
+
+noInline(bar);
+
+for (var i = 0; i < 100; ++i) {
+    index = i & 1;
+    var result = foo(42, 53);
+    if (result != [42, 53][index])
+        throw "Error: bad result in first loop: " + result;
+}
+
+for (var i = 0; i < 100000; ++i) {
+    index = -(i & 1) - 1;
+    var result = bar();
+    if (result !== 13)
+        throw "Error: bad result in second loop: " + result;
+}
+
+index = 0;
+var result = bar();
+if (result !== void 0)
+    throw "Error: bad result at end: " + result;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to