| Index: src/compiler.cc
|
| diff --git a/src/compiler.cc b/src/compiler.cc
|
| index 00beeb6ef621f75d029e8136081b533f81230664..4f98840a7a92d16c61a4fef57f9bb09fb9ca3ca5 100644
|
| --- a/src/compiler.cc
|
| +++ b/src/compiler.cc
|
| @@ -66,7 +66,7 @@ PARSE_INFO_GETTER(Handle<SharedFunctionInfo>, shared_info)
|
| // A wrapper around a CompilationInfo that detaches the Handles from
|
| // the underlying DeferredHandleScope and stores them in info_ on
|
| // destruction.
|
| -class CompilationHandleScope BASE_EMBEDDED {
|
| +class CompilationHandleScope final {
|
| public:
|
| explicit CompilationHandleScope(CompilationInfo* info)
|
| : deferred_(info->isolate()), info_(info) {}
|
| @@ -658,9 +658,6 @@ bool GetOptimizedCodeNow(CompilationJob* job) {
|
| CompilationInfo* info = job->info();
|
| Isolate* isolate = info->isolate();
|
|
|
| - // All handles below this point will be canonicalized.
|
| - CanonicalHandleScope canonical(isolate);
|
| -
|
| // Parsing is not required when optimizing from existing bytecode.
|
| if (!info->is_optimizing_from_bytecode()) {
|
| if (!Compiler::ParseAndAnalyze(info->parse_info())) return false;
|
| @@ -669,10 +666,6 @@ bool GetOptimizedCodeNow(CompilationJob* job) {
|
|
|
| JSFunction::EnsureLiterals(info->closure());
|
|
|
| - // Reopen handles in the new CompilationHandleScope.
|
| - info->ReopenHandlesInNewHandleScope();
|
| - info->parse_info()->ReopenHandlesInNewHandleScope();
|
| -
|
| TimerEventScope<TimerEventRecompileSynchronous> timer(isolate);
|
| RuntimeCallTimerScope runtimeTimer(isolate,
|
| &RuntimeCallStats::RecompileSynchronous);
|
| @@ -720,12 +713,6 @@ bool GetOptimizedCodeLater(CompilationJob* job) {
|
| return false;
|
| }
|
|
|
| - // All handles below this point will be canonicalized and allocated in a
|
| - // deferred handle scope that is detached and handed off to the background
|
| - // thread when we return.
|
| - CompilationHandleScope handle_scope(info);
|
| - CanonicalHandleScope canonical(isolate);
|
| -
|
| // Parsing is not required when optimizing from existing bytecode.
|
| if (!info->is_optimizing_from_bytecode()) {
|
| if (!Compiler::ParseAndAnalyze(info->parse_info())) return false;
|
| @@ -734,10 +721,6 @@ bool GetOptimizedCodeLater(CompilationJob* job) {
|
|
|
| JSFunction::EnsureLiterals(info->closure());
|
|
|
| - // Reopen handles in the new CompilationHandleScope.
|
| - info->ReopenHandlesInNewHandleScope();
|
| - info->parse_info()->ReopenHandlesInNewHandleScope();
|
| -
|
| TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate());
|
| RuntimeCallTimerScope runtimeTimer(info->isolate(),
|
| &RuntimeCallStats::RecompileSynchronous);
|
| @@ -839,6 +822,22 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
|
| parse_info->set_lazy(false);
|
| }
|
|
|
| + // In case of concurrent recompilation, all handles below this point will be
|
| + // allocated in a deferred handle scope that is detached and handed off to
|
| + // the background thread when we return.
|
| + std::unique_ptr<CompilationHandleScope> compilation;
|
| + if (mode == Compiler::CONCURRENT) {
|
| + compilation.reset(new CompilationHandleScope(info));
|
| + }
|
| +
|
| + // In case of TurboFan, all handles below will be canonicalized.
|
| + std::unique_ptr<CanonicalHandleScope> canonical;
|
| + if (use_turbofan) canonical.reset(new CanonicalHandleScope(info->isolate()));
|
| +
|
| + // Reopen handles in the new CompilationHandleScope.
|
| + info->ReopenHandlesInNewHandleScope();
|
| + parse_info->ReopenHandlesInNewHandleScope();
|
| +
|
| if (mode == Compiler::CONCURRENT) {
|
| if (GetOptimizedCodeLater(job.get())) {
|
| job.release(); // The background recompile job owns this now.
|
|
|