| Index: src/compiler.cc
|
| diff --git a/src/compiler.cc b/src/compiler.cc
|
| index efae4db085959c631fd4709a63b58fec1c82c1ca..7a923ab08cab4a893de6efb0f247e8043344c122 100644
|
| --- a/src/compiler.cc
|
| +++ b/src/compiler.cc
|
| @@ -39,6 +39,19 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +// A wrapper around a ParseInfo that detaches the parser handles from the
|
| +// underlying DeferredHandleScope and stores them in info_ on destruction.
|
| +class ParseHandleScope final {
|
| + public:
|
| + explicit ParseHandleScope(ParseInfo* info)
|
| + : deferred_(info->isolate()), info_(info) {}
|
| + ~ParseHandleScope() { info_->set_deferred_handles(deferred_.Detach()); }
|
| +
|
| + private:
|
| + DeferredHandleScope deferred_;
|
| + ParseInfo* info_;
|
| +};
|
| +
|
| // A wrapper around a CompilationInfo that detaches the Handles from
|
| // the underlying DeferredHandleScope and stores them in info_ on
|
| // destruction.
|
| @@ -512,7 +525,7 @@ bool GenerateUnoptimizedCode(CompilationInfo* info) {
|
| bool CompileUnoptimizedInnerFunctions(
|
| Compiler::EagerInnerFunctionLiterals* literals,
|
| Compiler::ConcurrencyMode inner_function_mode,
|
| - CompilationInfo* outer_info) {
|
| + std::shared_ptr<Zone> parse_zone, CompilationInfo* outer_info) {
|
| Isolate* isolate = outer_info->isolate();
|
| Handle<Script> script = outer_info->script();
|
| bool is_debug = outer_info->is_debug();
|
| @@ -534,7 +547,9 @@ bool CompileUnoptimizedInnerFunctions(
|
| CompilerDispatcher* dispatcher = isolate->compiler_dispatcher();
|
| if (UseCompilerDispatcher(inner_function_mode, dispatcher, literal->scope(),
|
| shared, is_debug, will_serialize) &&
|
| - dispatcher->EnqueueAndStep(shared, literal)) {
|
| + dispatcher->EnqueueAndStep(shared, literal, parse_zone,
|
| + outer_info->parse_info()->deferred_handles(),
|
| + outer_info->deferred_handles())) {
|
| // If we have successfully queued up the function for compilation on the
|
| // compiler dispatcher then we are done.
|
| continue;
|
| @@ -579,9 +594,15 @@ bool CompileUnoptimizedCode(CompilationInfo* info,
|
| DCHECK(AllowCompilation::IsAllowed(isolate));
|
|
|
| Compiler::EagerInnerFunctionLiterals inner_literals;
|
| - if (!Compiler::Analyze(info->parse_info(), &inner_literals)) {
|
| - if (!isolate->has_pending_exception()) isolate->StackOverflow();
|
| - return false;
|
| + {
|
| + std::unique_ptr<CompilationHandleScope> compilation_handle_scope;
|
| + if (inner_function_mode == Compiler::CONCURRENT) {
|
| + compilation_handle_scope.reset(new CompilationHandleScope(info));
|
| + }
|
| + if (!Compiler::Analyze(info->parse_info(), &inner_literals)) {
|
| + if (!isolate->has_pending_exception()) isolate->StackOverflow();
|
| + return false;
|
| + }
|
| }
|
|
|
| // Disable concurrent inner compilation for asm-wasm code.
|
| @@ -592,15 +613,17 @@ bool CompileUnoptimizedCode(CompilationInfo* info,
|
| inner_function_mode = Compiler::NOT_CONCURRENT;
|
| }
|
|
|
| + std::shared_ptr<Zone> parse_zone;
|
| if (inner_function_mode == Compiler::CONCURRENT) {
|
| // Seal the parse zone so that it can be shared by parallel inner function
|
| // compilation jobs.
|
| DCHECK_NE(info->parse_info()->zone(), info->zone());
|
| - info->parse_info()->zone()->Seal();
|
| + parse_zone = info->parse_info()->zone_shared();
|
| + parse_zone->Seal();
|
| }
|
|
|
| if (!CompileUnoptimizedInnerFunctions(&inner_literals, inner_function_mode,
|
| - info) ||
|
| + parse_zone, info) ||
|
| !GenerateUnoptimizedCode(info)) {
|
| if (!isolate->has_pending_exception()) isolate->StackOverflow();
|
| return false;
|
| @@ -641,8 +664,20 @@ MUST_USE_RESULT MaybeHandle<Code> GetUnoptimizedCode(
|
| VMState<COMPILER> state(info->isolate());
|
| PostponeInterruptsScope postpone(info->isolate());
|
|
|
| - // Parse and update CompilationInfo with the results.
|
| - if (!parsing::ParseAny(info->parse_info())) return MaybeHandle<Code>();
|
| + // Parse and update ParseInfo with the results.
|
| + {
|
| + if (!parsing::ParseAny(info->parse_info(),
|
| + inner_function_mode != Compiler::CONCURRENT)) {
|
| + return MaybeHandle<Code>();
|
| + }
|
| +
|
| + if (inner_function_mode == Compiler::CONCURRENT) {
|
| + ParseHandleScope parse_handles(info->parse_info());
|
| + info->parse_info()->ReopenHandlesInNewHandleScope();
|
| + info->parse_info()->ast_value_factory()->Internalize(info->isolate());
|
| + }
|
| + }
|
| +
|
| if (info->parse_info()->is_toplevel()) {
|
| EnsureSharedFunctionInfosArrayOnScript(info->parse_info());
|
| }
|
| @@ -1134,9 +1169,16 @@ Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) {
|
| Handle<SharedFunctionInfo> result;
|
|
|
| { VMState<COMPILER> state(info->isolate());
|
| - if (parse_info->literal() == nullptr &&
|
| - !parsing::ParseProgram(parse_info)) {
|
| - return Handle<SharedFunctionInfo>::null();
|
| + if (parse_info->literal() == nullptr) {
|
| + if (!parsing::ParseProgram(parse_info, false)) {
|
| + return Handle<SharedFunctionInfo>::null();
|
| + }
|
| +
|
| + {
|
| + ParseHandleScope parse_handles(parse_info);
|
| + parse_info->ReopenHandlesInNewHandleScope();
|
| + parse_info->ast_value_factory()->Internalize(info->isolate());
|
| + }
|
| }
|
|
|
| EnsureSharedFunctionInfosArrayOnScript(parse_info);
|
|
|