fourthTier: Landing the initial FTL logic in a single commit to avoid spurious
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGOSRExit.h
index e7d4476..50bddd4 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2011, 2013 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 #if ENABLE(DFG_JIT)
 
 
 #if ENABLE(DFG_JIT)
 
+#include "CodeOrigin.h"
 #include "DFGCommon.h"
 #include "DFGCommon.h"
+#include "DFGExitProfile.h"
 #include "DFGGPRInfo.h"
 #include "DFGGPRInfo.h"
+#include "DFGOSRExitBase.h"
+#include "DFGValueRecoveryOverride.h"
 #include "MacroAssembler.h"
 #include "MacroAssembler.h"
+#include "MethodOfGettingAValueProfile.h"
+#include "Operands.h"
 #include "ValueProfile.h"
 #include "ValueProfile.h"
+#include "ValueRecovery.h"
 #include <wtf/Vector.h>
 
 namespace JSC { namespace DFG {
 
 class SpeculativeJIT;
 #include <wtf/Vector.h>
 
 namespace JSC { namespace DFG {
 
 class SpeculativeJIT;
+struct BasicBlock;
+struct Node;
 
 // This enum describes the types of additional recovery that
 // may need be performed should a speculation check fail.
 
 // This enum describes the types of additional recovery that
 // may need be performed should a speculation check fail.
@@ -76,57 +85,35 @@ private:
 //
 // This structure describes how to exit the speculative path by
 // going into baseline code.
 //
 // This structure describes how to exit the speculative path by
 // going into baseline code.
-struct OSRExit {
-    OSRExit(JSValueSource, ValueProfile*, MacroAssembler::Jump, SpeculativeJIT*, unsigned recoveryIndex = 0);
+struct OSRExit : public OSRExitBase {
+    OSRExit(ExitKind, JSValueSource, MethodOfGettingAValueProfile, SpeculativeJIT*, unsigned streamIndex, unsigned recoveryIndex = UINT_MAX);
     
     
-    JSValueSource m_jsValueSource;
-    ValueProfile* m_valueProfile;
+    MacroAssemblerCodeRef m_code;
     
     
-    MacroAssembler::Jump m_check;
-    NodeIndex m_nodeIndex;
-    CodeOrigin m_codeOrigin;
+    JSValueSource m_jsValueSource;
+    MethodOfGettingAValueProfile m_valueProfile;
+
+    unsigned m_patchableCodeOffset;
     
     unsigned m_recoveryIndex;
     
     unsigned m_recoveryIndex;
+    unsigned m_watchpointIndex;
     
     
-    // Convenient way of iterating over ValueRecoveries while being
-    // generic over argument versus variable.
-    int numberOfRecoveries() const { return m_arguments.size() + m_variables.size(); }
-    const ValueRecovery& valueRecovery(int index) const
-    {
-        if (index < (int)m_arguments.size())
-            return m_arguments[index];
-        return m_variables[index - m_arguments.size()];
-    }
-    bool isArgument(int index) const { return index < (int)m_arguments.size(); }
-    bool isVariable(int index) const { return !isArgument(index); }
-    int argumentForIndex(int index) const
-    {
-        return index;
-    }
-    int variableForIndex(int index) const
-    {
-        return index - m_arguments.size();
-    }
-    int operandForArgument(int argument) const
-    {
-        return argument - m_arguments.size() - RegisterFile::CallFrameHeaderSize;
-    }
-    int operandForIndex(int index) const
-    {
-        if (index < (int)m_arguments.size())
-            return operandForArgument(index);
-        return index - m_arguments.size();
-    }
-    
-#ifndef NDEBUG
-    void dump(FILE* out) const;
-#endif
+    void setPatchableCodeOffset(MacroAssembler::PatchableJump);
+    MacroAssembler::Jump getPatchableCodeOffsetAsJump() const;
+    CodeLocationJump codeLocationForRepatch(CodeBlock*) const;
+    void correctJump(LinkBuffer&);
     
     
-    Vector<ValueRecovery, 0> m_arguments;
-    Vector<ValueRecovery, 0> m_variables;
+    void convertToForward(BasicBlock*, Node*, unsigned nodeIndex, const ValueRecovery&);
+
+    unsigned m_streamIndex;
     int m_lastSetOperand;
     int m_lastSetOperand;
+    
+    RefPtr<ValueRecoveryOverride> m_valueRecoveryOverride;
+};
+
+struct SpeculationFailureDebugInfo {
+    CodeBlock* codeBlock;
 };
 };
-typedef SegmentedVector<OSRExit, 16> OSRExitVector;
 
 } } // namespace JSC::DFG
 
 
 } } // namespace JSC::DFG