Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index 73eeba09cf96e96cc417aaccf1cdb87e46a6f62d..be5f9a1583a15100fefb8d7f1ce6d095566c47e3 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -419,6 +419,12 @@ void CompilationJob::RecordOptimizationStats() { |
namespace { |
+bool IsEvalToplevel(Handle<SharedFunctionInfo> shared) { |
+ return shared->is_toplevel() && shared->script()->IsScript() && |
+ Script::cast(shared->script())->compilation_type() == |
+ Script::COMPILATION_TYPE_EVAL; |
+} |
+ |
void RecordFunctionCompilation(Logger::LogEventsAndTags tag, |
CompilationInfo* info) { |
// Log the code generation. If source information is available include |
@@ -766,12 +772,6 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function, |
shared->code()->set_profiler_ticks(0); |
} |
- // TODO(mstarzinger): We cannot properly deserialize a scope chain containing |
- // an eval scope and hence would fail at parsing the eval source again. |
- if (shared->disable_optimization_reason() == kEval) { |
- return MaybeHandle<Code>(); |
- } |
- |
VMState<COMPILER> state(isolate); |
DCHECK(!isolate->has_pending_exception()); |
PostponeInterruptsScope postpone(isolate); |
@@ -780,6 +780,7 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function, |
use_turbofan ? compiler::Pipeline::NewCompilationJob(function) |
: new HCompilationJob(function)); |
CompilationInfo* info = job->info(); |
+ ParseInfo* parse_info = info->parse_info(); |
info->SetOptimizingForOsr(osr_ast_id); |
@@ -814,6 +815,14 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function, |
info->MarkAsOptimizeFromBytecode(); |
} |
+ if (IsEvalToplevel(shared)) { |
+ parse_info->set_eval(); |
+ if (function->context()->IsNativeContext()) parse_info->set_global(); |
+ parse_info->set_toplevel(); |
+ parse_info->set_allow_lazy_parsing(false); |
+ parse_info->set_lazy(false); |
+ } |
+ |
if (mode == Compiler::CONCURRENT) { |
if (GetOptimizedCodeLater(job.get())) { |
job.Detach(); // The background recompile job owns this now. |
@@ -1002,12 +1011,6 @@ MaybeHandle<Code> GetLazyCode(Handle<JSFunction> function) { |
} |
-inline bool IsEvalToplevel(Handle<SharedFunctionInfo> shared) { |
- return shared->is_toplevel() && shared->script()->IsScript() && |
- Script::cast(shared->script())->compilation_type() == |
- Script::COMPILATION_TYPE_EVAL; |
-} |
- |
Handle<SharedFunctionInfo> NewSharedFunctionInfoForLiteral( |
Isolate* isolate, FunctionLiteral* literal, Handle<Script> script) { |
Handle<Code> code = isolate->builtins()->CompileLazy(); |