Chromium Code Reviews| Index: src/compiler.cc |
| diff --git a/src/compiler.cc b/src/compiler.cc |
| index acfeaa48ccb303b3722600ed435a8233abcff79e..cd8b75b42a5dc912d7a48e3c6f34b3e36bee2fe6 100644 |
| --- a/src/compiler.cc |
| +++ b/src/compiler.cc |
| @@ -619,37 +619,6 @@ void SetExpectedNofPropertiesFromEstimate(Handle<SharedFunctionInfo> shared, |
| } |
| -static void UpdateSharedFunctionInfo(CompilationInfo* info) { |
| - // Update the shared function info with the compiled code and the |
| - // scope info. Please note, that the order of the shared function |
| - // info initialization is important since set_scope_info might |
| - // trigger a GC, causing the DCHECK below to be invalid if the code |
| - // was flushed. By setting the code object last we avoid this. |
| - Handle<SharedFunctionInfo> shared = info->shared_info(); |
| - Handle<ScopeInfo> scope_info = |
| - ScopeInfo::Create(info->scope(), info->zone()); |
| - shared->set_scope_info(*scope_info); |
| - |
| - Handle<Code> code = info->code(); |
| - CHECK(code->kind() == Code::FUNCTION); |
| - shared->ReplaceCode(*code); |
| - if (shared->optimization_disabled()) code->set_optimizable(false); |
| - |
| - shared->set_feedback_vector(*info->feedback_vector()); |
| - |
| - // Set the expected number of properties for instances. |
| - FunctionLiteral* lit = info->function(); |
| - int expected = lit->expected_property_count(); |
| - SetExpectedNofPropertiesFromEstimate(shared, expected); |
| - |
| - // Check the function has compiled code. |
| - DCHECK(shared->is_compiled()); |
| - shared->set_bailout_reason(lit->dont_optimize_reason()); |
| - shared->set_ast_node_count(lit->ast_node_count()); |
| - shared->set_strict_mode(lit->strict_mode()); |
| -} |
| - |
| - |
| // Sets the function info on a function. |
| // The start_position points to the first '(' character after the function name |
| // in the full script source. When counting characters in the script source the |
| @@ -702,14 +671,33 @@ MUST_USE_RESULT static MaybeHandle<Code> GetUnoptimizedCodeCommon( |
| CompilationInfo* info) { |
| VMState<COMPILER> state(info->isolate()); |
| PostponeInterruptsScope postpone(info->isolate()); |
| + |
| + // Parse and update CompilationInfo with the results. |
| if (!Parser::Parse(info)) return MaybeHandle<Code>(); |
| - info->SetStrictMode(info->function()->strict_mode()); |
| + Handle<SharedFunctionInfo> shared = info->shared_info(); |
| + FunctionLiteral* lit = info->function(); |
| + shared->set_strict_mode(lit->strict_mode()); |
| + SetExpectedNofPropertiesFromEstimate(shared, lit->expected_property_count()); |
| + shared->set_bailout_reason(lit->dont_optimize_reason()); |
| + shared->set_ast_node_count(lit->ast_node_count()); |
| + // Compile unoptimized code. |
| if (!CompileUnoptimizedCode(info)) return MaybeHandle<Code>(); |
| + |
| + CHECK_EQ(Code::FUNCTION, info->code()->kind()); |
| Compiler::RecordFunctionCompilation( |
| Logger::LAZY_COMPILE_TAG, info, info->shared_info()); |
| - UpdateSharedFunctionInfo(info); |
| - DCHECK_EQ(Code::FUNCTION, info->code()->kind()); |
| + |
| + // Update the shared function info with the scope info. Allocating the |
| + // ScopeInfo object may cause a GC. |
| + Handle<ScopeInfo> scope_info = ScopeInfo::Create(info->scope(), info->zone()); |
| + shared->set_scope_info(*scope_info); |
| + |
| + // Update the code and feedback vector for the shared function info. |
| + shared->ReplaceCode(*info->code()); |
| + if (shared->optimization_disabled()) info->code()->set_optimizable(false); |
| + shared->set_feedback_vector(*info->feedback_vector()); |
| + |
| return info->code(); |
| } |
| @@ -817,7 +805,6 @@ void Compiler::CompileForLiveEdit(Handle<Script> script) { |
| info.MarkAsGlobal(); |
| if (!Parser::Parse(&info)) return; |
| - info.SetStrictMode(info.function()->strict_mode()); |
|
Michael Starzinger
2014/09/17 12:10:10
This removal also applies to the following files:
titzer
2014/09/17 12:18:17
Done.
|
| LiveEditFunctionTracker tracker(info.isolate(), info.function()); |
| if (!CompileUnoptimizedCode(&info)) return; |
| @@ -1192,8 +1179,6 @@ static void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { |
| static bool CompileOptimizedPrologue(CompilationInfo* info) { |
| if (!Parser::Parse(info)) return false; |
| - info->SetStrictMode(info->function()->strict_mode()); |
| - |
| if (!Rewriter::Rewrite(info)) return false; |
| if (!Scope::Analyze(info)) return false; |
| DCHECK(info->scope() != NULL); |