Revision: 7552
Author:   [email protected]
Date:     Thu Apr  7 23:54:50 2011
Log: Add ToBoolean-conversion of constants in Crankshaft and use it when generating a branch based on a constant.
Review URL: http://codereview.chromium.org/6801050
http://code.google.com/p/v8/source/detail?r=7552

Modified:
 /branches/bleeding_edge/src/arm/lithium-arm.cc
 /branches/bleeding_edge/src/hydrogen-instructions.cc
 /branches/bleeding_edge/src/hydrogen-instructions.h
 /branches/bleeding_edge/src/ia32/lithium-ia32.cc
 /branches/bleeding_edge/src/x64/lithium-x64.cc

=======================================
--- /branches/bleeding_edge/src/arm/lithium-arm.cc      Thu Apr  7 02:51:25 2011
+++ /branches/bleeding_edge/src/arm/lithium-arm.cc      Thu Apr  7 23:54:50 2011
@@ -1114,9 +1114,9 @@
       return new LIsConstructCallAndBranch(TempRegister());
     } else {
       if (v->IsConstant()) {
-        if (HConstant::cast(v)->handle()->IsTrue()) {
+        if (HConstant::cast(v)->ToBoolean()) {
           return new LGoto(instr->FirstSuccessor()->block_id());
-        } else if (HConstant::cast(v)->handle()->IsFalse()) {
+        } else {
           return new LGoto(instr->SecondSuccessor()->block_id());
         }
       }
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.cc Mon Apr 4 08:03:34 2011 +++ /branches/bleeding_edge/src/hydrogen-instructions.cc Thu Apr 7 23:54:50 2011
@@ -1050,6 +1050,23 @@
 }


+bool HConstant::ToBoolean() const {
+  // Converts the constant's boolean value according to
+  // ECMAScript section 9.2 ToBoolean conversion.
+  if (HasInteger32Value()) return Integer32Value() != 0;
+  if (HasDoubleValue()) {
+    double v = DoubleValue();
+    return v != 0 && !isnan(v);
+  }
+  if (handle()->IsTrue()) return true;
+  if (handle()->IsFalse()) return false;
+  if (handle()->IsUndefined()) return false;
+  if (handle()->IsNull()) return false;
+  if (handle()->IsString() &&
+      String::cast(*handle())->length() == 0) return false;
+  return true;
+}
+
 void HConstant::PrintDataTo(StringStream* stream) {
   handle()->ShortPrint(stream);
 }
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.h Tue Apr 5 02:55:18 2011 +++ /branches/bleeding_edge/src/hydrogen-instructions.h Thu Apr 7 23:54:50 2011
@@ -1960,6 +1960,8 @@
     return double_value_;
   }
   bool HasStringValue() const { return handle_->IsString(); }
+
+  bool ToBoolean() const;

   virtual intptr_t Hashcode() {
     ASSERT(!HEAP->allow_allocation(false));
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.cc Tue Apr 5 02:55:18 2011 +++ /branches/bleeding_edge/src/ia32/lithium-ia32.cc Thu Apr 7 23:54:50 2011
@@ -1120,9 +1120,9 @@
       return new LIsConstructCallAndBranch(TempRegister());
     } else {
       if (v->IsConstant()) {
-        if (HConstant::cast(v)->handle()->IsTrue()) {
+        if (HConstant::cast(v)->ToBoolean()) {
           return new LGoto(instr->FirstSuccessor()->block_id());
-        } else if (HConstant::cast(v)->handle()->IsFalse()) {
+        } else {
           return new LGoto(instr->SecondSuccessor()->block_id());
         }
       }
=======================================
--- /branches/bleeding_edge/src/x64/lithium-x64.cc      Wed Apr  6 01:41:28 2011
+++ /branches/bleeding_edge/src/x64/lithium-x64.cc      Thu Apr  7 23:54:50 2011
@@ -1114,9 +1114,9 @@
       return new LIsConstructCallAndBranch(TempRegister());
     } else {
       if (v->IsConstant()) {
-        if (HConstant::cast(v)->handle()->IsTrue()) {
+        if (HConstant::cast(v)->ToBoolean()) {
           return new LGoto(instr->FirstSuccessor()->block_id());
-        } else if (HConstant::cast(v)->handle()->IsFalse()) {
+        } else {
           return new LGoto(instr->SecondSuccessor()->block_id());
         }
       }

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to