Index: src/interpreter/interpreter.cc |
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
index acc69c43967019bac0b29301ed753a55330c5c41..f39910356a967a3299438f2c1bb702588fc257dc 100644 |
--- a/src/interpreter/interpreter.cc |
+++ b/src/interpreter/interpreter.cc |
@@ -30,6 +30,23 @@ typedef InterpreterAssembler::Arg Arg; |
#define __ assembler-> |
+class InterpreterCompilationJob final : public CompilationJob { |
+ public: |
+ explicit InterpreterCompilationJob(CompilationInfo* info); |
+ |
+ protected: |
+ Status PrepareJobImpl() final; |
+ Status ExecuteJobImpl() final; |
+ Status FinalizeJobImpl() final; |
+ |
+ private: |
+ BytecodeGenerator* generator() { return generator_.get(); } |
+ |
+ std::unique_ptr<BytecodeGenerator> generator_; |
Michael Starzinger
2016/08/16 08:46:40
Would it be possible to just have BytecodeGenerato
rmcilroy
2016/08/16 11:10:44
Done.
|
+ |
+ DISALLOW_COPY_AND_ASSIGN(InterpreterCompilationJob); |
+}; |
+ |
Interpreter::Interpreter(Isolate* isolate) : isolate_(isolate) { |
memset(dispatch_table_, 0, sizeof(dispatch_table_)); |
} |
@@ -132,6 +149,40 @@ int Interpreter::InterruptBudget() { |
return FLAG_interrupt_budget * kCodeSizeMultiplier; |
} |
+InterpreterCompilationJob::InterpreterCompilationJob(CompilationInfo* info) |
+ : CompilationJob(info, "Ignition"), generator_() {} |
+ |
+InterpreterCompilationJob::Status InterpreterCompilationJob::PrepareJobImpl() { |
+ generator_.reset(new BytecodeGenerator(info())); |
+ return SUCCEEDED; |
+} |
+ |
+InterpreterCompilationJob::Status InterpreterCompilationJob::ExecuteJobImpl() { |
+ generator()->GenerateBytecode(); |
+ |
+ if (generator()->HasStackOverflow()) { |
+ return FAILED; |
+ } |
+ return SUCCEEDED; |
+} |
+ |
+InterpreterCompilationJob::Status InterpreterCompilationJob::FinalizeJobImpl() { |
+ Handle<BytecodeArray> bytecodes = generator()->FinalizeBytecode(); |
+ if (generator()->HasStackOverflow()) { |
+ return FAILED; |
+ } |
+ |
+ if (FLAG_print_bytecode) { |
+ OFStream os(stdout); |
+ bytecodes->Print(os); |
+ os << std::flush; |
+ } |
+ |
+ info()->SetBytecodeArray(bytecodes); |
+ info()->SetCode(info()->isolate()->builtins()->InterpreterEntryTrampoline()); |
+ return SUCCEEDED; |
+} |
+ |
bool Interpreter::MakeBytecode(CompilationInfo* info) { |
RuntimeCallTimerScope runtimeTimer(info->isolate(), |
&RuntimeCallStats::CompileIgnition); |
@@ -156,20 +207,10 @@ bool Interpreter::MakeBytecode(CompilationInfo* info) { |
} |
#endif // DEBUG |
- BytecodeGenerator generator(info); |
- Handle<BytecodeArray> bytecodes = generator.MakeBytecode(); |
- |
- if (generator.HasStackOverflow()) return false; |
- |
- if (FLAG_print_bytecode) { |
- OFStream os(stdout); |
- bytecodes->Print(os); |
- os << std::flush; |
- } |
- |
- info->SetBytecodeArray(bytecodes); |
- info->SetCode(info->isolate()->builtins()->InterpreterEntryTrampoline()); |
- return true; |
+ InterpreterCompilationJob job(info); |
+ if (job.PrepareJob() != CompilationJob::SUCCEEDED) return false; |
+ if (job.ExecuteJob() != CompilationJob::SUCCEEDED) return false; |
+ return job.FinalizeJob() == CompilationJob::SUCCEEDED; |
} |
bool Interpreter::IsDispatchTableInitialized() { |