Index: src/debug.cc |
diff --git a/src/debug.cc b/src/debug.cc |
index 6521110a61dc61ebb12271ed7a4bdbd1be2ea08d..9d31beef0ae80e392bbae40ce83b2043426797cb 100644 |
--- a/src/debug.cc |
+++ b/src/debug.cc |
@@ -1894,6 +1894,23 @@ static void RecompileAndRelocateSuspendedGenerators( |
} |
+static bool SkipSharedFunctionInfo(SharedFunctionInfo* shared, |
+ Object* active_code_marker) { |
+ if (!shared->allows_lazy_compilation()) return true; |
+ if (!shared->script()->IsScript()) return true; |
+ Object* script = shared->script(); |
+ if (!script->IsScript()) return true; |
+ if (Script::cast(script)->type()->value() == Script::TYPE_NATIVE) return true; |
+ Code* shared_code = shared->code(); |
+ return shared_code->gc_metadata() == active_code_marker; |
+} |
+ |
+ |
+static inline bool HasDebugBreakSlots(Code* code) { |
+ return code->kind() == Code::FUNCTION && code->has_debug_break_slots(); |
+} |
+ |
+ |
void Debug::PrepareForBreakPoints() { |
// If preparing for the first break point make sure to deoptimize all |
// functions as debugging does not work with optimized code. |
@@ -1959,35 +1976,21 @@ void Debug::PrepareForBreakPoints() { |
if (obj->IsJSFunction()) { |
JSFunction* function = JSFunction::cast(obj); |
SharedFunctionInfo* shared = function->shared(); |
- |
- if (!shared->allows_lazy_compilation()) continue; |
- if (!shared->script()->IsScript()) continue; |
- if (function->IsFromNativeScript()) continue; |
- if (shared->code()->gc_metadata() == active_code_marker) continue; |
- |
+ if (SkipSharedFunctionInfo(shared, active_code_marker)) continue; |
if (shared->is_generator()) { |
generator_functions.Add(Handle<JSFunction>(function, isolate_)); |
continue; |
} |
- |
+ if (HasDebugBreakSlots(function->code())) continue; |
+ Code* fallback = HasDebugBreakSlots(shared->code()) ? shared->code() |
+ : *lazy_compile; |
Code::Kind kind = function->code()->kind(); |
- if (kind == Code::FUNCTION && |
- !function->code()->has_debug_break_slots()) { |
- function->ReplaceCode(*lazy_compile); |
- function->shared()->ReplaceCode(*lazy_compile); |
- } else if (kind == Code::BUILTIN && |
- (function->IsInOptimizationQueue() || |
- function->IsMarkedForOptimization() || |
- function->IsMarkedForConcurrentOptimization())) { |
- // Abort in-flight compilation. |
- Code* shared_code = function->shared()->code(); |
- if (shared_code->kind() == Code::FUNCTION && |
- shared_code->has_debug_break_slots()) { |
- function->ReplaceCode(shared_code); |
- } else { |
- function->ReplaceCode(*lazy_compile); |
- function->shared()->ReplaceCode(*lazy_compile); |
- } |
+ if (kind == Code::FUNCTION || |
+ (kind == Code::BUILTIN && // Abort in-flight compilation. |
+ (function->IsInOptimizationQueue() || |
+ function->IsMarkedForOptimization() || |
+ function->IsMarkedForConcurrentOptimization()))) { |
+ function->ReplaceCode(fallback); |
} |
} else if (obj->IsJSGeneratorObject()) { |
JSGeneratorObject* gen = JSGeneratorObject::cast(obj); |
@@ -2007,6 +2010,12 @@ void Debug::PrepareForBreakPoints() { |
gen->set_continuation(code_offset); |
suspended_generators.Add(Handle<JSGeneratorObject>(gen, isolate_)); |
+ } else if (obj->IsSharedFunctionInfo()) { |
+ SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj); |
+ if (SkipSharedFunctionInfo(shared, active_code_marker)) continue; |
+ if (shared->is_generator()) continue; |
+ if (HasDebugBreakSlots(shared->code())) continue; |
+ shared->ReplaceCode(*lazy_compile); |
} |
} |