Index: src/debug.cc |
diff --git a/src/debug.cc b/src/debug.cc |
index 25be003f707c06a068ec7f84813e0b8eb3790e24..dc78273dc55eef172669964f6a7bcd1a32eaeb28 100644 |
--- a/src/debug.cc |
+++ b/src/debug.cc |
@@ -785,14 +785,13 @@ bool Debug::CompileDebuggerScript(Isolate* isolate, int index) { |
// Compile the script. |
Handle<SharedFunctionInfo> function_info; |
- function_info = Compiler::Compile(source_code, |
- script_name, |
- 0, 0, |
- false, |
- context, |
- NULL, NULL, |
- Handle<String>::null(), |
- NATIVES_CODE); |
+ function_info = Compiler::CompileScript(source_code, |
+ script_name, 0, 0, |
+ false, |
+ context, |
+ NULL, NULL, |
+ Handle<String>::null(), |
+ NATIVES_CODE); |
// Silently ignore stack overflows during compilation. |
if (function_info.is_null()) { |
@@ -1871,41 +1870,6 @@ void Debug::ClearStepNext() { |
} |
-// Helper function to compile full code for debugging. This code will |
-// have debug break slots and deoptimization information. Deoptimization |
-// information is required in case that an optimized version of this |
-// function is still activated on the stack. It will also make sure that |
-// the full code is compiled with the same flags as the previous version, |
-// that is flags which can change the code generated. The current method |
-// of mapping from already compiled full code without debug break slots |
-// to full code with debug break slots depends on the generated code is |
-// otherwise exactly the same. |
-static bool CompileFullCodeForDebugging(Handle<JSFunction> function, |
- Handle<Code> current_code) { |
- ASSERT(!current_code->has_debug_break_slots()); |
- |
- CompilationInfoWithZone info(function); |
- info.MarkCompilingForDebugging(current_code); |
- ASSERT(!info.shared_info()->is_compiled()); |
- ASSERT(!info.isolate()->has_pending_exception()); |
- |
- // Use compile lazy which will end up compiling the full code in the |
- // configuration configured above. |
- bool result = Compiler::CompileLazy(&info); |
- ASSERT(result != info.isolate()->has_pending_exception()); |
- info.isolate()->clear_pending_exception(); |
-#if DEBUG |
- if (result) { |
- Handle<Code> new_code(function->shared()->code()); |
- ASSERT(new_code->has_debug_break_slots()); |
- ASSERT(current_code->is_compiled_optimizable() == |
- new_code->is_compiled_optimizable()); |
- } |
-#endif |
- return result; |
-} |
- |
- |
static void CollectActiveFunctionsFromThread( |
Isolate* isolate, |
ThreadLocalTop* top, |
@@ -2062,8 +2026,7 @@ void Debug::PrepareForBreakPoints() { |
Deoptimizer::DeoptimizeAll(isolate_); |
- Handle<Code> lazy_compile = |
- Handle<Code>(isolate_->builtins()->builtin(Builtins::kLazyCompile)); |
+ Handle<Code> lazy_compile = isolate_->builtins()->CompileUnoptimized(); |
// There will be at least one break point when we are done. |
has_break_points_ = true; |
@@ -2115,9 +2078,9 @@ void Debug::PrepareForBreakPoints() { |
function->set_code(*lazy_compile); |
function->shared()->set_code(*lazy_compile); |
} else if (kind == Code::BUILTIN && |
- (function->IsInRecompileQueue() || |
- function->IsMarkedForLazyRecompilation() || |
- function->IsMarkedForConcurrentRecompilation())) { |
+ (function->IsInOptimizationQueue() || |
+ function->IsMarkedForOptimization() || |
+ function->IsMarkedForConcurrentOptimization())) { |
// Abort in-flight compilation. |
Code* shared_code = function->shared()->code(); |
if (shared_code->kind() == Code::FUNCTION && |
@@ -2162,19 +2125,12 @@ void Debug::PrepareForBreakPoints() { |
if (!shared->code()->has_debug_break_slots()) { |
// Try to compile the full code with debug break slots. If it |
// fails just keep the current code. |
- Handle<Code> current_code(function->shared()->code()); |
- shared->set_code(*lazy_compile); |
bool prev_force_debugger_active = |
isolate_->debugger()->force_debugger_active(); |
isolate_->debugger()->set_force_debugger_active(true); |
- ASSERT(current_code->kind() == Code::FUNCTION); |
- CompileFullCodeForDebugging(function, current_code); |
+ function->ReplaceCode(*Compiler::GetCodeForDebugging(function)); |
isolate_->debugger()->set_force_debugger_active( |
prev_force_debugger_active); |
- if (!shared->is_compiled()) { |
- shared->set_code(*current_code); |
- continue; |
- } |
} |
// Keep function code in sync with shared function info. |
@@ -2287,11 +2243,10 @@ Object* Debug::FindSharedFunctionInfoInScript(Handle<Script> script, |
// will compile all inner functions that cannot be compiled without a |
// context, because Compiler::BuildFunctionInfo checks whether the |
// debugger is active. |
- if (target_function.is_null()) { |
- SharedFunctionInfo::CompileLazy(target, KEEP_EXCEPTION); |
- } else { |
- JSFunction::CompileLazy(target_function, KEEP_EXCEPTION); |
- } |
+ Handle<Code> result = target_function.is_null() |
+ ? Compiler::GetUnoptimizedCode(target) |
+ : Compiler::GetUnoptimizedCode(target_function); |
+ if (result.is_null()) return isolate_->heap()->undefined_value(); |
} |
} // End while loop. |
@@ -2315,7 +2270,7 @@ bool Debug::EnsureDebugInfo(Handle<SharedFunctionInfo> shared, |
// Ensure function is compiled. Return false if this failed. |
if (!function.is_null() && |
- !JSFunction::EnsureCompiled(function, CLEAR_EXCEPTION)) { |
+ !Compiler::EnsureCompiled(function, CLEAR_EXCEPTION)) { |
return false; |
} |
@@ -2601,6 +2556,21 @@ Handle<FixedArray> Debug::GetLoadedScripts() { |
} |
+void Debug::RecordEvalCaller(Handle<Script> script) { |
+ script->set_compilation_type(Script::COMPILATION_TYPE_EVAL); |
+ // For eval scripts add information on the function from which eval was |
+ // called. |
+ StackTraceFrameIterator it(script->GetIsolate()); |
+ if (!it.done()) { |
+ script->set_eval_from_shared(it.frame()->function()->shared()); |
+ Code* code = it.frame()->LookupCode(); |
+ int offset = static_cast<int>( |
+ it.frame()->pc() - code->instruction_start()); |
+ script->set_eval_from_instructions_offset(Smi::FromInt(offset)); |
+ } |
+} |
+ |
+ |
void Debug::AfterGarbageCollection() { |
// Generate events for collected scripts. |
if (script_cache_ != NULL) { |