+ }
+
+ static bool isLowerTier(JITType expectedLower, JITType expectedHigher)
+ {
+ RELEASE_ASSERT(isExecutableScript(expectedLower));
+ RELEASE_ASSERT(isExecutableScript(expectedHigher));
+ return expectedLower < expectedHigher;
+ }
+
+ static bool isHigherTier(JITType expectedHigher, JITType expectedLower)
+ {
+ return isLowerTier(expectedLower, expectedHigher);
+ }
+
+ static bool isLowerOrSameTier(JITType expectedLower, JITType expectedHigher)
+ {
+ return !isHigherTier(expectedLower, expectedHigher);
+ }
+
+ static bool isHigherOrSameTier(JITType expectedHigher, JITType expectedLower)
+ {
+ return isLowerOrSameTier(expectedLower, expectedHigher);
+ }
+
+ static bool isOptimizingJIT(JITType jitType)
+ {
+ return jitType == DFGJIT || jitType == FTLJIT;
+ }
+
+ static bool isBaselineCode(JITType jitType)
+ {
+ return jitType == InterpreterThunk || jitType == BaselineJIT;
+ }
+
+protected:
+ JITCode(JITType);
+
+public:
+ virtual ~JITCode();
+
+ JITType jitType() const
+ {
+ return m_jitType;
+ }
+
+ template<typename PointerType>
+ static JITType jitTypeFor(PointerType jitCode)
+ {
+ if (!jitCode)
+ return None;
+ return jitCode->jitType();
+ }
+
+ virtual CodePtr addressForCall(VM&, ExecutableBase*, ArityCheckMode, RegisterPreservationMode) = 0;
+ virtual void* executableAddressAtOffset(size_t offset) = 0;
+ void* executableAddress() { return executableAddressAtOffset(0); }
+ virtual void* dataAddressAtOffset(size_t offset) = 0;
+ virtual unsigned offsetOf(void* pointerIntoCode) = 0;
+
+ virtual DFG::CommonData* dfgCommon();
+ virtual DFG::JITCode* dfg();
+ virtual FTL::JITCode* ftl();
+ virtual FTL::ForOSREntryJITCode* ftlForOSREntry();
+
+ JSValue execute(VM*, ProtoCallFrame*);
+
+ void* start() { return dataAddressAtOffset(0); }
+ virtual size_t size() = 0;
+ void* end() { return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(start()) + size()); }
+
+ virtual bool contains(void*) = 0;