+JSObject* EvalExecutable::compileInternal(ExecState* exec, JSScope* scope, JITCode::JITType jitType, unsigned bytecodeIndex)
+{
+ SamplingRegion samplingRegion(samplingDescription(jitType));
+
+#if !ENABLE(JIT)
+ UNUSED_PARAM(jitType);
+ UNUSED_PARAM(bytecodeIndex);
+#endif
+ VM* vm = &exec->vm();
+ JSGlobalObject* lexicalGlobalObject = exec->lexicalGlobalObject();
+
+ if (!!m_evalCodeBlock) {
+ OwnPtr<EvalCodeBlock> newCodeBlock = adoptPtr(new EvalCodeBlock(CodeBlock::CopyParsedBlock, *m_evalCodeBlock));
+ newCodeBlock->setAlternative(static_pointer_cast<CodeBlock>(m_evalCodeBlock.release()));
+ m_evalCodeBlock = newCodeBlock.release();
+ } else {
+ UNUSED_PARAM(scope);
+ UNUSED_PARAM(vm);
+ UNUSED_PARAM(lexicalGlobalObject);
+ if (!lexicalGlobalObject->evalEnabled())
+ return throwError(exec, createEvalError(exec, lexicalGlobalObject->evalDisabledErrorMessage()));
+
+ JSObject* exception = 0;
+ UnlinkedEvalCodeBlock* unlinkedEvalCode = lexicalGlobalObject->createEvalCodeBlock(m_codeCache.get(), exec, scope, this, &exception);
+ if (!unlinkedEvalCode)
+ return exception;
+
+ OwnPtr<CodeBlock> previousCodeBlock = m_evalCodeBlock.release();
+ ASSERT((jitType == JITCode::bottomTierJIT()) == !previousCodeBlock);
+ m_unlinkedEvalCodeBlock.set(*vm, this, unlinkedEvalCode);
+ m_evalCodeBlock = adoptPtr(new EvalCodeBlock(this, unlinkedEvalCode, lexicalGlobalObject, source().provider(), scope->localDepth(), previousCodeBlock.release()));
+ m_evalCodeBlock->copyPostParseDataFromAlternative();
+ }
+
+#if ENABLE(JIT)
+ if (!prepareForExecution(exec, m_evalCodeBlock, m_jitCodeForCall, jitType, bytecodeIndex))
+ return 0;