| 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);
|
| }
|
| }
|
|
|
|
|