FTL boolify() UntypedUse is wrong in the masquerades-as-undefined case
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Jun 2015 19:17:40 +0000 (19:17 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Jun 2015 19:17:40 +0000 (19:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=146002

Reviewed by Darin Adler.

* ftl/FTLLowerDFGToLLVM.cpp: Put this in an anonymous namespace. We should have done that all along. It makes it easier to add debug code.
(JSC::FTL::DFG::LowerDFGToLLVM::boolify): Fix the bug.
* tests/stress/logical-not-masquerades.js: Added. This test creates a masquerader so that the watchpoint is invalid. Previously this would fail for the normal object cases.
(foo):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp
Source/JavaScriptCore/tests/stress/logical-not-masquerades.js [new file with mode: 0644]

index ac0e348..7a1ea43 100644 (file)
@@ -1,3 +1,15 @@
+2015-06-15  Filip Pizlo  <fpizlo@apple.com>
+
+        FTL boolify() UntypedUse is wrong in the masquerades-as-undefined case
+        https://bugs.webkit.org/show_bug.cgi?id=146002
+
+        Reviewed by Darin Adler.
+
+        * ftl/FTLLowerDFGToLLVM.cpp: Put this in an anonymous namespace. We should have done that all along. It makes it easier to add debug code.
+        (JSC::FTL::DFG::LowerDFGToLLVM::boolify): Fix the bug.
+        * tests/stress/logical-not-masquerades.js: Added. This test creates a masquerader so that the watchpoint is invalid. Previously this would fail for the normal object cases.
+        (foo):
+
 2015-06-16  Andreas Kling  <akling@apple.com>
 
         [JSC] Pre-bake final Structure for RegExp matches arrays.
index 30c45de..2572f7a 100644 (file)
@@ -63,7 +63,9 @@ namespace JSC { namespace FTL {
 
 using namespace DFG;
 
-static std::atomic<int> compileCounter;
+namespace {
+
+std::atomic<int> compileCounter;
 
 #if ASSERT_DISABLED
 NO_RETURN_DUE_TO_CRASH static void ftlUnreachable()
@@ -6301,7 +6303,7 @@ private:
             else {
                 LBasicBlock masqueradesCase = FTL_NEW_BLOCK(m_out, ("Boolify untyped masquerades case"));
                 
-                results.append(m_out.anchor(m_out.booleanFalse));
+                results.append(m_out.anchor(m_out.booleanTrue));
                 
                 m_out.branch(
                     m_out.testIsZero8(
@@ -8660,6 +8662,8 @@ private:
     unsigned m_tbaaStructKind;
 };
 
+} // anonymous namespace
+
 void lowerDFGToLLVM(State& state)
 {
     LowerDFGToLLVM lowering(state);
diff --git a/Source/JavaScriptCore/tests/stress/logical-not-masquerades.js b/Source/JavaScriptCore/tests/stress/logical-not-masquerades.js
new file mode 100644 (file)
index 0000000..0fd59ba
--- /dev/null
@@ -0,0 +1,33 @@
+function foo(value) {
+    return !!value;
+}
+
+noInline(foo);
+
+var tests = [
+    [0, false],
+    [1, true],
+    [0/0, false],
+    [0/-1, false],
+    [0.0, false],
+    ["", false],
+    ["f", true],
+    ["hello", true],
+    [{}, true],
+    [[], true],
+    [null, false],
+    [void 0, false],
+    [false, false],
+    [true, true],
+    [makeMasquerader(), false]
+];
+
+for (var i = 0; i < 10000; ++i) {
+    for (var j = 0; j < tests.length; ++j) {
+        var input = tests[j][0];
+        var expected = tests[j][1];
+        var result = foo(input);
+        if (result !== expected)
+            throw "Error: bad result for " + input + ": " + result;
+    }
+}