DFG should assert that argument value recoveries can only be
[WebKit-https.git] / Source / JavaScriptCore / bytecode / ValueRecovery.h
index 5c9fd0a0f200586609a0a576fefe97b2dd1898ac..007c6d3b7171d4b7ab0c2541f1040c6e8c90dba1 100644 (file)
 #include "JSValue.h"
 #include "MacroAssembler.h"
 #include "VirtualRegister.h"
-#include <wtf/Platform.h>
-
-#ifndef NDEBUG
 #include <stdio.h>
-#endif
+#include <wtf/Platform.h>
 
 namespace JSC {
 
@@ -62,6 +59,8 @@ enum ValueRecoveryTechnique {
     // It's in the register file, at a different location, and it's unboxed.
     Int32DisplacedInRegisterFile,
     DoubleDisplacedInRegisterFile,
+    CellDisplacedInRegisterFile,
+    BooleanDisplacedInRegisterFile,
     // It's a constant.
     Constant,
     // Don't know how to recover it.
@@ -166,6 +165,14 @@ public:
             result.m_technique = DoubleDisplacedInRegisterFile;
             break;
 
+        case DataFormatCell:
+            result.m_technique = CellDisplacedInRegisterFile;
+            break;
+            
+        case DataFormatBoolean:
+            result.m_technique = BooleanDisplacedInRegisterFile;
+            break;
+            
         default:
             ASSERT(dataFormat != DataFormatNone && dataFormat != DataFormatStorage);
             result.m_technique = DisplacedInRegisterFile;
@@ -185,6 +192,8 @@ public:
     
     ValueRecoveryTechnique technique() const { return m_technique; }
     
+    bool isConstant() const { return m_technique == Constant; }
+    
     bool isInRegisters() const
     {
         switch (m_technique) {
@@ -201,6 +210,20 @@ public:
         }
     }
     
+    bool isAlreadyInRegisterFile() const
+    {
+        switch (technique()) {
+        case AlreadyInRegisterFile:
+        case AlreadyInRegisterFileAsUnboxedInt32:
+        case AlreadyInRegisterFileAsUnboxedCell:
+        case AlreadyInRegisterFileAsUnboxedBoolean:
+        case AlreadyInRegisterFileAsUnboxedDouble:
+            return true;
+        default:
+            return false;
+        }
+    }
+    
     MacroAssembler::RegisterID gpr() const
     {
         ASSERT(m_technique == InGPR || m_technique == UnboxedInt32InGPR || m_technique == UnboxedBooleanInGPR || m_technique == UInt32InGPR);
@@ -229,7 +252,7 @@ public:
     
     VirtualRegister virtualRegister() const
     {
-        ASSERT(m_technique == DisplacedInRegisterFile || m_technique == Int32DisplacedInRegisterFile || m_technique == DoubleDisplacedInRegisterFile);
+        ASSERT(m_technique == DisplacedInRegisterFile || m_technique == Int32DisplacedInRegisterFile || m_technique == DoubleDisplacedInRegisterFile || m_technique == CellDisplacedInRegisterFile || m_technique == BooleanDisplacedInRegisterFile);
         return m_source.virtualReg;
     }
     
@@ -239,7 +262,6 @@ public:
         return JSValue::decode(m_source.constant);
     }
     
-#ifndef NDEBUG
     void dump(FILE* out) const
     {
         switch (technique()) {
@@ -287,6 +309,12 @@ public:
         case DoubleDisplacedInRegisterFile:
             fprintf(out, "*double(%d)", virtualRegister());
             break;
+        case CellDisplacedInRegisterFile:
+            fprintf(out, "*cell(%d)", virtualRegister());
+            break;
+        case BooleanDisplacedInRegisterFile:
+            fprintf(out, "*bool(%d)", virtualRegister());
+            break;
         case Constant:
             fprintf(out, "[%s]", constant().description());
             break;
@@ -298,7 +326,6 @@ public:
             break;
         }
     }
-#endif
     
 private:
     ValueRecoveryTechnique m_technique;