diff options
Diffstat (limited to 'Source/JavaScriptCore/jit/JITDriver.h')
-rw-r--r-- | Source/JavaScriptCore/jit/JITDriver.h | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/Source/JavaScriptCore/jit/JITDriver.h b/Source/JavaScriptCore/jit/JITDriver.h index b204c7737..66cf51925 100644 --- a/Source/JavaScriptCore/jit/JITDriver.h +++ b/Source/JavaScriptCore/jit/JITDriver.h @@ -38,7 +38,7 @@ namespace JSC { template<typename CodeBlockType> -inline bool jitCompileIfAppropriate(JSGlobalData& globalData, OwnPtr<CodeBlockType>& codeBlock, JITCode& jitCode, JITCode::JITType jitType) +inline bool jitCompileIfAppropriate(JSGlobalData& globalData, OwnPtr<CodeBlockType>& codeBlock, JITCode& jitCode, JITCode::JITType jitType, JITCompilationEffort effort) { if (jitType == codeBlock->getJITType()) return true; @@ -48,6 +48,8 @@ inline bool jitCompileIfAppropriate(JSGlobalData& globalData, OwnPtr<CodeBlockTy codeBlock->unlinkIncomingCalls(); + JITCode oldJITCode = jitCode; + bool dfgCompiled = false; if (jitType == JITCode::DFGJIT) dfgCompiled = DFG::tryCompile(globalData, codeBlock.get(), jitCode); @@ -57,16 +59,21 @@ inline bool jitCompileIfAppropriate(JSGlobalData& globalData, OwnPtr<CodeBlockTy } else { if (codeBlock->alternative()) { codeBlock = static_pointer_cast<CodeBlockType>(codeBlock->releaseAlternative()); + jitCode = oldJITCode; + return false; + } + jitCode = JIT::compile(&globalData, codeBlock.get(), effort); + if (!jitCode) { + jitCode = oldJITCode; return false; } - jitCode = JIT::compile(&globalData, codeBlock.get()); } codeBlock->setJITCode(jitCode, MacroAssemblerCodePtr()); return true; } -inline bool jitCompileFunctionIfAppropriate(JSGlobalData& globalData, OwnPtr<FunctionCodeBlock>& codeBlock, JITCode& jitCode, MacroAssemblerCodePtr& jitCodeWithArityCheck, SharedSymbolTable*& symbolTable, JITCode::JITType jitType) +inline bool jitCompileFunctionIfAppropriate(JSGlobalData& globalData, OwnPtr<FunctionCodeBlock>& codeBlock, JITCode& jitCode, MacroAssemblerCodePtr& jitCodeWithArityCheck, SharedSymbolTable*& symbolTable, JITCode::JITType jitType, JITCompilationEffort effort) { if (jitType == codeBlock->getJITType()) return true; @@ -76,6 +83,9 @@ inline bool jitCompileFunctionIfAppropriate(JSGlobalData& globalData, OwnPtr<Fun codeBlock->unlinkIncomingCalls(); + JITCode oldJITCode = jitCode; + MacroAssemblerCodePtr oldJITCodeWithArityCheck = jitCodeWithArityCheck; + bool dfgCompiled = false; if (jitType == JITCode::DFGJIT) dfgCompiled = DFG::tryCompileFunction(globalData, codeBlock.get(), jitCode, jitCodeWithArityCheck); @@ -86,9 +96,16 @@ inline bool jitCompileFunctionIfAppropriate(JSGlobalData& globalData, OwnPtr<Fun if (codeBlock->alternative()) { codeBlock = static_pointer_cast<FunctionCodeBlock>(codeBlock->releaseAlternative()); symbolTable = codeBlock->sharedSymbolTable(); + jitCode = oldJITCode; + jitCodeWithArityCheck = oldJITCodeWithArityCheck; + return false; + } + jitCode = JIT::compile(&globalData, codeBlock.get(), effort, &jitCodeWithArityCheck); + if (!jitCode) { + jitCode = oldJITCode; + jitCodeWithArityCheck = oldJITCodeWithArityCheck; return false; } - jitCode = JIT::compile(&globalData, codeBlock.get(), &jitCodeWithArityCheck); } codeBlock->setJITCode(jitCode, jitCodeWithArityCheck); |