Chromium Code Reviews| Index: runtime/vm/compiler.cc |
| =================================================================== |
| --- runtime/vm/compiler.cc (revision 44266) |
| +++ runtime/vm/compiler.cc (working copy) |
| @@ -73,13 +73,14 @@ |
| // separate helpers functions & `optimizing` args. |
| class CompilationPipeline : public ZoneAllocated { |
| public: |
| - static CompilationPipeline* New(Isolate* isolate, const Function& function); |
| + static CompilationPipeline* New(Zone* zone, const Function& function); |
| virtual void ParseFunction(ParsedFunction* parsed_function) = 0; |
| virtual FlowGraph* BuildFlowGraph( |
| ParsedFunction* parsed_function, |
| const ZoneGrowableArray<const ICData*>& ic_data_array, |
| - intptr_t osr_id) = 0; |
| + intptr_t osr_id, |
| + Zone* zone) = 0; |
|
Ivan Posva
2015/03/13 21:56:49
We generally pass Isolate* as the first parameter,
koda
2015/03/14 00:46:36
Done.
|
| virtual void FinalizeCompilation() = 0; |
| virtual ~CompilationPipeline() { } |
| }; |
| @@ -95,7 +96,8 @@ |
| virtual FlowGraph* BuildFlowGraph( |
| ParsedFunction* parsed_function, |
| const ZoneGrowableArray<const ICData*>& ic_data_array, |
| - intptr_t osr_id) { |
| + intptr_t osr_id, |
| + Zone* zone) { |
| // Build the flow graph. |
| FlowGraphBuilder builder(*parsed_function, |
| ic_data_array, |
| @@ -111,9 +113,7 @@ |
| class IrregexpCompilationPipeline : public CompilationPipeline { |
| public: |
| - explicit IrregexpCompilationPipeline(Isolate* isolate) |
| - : backtrack_goto_(NULL), |
| - isolate_(isolate) { } |
| + IrregexpCompilationPipeline() : backtrack_goto_(NULL) { } |
| virtual void ParseFunction(ParsedFunction* parsed_function) { |
| RegExpParser::ParseFunction(parsed_function); |
| @@ -123,7 +123,8 @@ |
| virtual FlowGraph* BuildFlowGraph( |
| ParsedFunction* parsed_function, |
| const ZoneGrowableArray<const ICData*>& ic_data_array, |
| - intptr_t osr_id) { |
| + intptr_t osr_id, |
| + Zone* zone) { |
| // Compile to the dart IR. |
| RegExpEngine::CompilationResult result = |
| RegExpEngine::Compile(parsed_function->regexp_compile_data(), |
| @@ -140,26 +141,26 @@ |
| NULL, // NULL = not inlining. |
| osr_id); |
| - return new(isolate_) FlowGraph(*parsed_function, |
| - result.graph_entry, |
| - result.num_blocks); |
| + return new(zone) FlowGraph(*parsed_function, |
| + result.graph_entry, |
| + result.num_blocks); |
| } |
| virtual void FinalizeCompilation() { |
| - backtrack_goto_->ComputeOffsetTable(isolate_); |
| + backtrack_goto_->ComputeOffsetTable(); |
| } |
| private: |
| IndirectGotoInstr* backtrack_goto_; |
| - Isolate* isolate_; |
| + Zone* zone_; |
|
Ivan Posva
2015/03/13 21:56:49
Where is zone_ being set?
koda
2015/03/14 00:46:36
Removed (leftover from previous version).
|
| }; |
| -CompilationPipeline* CompilationPipeline::New(Isolate* isolate, |
| +CompilationPipeline* CompilationPipeline::New(Zone* zone, |
| const Function& function) { |
| if (function.IsIrregexpFunction()) { |
| - return new(isolate) IrregexpCompilationPipeline(isolate); |
| + return new(zone) IrregexpCompilationPipeline(); |
| } else { |
| - return new(isolate) DartCompilationPipeline(); |
| + return new(zone) DartCompilationPipeline(); |
| } |
| } |
| @@ -169,7 +170,7 @@ |
| DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { |
| const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); |
| ASSERT(!function.HasCode()); |
| - const Error& error = Error::Handle(Compiler::CompileFunction(isolate, |
| + const Error& error = Error::Handle(Compiler::CompileFunction(thread, |
| function)); |
| if (!error.IsNull()) { |
| Exceptions::PropagateError(error); |
| @@ -374,7 +375,9 @@ |
| } |
| TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer); |
| bool is_compiled = false; |
| - Isolate* isolate = Isolate::Current(); |
| + Thread* thread = Thread::Current(); |
| + Zone* zone = thread->zone(); |
| + Isolate* isolate = thread->isolate(); |
| HANDLESCOPE(isolate); |
| // We may reattempt compilation if the function needs to be assembled using |
| @@ -404,7 +407,7 @@ |
| &CompilerStats::graphbuilder_timer, |
| isolate); |
| ZoneGrowableArray<const ICData*>* ic_data_array = |
| - new(isolate) ZoneGrowableArray<const ICData*>(); |
| + new(zone) ZoneGrowableArray<const ICData*>(); |
| if (optimized) { |
| ASSERT(function.HasCode()); |
| // Extract type feedback before the graph is built, as the graph |
| @@ -424,7 +427,8 @@ |
| flow_graph = pipeline->BuildFlowGraph(parsed_function, |
| *ic_data_array, |
| - osr_id); |
| + osr_id, |
| + zone); |
| } |
| const bool print_flow_graph = |
| @@ -1040,19 +1044,21 @@ |
| } |
| -RawError* Compiler::CompileFunction(Isolate* isolate, |
| +RawError* Compiler::CompileFunction(Thread* thread, |
| const Function& function) { |
| - VMTagScope tagScope(isolate, VMTag::kCompileUnoptimizedTagId); |
| - CompilationPipeline* pipeline = CompilationPipeline::New(isolate, function); |
| + VMTagScope tagScope(thread->isolate(), VMTag::kCompileUnoptimizedTagId); |
| + CompilationPipeline* pipeline = |
| + CompilationPipeline::New(thread->zone(), function); |
| return CompileFunctionHelper(pipeline, function, false, Isolate::kNoDeoptId); |
| } |
| -RawError* Compiler::CompileOptimizedFunction(Isolate* isolate, |
| +RawError* Compiler::CompileOptimizedFunction(Thread* thread, |
| const Function& function, |
| intptr_t osr_id) { |
| - VMTagScope tagScope(isolate, VMTag::kCompileOptimizedTagId); |
| - CompilationPipeline* pipeline = CompilationPipeline::New(isolate, function); |
| + VMTagScope tagScope(thread->isolate(), VMTag::kCompileOptimizedTagId); |
| + CompilationPipeline* pipeline = |
| + CompilationPipeline::New(thread->zone(), function); |
| return CompileFunctionHelper(pipeline, function, true, osr_id); |
| } |
| @@ -1086,10 +1092,11 @@ |
| RawError* Compiler::CompileAllFunctions(const Class& cls) { |
| - Isolate* isolate = Isolate::Current(); |
| - Error& error = Error::Handle(isolate); |
| - Array& functions = Array::Handle(isolate, cls.functions()); |
| - Function& func = Function::Handle(isolate); |
| + Thread* thread = Thread::Current(); |
| + Zone* zone = thread->zone(); |
| + Error& error = Error::Handle(zone); |
| + Array& functions = Array::Handle(zone, cls.functions()); |
| + Function& func = Function::Handle(zone); |
| // Class dynamic lives in the vm isolate. Its array fields cannot be set to |
| // an empty array. |
| if (functions.IsNull()) { |
| @@ -1103,7 +1110,7 @@ |
| if (!func.HasCode() && |
| !func.is_abstract() && |
| !func.IsRedirectingFactory()) { |
| - error = CompileFunction(isolate, func); |
| + error = CompileFunction(thread, func); |
| if (!error.IsNull()) { |
| return error.raw(); |
| } |
| @@ -1114,12 +1121,12 @@ |
| // more closures can be added to the end of the array. Compile all the |
| // closures until we have reached the end of the "worklist". |
| GrowableObjectArray& closures = |
| - GrowableObjectArray::Handle(isolate, cls.closures()); |
| + GrowableObjectArray::Handle(zone, cls.closures()); |
| if (!closures.IsNull()) { |
| for (int i = 0; i < closures.Length(); i++) { |
| func ^= closures.At(i); |
| if (!func.HasCode()) { |
| - error = CompileFunction(isolate, func); |
| + error = CompileFunction(thread, func); |
| if (!error.IsNull()) { |
| return error.raw(); |
| } |