OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler-dispatcher/compiler-dispatcher-job.h" | 5 #include "src/compiler-dispatcher/compiler-dispatcher-job.h" |
6 | 6 |
7 #include "src/assert-scope.h" | 7 #include "src/assert-scope.h" |
8 #include "src/compilation-info.h" | 8 #include "src/compilation-info.h" |
9 #include "src/compiler-dispatcher/compiler-dispatcher-tracer.h" | 9 #include "src/compiler-dispatcher/compiler-dispatcher-tracer.h" |
10 #include "src/compiler.h" | 10 #include "src/compiler.h" |
11 #include "src/flags.h" | 11 #include "src/flags.h" |
12 #include "src/global-handles.h" | 12 #include "src/global-handles.h" |
13 #include "src/isolate.h" | 13 #include "src/isolate.h" |
14 #include "src/objects-inl.h" | 14 #include "src/objects-inl.h" |
15 #include "src/parsing/parse-info.h" | 15 #include "src/parsing/parse-info.h" |
16 #include "src/parsing/parser.h" | 16 #include "src/parsing/parser.h" |
17 #include "src/parsing/scanner-character-streams.h" | 17 #include "src/parsing/scanner-character-streams.h" |
18 #include "src/unicode-cache.h" | 18 #include "src/unicode-cache.h" |
19 #include "src/utils.h" | 19 #include "src/utils.h" |
20 #include "src/zone/zone.h" | |
21 | 20 |
22 namespace v8 { | 21 namespace v8 { |
23 namespace internal { | 22 namespace internal { |
24 | 23 |
25 namespace { | 24 namespace { |
26 | 25 |
27 class OneByteWrapper : public v8::String::ExternalOneByteStringResource { | 26 class OneByteWrapper : public v8::String::ExternalOneByteStringResource { |
28 public: | 27 public: |
29 OneByteWrapper(const void* data, int length) : data_(data), length_(length) {} | 28 OneByteWrapper(const void* data, int length) : data_(data), length_(length) {} |
30 ~OneByteWrapper() override = default; | 29 ~OneByteWrapper() override = default; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 size_t max_stack_size) | 67 size_t max_stack_size) |
69 : status_(CompileJobStatus::kInitial), | 68 : status_(CompileJobStatus::kInitial), |
70 isolate_(isolate), | 69 isolate_(isolate), |
71 tracer_(tracer), | 70 tracer_(tracer), |
72 context_(Handle<Context>::cast( | 71 context_(Handle<Context>::cast( |
73 isolate_->global_handles()->Create(isolate->context()))), | 72 isolate_->global_handles()->Create(isolate->context()))), |
74 shared_(Handle<SharedFunctionInfo>::cast( | 73 shared_(Handle<SharedFunctionInfo>::cast( |
75 isolate_->global_handles()->Create(*shared))), | 74 isolate_->global_handles()->Create(*shared))), |
76 max_stack_size_(max_stack_size), | 75 max_stack_size_(max_stack_size), |
77 trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { | 76 trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { |
| 77 DCHECK(!shared_->is_toplevel()); |
78 HandleScope scope(isolate_); | 78 HandleScope scope(isolate_); |
79 DCHECK(!shared_->outer_scope_info()->IsTheHole(isolate_)); | |
80 Handle<Script> script(Script::cast(shared_->script()), isolate_); | 79 Handle<Script> script(Script::cast(shared_->script()), isolate_); |
81 Handle<String> source(String::cast(script->source()), isolate_); | 80 Handle<String> source(String::cast(script->source()), isolate_); |
82 if (trace_compiler_dispatcher_jobs_) { | 81 if (trace_compiler_dispatcher_jobs_) { |
83 PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); | 82 PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); |
84 shared_->ShortPrint(); | 83 shared_->ShortPrint(); |
85 PrintF(" in initial state.\n"); | 84 PrintF(" in initial state.\n"); |
86 } | 85 } |
87 } | 86 } |
88 | 87 |
89 CompilerDispatcherJob::CompilerDispatcherJob( | 88 CompilerDispatcherJob::CompilerDispatcherJob( |
90 Isolate* isolate, CompilerDispatcherTracer* tracer, | 89 Isolate* isolate, CompilerDispatcherTracer* tracer, Handle<Script> script, |
91 Handle<SharedFunctionInfo> shared, FunctionLiteral* literal, | 90 Handle<SharedFunctionInfo> shared, FunctionLiteral* literal, |
92 std::shared_ptr<Zone> parse_zone, | 91 std::shared_ptr<Zone> parse_zone, |
93 std::shared_ptr<DeferredHandles> parse_handles, | 92 std::shared_ptr<DeferredHandles> parse_handles, |
94 std::shared_ptr<DeferredHandles> compile_handles, size_t max_stack_size) | 93 std::shared_ptr<DeferredHandles> compile_handles, size_t max_stack_size) |
95 : status_(CompileJobStatus::kAnalyzed), | 94 : status_(CompileJobStatus::kAnalyzed), |
96 isolate_(isolate), | 95 isolate_(isolate), |
97 tracer_(tracer), | 96 tracer_(tracer), |
98 context_(Handle<Context>::cast( | 97 context_(Handle<Context>::cast( |
99 isolate_->global_handles()->Create(isolate->context()))), | 98 isolate_->global_handles()->Create(isolate->context()))), |
100 shared_(Handle<SharedFunctionInfo>::cast( | 99 shared_(Handle<SharedFunctionInfo>::cast( |
101 isolate_->global_handles()->Create(*shared))), | 100 isolate_->global_handles()->Create(*shared))), |
102 max_stack_size_(max_stack_size), | 101 max_stack_size_(max_stack_size), |
103 parse_info_(new ParseInfo(shared_)), | 102 parse_info_(new ParseInfo(shared_)), |
104 parse_zone_(parse_zone), | 103 parse_zone_(parse_zone), |
105 compile_info_(new CompilationInfo(parse_info_->zone(), parse_info_.get(), | 104 compile_info_(new CompilationInfo(parse_info_->zone(), parse_info_.get(), |
106 Handle<JSFunction>::null())), | 105 Handle<JSFunction>::null())), |
107 trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { | 106 trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { |
108 parse_info_->set_literal(literal); | 107 parse_info_->set_literal(literal); |
| 108 parse_info_->set_script(script); |
109 parse_info_->set_deferred_handles(parse_handles); | 109 parse_info_->set_deferred_handles(parse_handles); |
110 compile_info_->set_deferred_handles(compile_handles); | 110 compile_info_->set_deferred_handles(compile_handles); |
111 | 111 |
112 if (trace_compiler_dispatcher_jobs_) { | 112 if (trace_compiler_dispatcher_jobs_) { |
113 PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); | 113 PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); |
114 shared_->ShortPrint(); | 114 shared_->ShortPrint(); |
115 PrintF(" in Analyzed state.\n"); | 115 PrintF(" in Analyzed state.\n"); |
116 } | 116 } |
117 } | 117 } |
118 | 118 |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 parse_info_->set_hash_seed(isolate_->heap()->HashSeed()); | 217 parse_info_->set_hash_seed(isolate_->heap()->HashSeed()); |
218 parse_info_->set_is_named_expression(shared_->is_named_expression()); | 218 parse_info_->set_is_named_expression(shared_->is_named_expression()); |
219 parse_info_->set_compiler_hints(shared_->compiler_hints()); | 219 parse_info_->set_compiler_hints(shared_->compiler_hints()); |
220 parse_info_->set_start_position(shared_->start_position()); | 220 parse_info_->set_start_position(shared_->start_position()); |
221 parse_info_->set_end_position(shared_->end_position()); | 221 parse_info_->set_end_position(shared_->end_position()); |
222 parse_info_->set_unicode_cache(unicode_cache_.get()); | 222 parse_info_->set_unicode_cache(unicode_cache_.get()); |
223 parse_info_->set_language_mode(shared_->language_mode()); | 223 parse_info_->set_language_mode(shared_->language_mode()); |
224 parse_info_->set_function_literal_id(shared_->function_literal_id()); | 224 parse_info_->set_function_literal_id(shared_->function_literal_id()); |
225 | 225 |
226 parser_.reset(new Parser(parse_info_.get())); | 226 parser_.reset(new Parser(parse_info_.get())); |
227 Handle<ScopeInfo> outer_scope_info( | 227 MaybeHandle<ScopeInfo> outer_scope_info; |
228 handle(ScopeInfo::cast(shared_->outer_scope_info()))); | 228 if (!shared_->outer_scope_info()->IsTheHole(isolate_) && |
229 parser_->DeserializeScopeChain(parse_info_.get(), | 229 ScopeInfo::cast(shared_->outer_scope_info())->length() > 0) { |
230 outer_scope_info->length() > 0 | 230 outer_scope_info = handle(ScopeInfo::cast(shared_->outer_scope_info())); |
231 ? MaybeHandle<ScopeInfo>(outer_scope_info) | 231 } |
232 : MaybeHandle<ScopeInfo>()); | 232 parser_->DeserializeScopeChain(parse_info_.get(), outer_scope_info); |
233 | 233 |
234 Handle<String> name(String::cast(shared_->name())); | 234 Handle<String> name(String::cast(shared_->name())); |
235 parse_info_->set_function_name( | 235 parse_info_->set_function_name( |
236 parse_info_->ast_value_factory()->GetString(name)); | 236 parse_info_->ast_value_factory()->GetString(name)); |
237 status_ = CompileJobStatus::kReadyToParse; | 237 status_ = CompileJobStatus::kReadyToParse; |
238 } | 238 } |
239 | 239 |
240 void CompilerDispatcherJob::Parse() { | 240 void CompilerDispatcherJob::Parse() { |
241 DCHECK(status() == CompileJobStatus::kReadyToParse); | 241 DCHECK(status() == CompileJobStatus::kReadyToParse); |
242 COMPILER_DISPATCHER_TRACE_SCOPE_WITH_NUM( | 242 COMPILER_DISPATCHER_TRACE_SCOPE_WITH_NUM( |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 parser_->ReportErrors(isolate_, script); | 288 parser_->ReportErrors(isolate_, script); |
289 status_ = CompileJobStatus::kFailed; | 289 status_ = CompileJobStatus::kFailed; |
290 } else { | 290 } else { |
291 status_ = CompileJobStatus::kReadyToAnalyze; | 291 status_ = CompileJobStatus::kReadyToAnalyze; |
292 } | 292 } |
293 parser_->UpdateStatistics(isolate_, script); | 293 parser_->UpdateStatistics(isolate_, script); |
294 | 294 |
295 DeferredHandleScope scope(isolate_); | 295 DeferredHandleScope scope(isolate_); |
296 { | 296 { |
297 parse_info_->ReopenHandlesInNewHandleScope(); | 297 parse_info_->ReopenHandlesInNewHandleScope(); |
298 Handle<ScopeInfo> outer_scope_info( | 298 |
299 handle(ScopeInfo::cast(shared_->outer_scope_info()))); | 299 if (!shared_->outer_scope_info()->IsTheHole(isolate_) && |
300 if (outer_scope_info->length() > 0) { | 300 ScopeInfo::cast(shared_->outer_scope_info())->length() > 0) { |
| 301 Handle<ScopeInfo> outer_scope_info( |
| 302 handle(ScopeInfo::cast(shared_->outer_scope_info()))); |
301 parse_info_->set_outer_scope_info(outer_scope_info); | 303 parse_info_->set_outer_scope_info(outer_scope_info); |
302 } | 304 } |
303 parse_info_->set_shared_info(shared_); | 305 parse_info_->set_shared_info(shared_); |
304 | 306 |
305 // Internalize ast values on the main thread. | 307 // Internalize ast values on the main thread. |
306 parse_info_->ast_value_factory()->Internalize(isolate_); | 308 parse_info_->ast_value_factory()->Internalize(isolate_); |
307 parser_->HandleSourceURLComments(isolate_, script); | 309 parser_->HandleSourceURLComments(isolate_, script); |
308 | 310 |
309 parse_info_->set_character_stream(nullptr); | 311 parse_info_->set_character_stream(nullptr); |
310 parse_info_->set_unicode_cache(nullptr); | 312 parse_info_->set_unicode_cache(nullptr); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 return 0.0; | 473 return 0.0; |
472 } | 474 } |
473 | 475 |
474 void CompilerDispatcherJob::ShortPrint() { | 476 void CompilerDispatcherJob::ShortPrint() { |
475 DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 477 DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); |
476 shared_->ShortPrint(); | 478 shared_->ShortPrint(); |
477 } | 479 } |
478 | 480 |
479 } // namespace internal | 481 } // namespace internal |
480 } // namespace v8 | 482 } // namespace v8 |
OLD | NEW |