| 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" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 CompilerDispatcherTracer* tracer, | 88 CompilerDispatcherTracer* tracer, |
| 89 Handle<SharedFunctionInfo> shared, | 89 Handle<SharedFunctionInfo> shared, |
| 90 FunctionLiteral* literal, | 90 FunctionLiteral* literal, |
| 91 size_t max_stack_size) | 91 size_t max_stack_size) |
| 92 : status_(CompileJobStatus::kAnalyzed), | 92 : status_(CompileJobStatus::kAnalyzed), |
| 93 isolate_(isolate), | 93 isolate_(isolate), |
| 94 tracer_(tracer), | 94 tracer_(tracer), |
| 95 shared_(Handle<SharedFunctionInfo>::cast( | 95 shared_(Handle<SharedFunctionInfo>::cast( |
| 96 isolate_->global_handles()->Create(*shared))), | 96 isolate_->global_handles()->Create(*shared))), |
| 97 max_stack_size_(max_stack_size), | 97 max_stack_size_(max_stack_size), |
| 98 zone_(new Zone(isolate->allocator(), ZONE_NAME)), | 98 parse_info_( |
| 99 parse_info_(new ParseInfo( | 99 new ParseInfo(Handle<Script>(Script::cast(shared->script())))), |
| 100 zone_.get(), Handle<Script>(Script::cast(shared->script())))), | |
| 101 compile_info_( | 100 compile_info_( |
| 102 new CompilationInfo(parse_info_.get(), Handle<JSFunction>::null())), | 101 new CompilationInfo(parse_info_.get(), Handle<JSFunction>::null())), |
| 103 trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { | 102 trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { |
| 104 parse_info_->set_literal(literal); | 103 parse_info_->set_literal(literal); |
| 105 parse_info_->set_shared_info(shared); | 104 parse_info_->set_shared_info(shared); |
| 106 parse_info_->set_function_literal_id(shared->function_literal_id()); | 105 parse_info_->set_function_literal_id(shared->function_literal_id()); |
| 107 parse_info_->set_language_mode(literal->scope()->language_mode()); | 106 parse_info_->set_language_mode(literal->scope()->language_mode()); |
| 108 if (trace_compiler_dispatcher_jobs_) { | 107 if (trace_compiler_dispatcher_jobs_) { |
| 109 PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); | 108 PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); |
| 110 shared_->ShortPrint(); | 109 shared_->ShortPrint(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 127 void CompilerDispatcherJob::PrepareToParseOnMainThread() { | 126 void CompilerDispatcherJob::PrepareToParseOnMainThread() { |
| 128 DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 127 DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); |
| 129 DCHECK(status() == CompileJobStatus::kInitial); | 128 DCHECK(status() == CompileJobStatus::kInitial); |
| 130 COMPILER_DISPATCHER_TRACE_SCOPE(tracer_, kPrepareToParse); | 129 COMPILER_DISPATCHER_TRACE_SCOPE(tracer_, kPrepareToParse); |
| 131 if (trace_compiler_dispatcher_jobs_) { | 130 if (trace_compiler_dispatcher_jobs_) { |
| 132 PrintF("CompilerDispatcherJob[%p]: Preparing to parse\n", | 131 PrintF("CompilerDispatcherJob[%p]: Preparing to parse\n", |
| 133 static_cast<void*>(this)); | 132 static_cast<void*>(this)); |
| 134 } | 133 } |
| 135 HandleScope scope(isolate_); | 134 HandleScope scope(isolate_); |
| 136 unicode_cache_.reset(new UnicodeCache()); | 135 unicode_cache_.reset(new UnicodeCache()); |
| 137 zone_.reset(new Zone(isolate_->allocator(), ZONE_NAME)); | |
| 138 Handle<Script> script(Script::cast(shared_->script()), isolate_); | 136 Handle<Script> script(Script::cast(shared_->script()), isolate_); |
| 139 DCHECK(script->type() != Script::TYPE_NATIVE); | 137 DCHECK(script->type() != Script::TYPE_NATIVE); |
| 140 | 138 |
| 141 Handle<String> source(String::cast(script->source()), isolate_); | 139 Handle<String> source(String::cast(script->source()), isolate_); |
| 140 parse_info_.reset(new ParseInfo(isolate_->allocator())); |
| 142 if (source->IsExternalTwoByteString() || source->IsExternalOneByteString()) { | 141 if (source->IsExternalTwoByteString() || source->IsExternalOneByteString()) { |
| 143 character_stream_.reset(ScannerStream::For( | 142 character_stream_.reset(ScannerStream::For( |
| 144 source, shared_->start_position(), shared_->end_position())); | 143 source, shared_->start_position(), shared_->end_position())); |
| 145 } else { | 144 } else { |
| 146 source = String::Flatten(source); | 145 source = String::Flatten(source); |
| 147 const void* data; | 146 const void* data; |
| 148 int offset = 0; | 147 int offset = 0; |
| 149 int length = source->length(); | 148 int length = source->length(); |
| 150 | 149 |
| 151 // Objects in lo_space don't move, so we can just read the contents from | 150 // Objects in lo_space don't move, so we can just read the contents from |
| (...skipping 10 matching lines...) Expand all Loading... |
| 162 content.IsOneByte() | 161 content.IsOneByte() |
| 163 ? reinterpret_cast<const void*>(content.ToOneByteVector().start()) | 162 ? reinterpret_cast<const void*>(content.ToOneByteVector().start()) |
| 164 : reinterpret_cast<const void*>(content.ToUC16Vector().start()); | 163 : reinterpret_cast<const void*>(content.ToUC16Vector().start()); |
| 165 } else { | 164 } else { |
| 166 // Otherwise, create a copy of the part of the string we'll parse in the | 165 // Otherwise, create a copy of the part of the string we'll parse in the |
| 167 // zone. | 166 // zone. |
| 168 length = (shared_->end_position() - shared_->start_position()); | 167 length = (shared_->end_position() - shared_->start_position()); |
| 169 offset = shared_->start_position(); | 168 offset = shared_->start_position(); |
| 170 | 169 |
| 171 int byte_len = length * (source->IsOneByteRepresentation() ? 1 : 2); | 170 int byte_len = length * (source->IsOneByteRepresentation() ? 1 : 2); |
| 172 data = zone_->New(byte_len); | 171 data = parse_info_->zone()->New(byte_len); |
| 173 | 172 |
| 174 DisallowHeapAllocation no_allocation; | 173 DisallowHeapAllocation no_allocation; |
| 175 String::FlatContent content = source->GetFlatContent(); | 174 String::FlatContent content = source->GetFlatContent(); |
| 176 DCHECK(content.IsFlat()); | 175 DCHECK(content.IsFlat()); |
| 177 if (content.IsOneByte()) { | 176 if (content.IsOneByte()) { |
| 178 MemCopy(const_cast<void*>(data), | 177 MemCopy(const_cast<void*>(data), |
| 179 &content.ToOneByteVector().at(shared_->start_position()), | 178 &content.ToOneByteVector().at(shared_->start_position()), |
| 180 byte_len); | 179 byte_len); |
| 181 } else { | 180 } else { |
| 182 MemCopy(const_cast<void*>(data), | 181 MemCopy(const_cast<void*>(data), |
| (...skipping 17 matching lines...) Expand all Loading... |
| 200 ->NewExternalStringFromTwoByte(resource) | 199 ->NewExternalStringFromTwoByte(resource) |
| 201 .ToHandleChecked(); | 200 .ToHandleChecked(); |
| 202 } | 201 } |
| 203 wrapper_ = | 202 wrapper_ = |
| 204 Handle<String>::cast(isolate_->global_handles()->Create(*wrapper)); | 203 Handle<String>::cast(isolate_->global_handles()->Create(*wrapper)); |
| 205 | 204 |
| 206 character_stream_.reset( | 205 character_stream_.reset( |
| 207 ScannerStream::For(wrapper_, shared_->start_position() - offset, | 206 ScannerStream::For(wrapper_, shared_->start_position() - offset, |
| 208 shared_->end_position() - offset)); | 207 shared_->end_position() - offset)); |
| 209 } | 208 } |
| 210 parse_info_.reset(new ParseInfo(zone_.get())); | |
| 211 parse_info_->set_isolate(isolate_); | 209 parse_info_->set_isolate(isolate_); |
| 212 parse_info_->set_character_stream(character_stream_.get()); | 210 parse_info_->set_character_stream(character_stream_.get()); |
| 213 parse_info_->set_hash_seed(isolate_->heap()->HashSeed()); | 211 parse_info_->set_hash_seed(isolate_->heap()->HashSeed()); |
| 214 parse_info_->set_is_named_expression(shared_->is_named_expression()); | 212 parse_info_->set_is_named_expression(shared_->is_named_expression()); |
| 215 parse_info_->set_compiler_hints(shared_->compiler_hints()); | 213 parse_info_->set_compiler_hints(shared_->compiler_hints()); |
| 216 parse_info_->set_start_position(shared_->start_position()); | 214 parse_info_->set_start_position(shared_->start_position()); |
| 217 parse_info_->set_end_position(shared_->end_position()); | 215 parse_info_->set_end_position(shared_->end_position()); |
| 218 parse_info_->set_unicode_cache(unicode_cache_.get()); | 216 parse_info_->set_unicode_cache(unicode_cache_.get()); |
| 219 parse_info_->set_language_mode(shared_->language_mode()); | 217 parse_info_->set_language_mode(shared_->language_mode()); |
| 220 parse_info_->set_function_literal_id(shared_->function_literal_id()); | 218 parse_info_->set_function_literal_id(shared_->function_literal_id()); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 static_cast<void*>(this)); | 384 static_cast<void*>(this)); |
| 387 } | 385 } |
| 388 | 386 |
| 389 if (compile_job_->state() == CompilationJob::State::kFailed || | 387 if (compile_job_->state() == CompilationJob::State::kFailed || |
| 390 !Compiler::FinalizeCompilationJob(compile_job_.release())) { | 388 !Compiler::FinalizeCompilationJob(compile_job_.release())) { |
| 391 if (!isolate_->has_pending_exception()) isolate_->StackOverflow(); | 389 if (!isolate_->has_pending_exception()) isolate_->StackOverflow(); |
| 392 status_ = CompileJobStatus::kFailed; | 390 status_ = CompileJobStatus::kFailed; |
| 393 return false; | 391 return false; |
| 394 } | 392 } |
| 395 | 393 |
| 396 zone_.reset(); | |
| 397 compile_job_.reset(); | 394 compile_job_.reset(); |
| 398 compile_info_.reset(); | 395 compile_info_.reset(); |
| 399 handles_from_parsing_.reset(); | 396 handles_from_parsing_.reset(); |
| 400 parse_info_.reset(); | 397 parse_info_.reset(); |
| 401 | 398 |
| 402 status_ = CompileJobStatus::kDone; | 399 status_ = CompileJobStatus::kDone; |
| 403 return true; | 400 return true; |
| 404 } | 401 } |
| 405 | 402 |
| 406 void CompilerDispatcherJob::ResetOnMainThread() { | 403 void CompilerDispatcherJob::ResetOnMainThread() { |
| 407 DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 404 DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); |
| 408 | 405 |
| 409 if (trace_compiler_dispatcher_jobs_) { | 406 if (trace_compiler_dispatcher_jobs_) { |
| 410 PrintF("CompilerDispatcherJob[%p]: Resetting\n", static_cast<void*>(this)); | 407 PrintF("CompilerDispatcherJob[%p]: Resetting\n", static_cast<void*>(this)); |
| 411 } | 408 } |
| 412 | 409 |
| 413 compile_job_.reset(); | 410 compile_job_.reset(); |
| 414 compile_info_.reset(); | 411 compile_info_.reset(); |
| 415 parser_.reset(); | 412 parser_.reset(); |
| 416 unicode_cache_.reset(); | 413 unicode_cache_.reset(); |
| 417 character_stream_.reset(); | 414 character_stream_.reset(); |
| 418 handles_from_parsing_.reset(); | 415 handles_from_parsing_.reset(); |
| 419 parse_info_.reset(); | 416 parse_info_.reset(); |
| 420 zone_.reset(); | |
| 421 | 417 |
| 422 if (!source_.is_null()) { | 418 if (!source_.is_null()) { |
| 423 i::GlobalHandles::Destroy(Handle<Object>::cast(source_).location()); | 419 i::GlobalHandles::Destroy(Handle<Object>::cast(source_).location()); |
| 424 source_ = Handle<String>::null(); | 420 source_ = Handle<String>::null(); |
| 425 } | 421 } |
| 426 if (!wrapper_.is_null()) { | 422 if (!wrapper_.is_null()) { |
| 427 i::GlobalHandles::Destroy(Handle<Object>::cast(wrapper_).location()); | 423 i::GlobalHandles::Destroy(Handle<Object>::cast(wrapper_).location()); |
| 428 wrapper_ = Handle<String>::null(); | 424 wrapper_ = Handle<String>::null(); |
| 429 } | 425 } |
| 430 | 426 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 return 0.0; | 461 return 0.0; |
| 466 } | 462 } |
| 467 | 463 |
| 468 void CompilerDispatcherJob::ShortPrint() { | 464 void CompilerDispatcherJob::ShortPrint() { |
| 469 DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 465 DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); |
| 470 shared_->ShortPrint(); | 466 shared_->ShortPrint(); |
| 471 } | 467 } |
| 472 | 468 |
| 473 } // namespace internal | 469 } // namespace internal |
| 474 } // namespace v8 | 470 } // namespace v8 |
| OLD | NEW |