Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index 861a34a2ce4522360310a6023daf65b4ad5797b3..7f149c8f7251142b9e69e7a145951ed8fa9cfb66 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -112,7 +112,6 @@ CompilationInfo::CompilationInfo(ParseInfo* parse_info) |
// with deoptimization support. |
if (isolate_->serializer_enabled()) EnableDeoptimizationSupport(); |
- if (isolate_->debug()->is_active()) MarkAsDebug(); |
if (FLAG_context_specialization) MarkAsContextSpecializing(); |
if (FLAG_turbo_inlining) MarkAsInliningEnabled(); |
if (FLAG_turbo_source_positions) MarkAsSourcePositionsEnabled(); |
@@ -966,26 +965,68 @@ bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { |
} |
-MaybeHandle<Code> CompileForDebugging(CompilationInfo* info) { |
+bool CompileEvalForDebugging(Handle<JSFunction> function, |
+ Handle<SharedFunctionInfo> shared) { |
+ Handle<Script> script(Script::cast(shared->script())); |
+ Handle<Context> context(function->context()); |
+ |
+ Zone zone; |
+ ParseInfo parse_info(&zone, script); |
+ CompilationInfo info(&parse_info); |
+ Isolate* isolate = info.isolate(); |
+ |
+ parse_info.set_eval(); |
+ parse_info.set_context(context); |
+ if (context->IsNativeContext()) parse_info.set_global(); |
+ parse_info.set_toplevel(); |
+ parse_info.set_allow_lazy_parsing(false); |
+ parse_info.set_language_mode(shared->language_mode()); |
+ parse_info.set_parse_restriction(NO_PARSE_RESTRICTION); |
+ info.MarkAsDebug(); |
+ |
+ VMState<COMPILER> state(info.isolate()); |
+ |
+ if (!Parser::ParseStatic(&parse_info)) { |
+ isolate->clear_pending_exception(); |
+ return false; |
+ } |
+ |
+ FunctionLiteral* lit = info.function(); |
+ LiveEditFunctionTracker live_edit_tracker(isolate, lit); |
+ |
+ if (!CompileUnoptimizedCode(&info)) { |
+ isolate->clear_pending_exception(); |
+ return false; |
+ } |
+ shared->ReplaceCode(*info.code()); |
+ return true; |
+} |
+ |
+ |
+bool CompileForDebugging(CompilationInfo* info) { |
info->MarkAsDebug(); |
- VMState<COMPILER> state(info->isolate()); |
- MaybeHandle<Code> maybe_new_code = GetUnoptimizedCodeCommon(info); |
- Handle<Code> new_code; |
- if (!maybe_new_code.ToHandle(&new_code)) { |
+ if (GetUnoptimizedCodeCommon(info).is_null()) { |
info->isolate()->clear_pending_exception(); |
+ return false; |
} |
- return maybe_new_code; |
+ return true; |
} |
-MaybeHandle<Code> Compiler::GetDebugCode(Handle<JSFunction> function) { |
- CompilationInfoWithZone info(function); |
- VMState<COMPILER> state(info.isolate()); |
- return CompileForDebugging(&info); |
+bool Compiler::CompileDebugCode(Handle<JSFunction> function) { |
+ Handle<SharedFunctionInfo> shared(function->shared()); |
+ if (shared->is_toplevel() && shared->script()->IsScript() && |
+ Script::cast(shared->script())->compilation_type() == |
+ Script::COMPILATION_TYPE_EVAL) { |
+ return CompileEvalForDebugging(function, shared); |
+ } else { |
+ CompilationInfoWithZone info(function); |
+ return CompileForDebugging(&info); |
+ } |
} |
-MaybeHandle<Code> Compiler::GetDebugCode(Handle<SharedFunctionInfo> shared) { |
+bool Compiler::CompileDebugCode(Handle<SharedFunctionInfo> shared) { |
DCHECK(shared->allows_lazy_compilation_without_context()); |
Zone zone; |
ParseInfo parse_info(&zone, shared); |
@@ -1120,8 +1161,6 @@ static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { |
live_edit_tracker.RecordFunctionInfo(result, lit, info->zone()); |
} |
- isolate->debug()->OnAfterCompile(script); |
- |
return result; |
} |
@@ -1142,8 +1181,9 @@ MaybeHandle<JSFunction> Compiler::GetFunctionFromEval( |
line_offset); |
Handle<SharedFunctionInfo> shared_info; |
+ Handle<Script> script; |
if (!maybe_shared_info.ToHandle(&shared_info)) { |
- Handle<Script> script = isolate->factory()->NewScript(source); |
+ script = isolate->factory()->NewScript(source); |
if (!script_name.is_null()) { |
script->set_name(*script_name); |
script->set_line_offset(Smi::FromInt(line_offset)); |
@@ -1159,8 +1199,6 @@ MaybeHandle<JSFunction> Compiler::GetFunctionFromEval( |
parse_info.set_parse_restriction(restriction); |
parse_info.set_context(context); |
- // If we eval from debug code, compile for debugging as well. |
- if (outer_info->HasDebugCode()) info.MarkAsDebug(); |
Debug::RecordEvalCaller(script); |
shared_info = CompileToplevel(&info); |
@@ -1184,8 +1222,16 @@ MaybeHandle<JSFunction> Compiler::GetFunctionFromEval( |
shared_info->ResetForNewContext(isolate->heap()->global_ic_age()); |
} |
- return isolate->factory()->NewFunctionFromSharedFunctionInfo( |
- shared_info, context, NOT_TENURED); |
+ Handle<JSFunction> result = |
+ isolate->factory()->NewFunctionFromSharedFunctionInfo( |
+ shared_info, context, NOT_TENURED); |
+ |
+ // OnAfterCompile has to be called after we create the JSFunction, which we |
+ // may require to recompile the eval for debugging, if we find a function |
+ // that contains break points in the eval script. |
+ isolate->debug()->OnAfterCompile(script); |
+ |
+ return result; |
} |
@@ -1307,7 +1353,11 @@ Handle<SharedFunctionInfo> Compiler::CompileScript( |
} |
} |
- if (result.is_null()) isolate->ReportPendingMessages(); |
+ if (result.is_null()) { |
+ isolate->ReportPendingMessages(); |
+ } else { |
+ isolate->debug()->OnAfterCompile(script); |
+ } |
} else if (result->ic_age() != isolate->heap()->global_ic_age()) { |
result->ResetForNewContext(isolate->heap()->global_ic_age()); |
} |
@@ -1332,7 +1382,9 @@ Handle<SharedFunctionInfo> Compiler::CompileStreamedScript( |
// If compiling for debugging, parse eagerly from scratch. |
if (compile_info.is_debug()) parse_info->set_literal(NULL); |
- return CompileToplevel(&compile_info); |
+ Handle<SharedFunctionInfo> result = CompileToplevel(&compile_info); |
+ if (!result.is_null()) isolate->debug()->OnAfterCompile(script); |
+ return result; |
} |