[ARM64] static_cast<int32_t>() in BinaryOpNode::emitBytecode() prevents op_unsigned...
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Oct 2017 07:35:16 +0000 (07:35 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Oct 2017 07:35:16 +0000 (07:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=178379

Reviewed by Saam Barati.

We reuse jsNumber's checking mechanism here to precisely check the generated number is within uint32_t
in bytecode compiler. This is reasonable since the NumberNode will generate the exact this JSValue.

* bytecompiler/NodesCodegen.cpp:
(JSC::BinaryOpNode::emitBytecode):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

index 478652d..cab14f8 100644 (file)
@@ -1,5 +1,18 @@
 2017-10-20  Yusuke Suzuki  <utatane.tea@gmail.com>
 
+        [ARM64] static_cast<int32_t>() in BinaryOpNode::emitBytecode() prevents op_unsigned emission
+        https://bugs.webkit.org/show_bug.cgi?id=178379
+
+        Reviewed by Saam Barati.
+
+        We reuse jsNumber's checking mechanism here to precisely check the generated number is within uint32_t
+        in bytecode compiler. This is reasonable since the NumberNode will generate the exact this JSValue.
+
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::BinaryOpNode::emitBytecode):
+
+2017-10-20  Yusuke Suzuki  <utatane.tea@gmail.com>
+
         [JSC] ScriptFetcher should be notified directly from module pipeline
         https://bugs.webkit.org/show_bug.cgi?id=178340
 
index 355b4a7..544c6d2 100644 (file)
@@ -1993,8 +1993,8 @@ RegisterID* BinaryOpNode::emitBytecode(BytecodeGenerator& generator, RegisterID*
             if (node->isBinaryOpNode() && static_cast<BinaryOpNode*>(node)->opcodeID() == op_urshift)
                 return UInt32Result::UInt32;
             if (node->isNumber() && static_cast<NumberNode*>(node)->isIntegerNode()) {
-                int32_t value = static_cast<int32_t>(static_cast<IntegerNode*>(node)->value());
-                if (value >= 0)
+                auto value = jsNumber(static_cast<NumberNode*>(node)->value());
+                if (value.isInt32() && value.asInt32() >= 0)
                     return UInt32Result::Constant;
             }
             return std::nullopt;