Index: src/debug.cc |
diff --git a/src/debug.cc b/src/debug.cc |
index 7fe9064e989a1e0bd44c1102ea2b8b5025f5dc91..3029adba9d53403677ac35ed4ce05ba2ac7dfde3 100644 |
--- a/src/debug.cc |
+++ b/src/debug.cc |
@@ -1225,7 +1225,48 @@ void Debug::FloodBoundFunctionWithOneShot(Handle<JSFunction> function) { |
if (!bindee.is_null() && bindee->IsJSFunction() && |
!JSFunction::cast(*bindee)->IsFromNativeScript()) { |
Handle<JSFunction> bindee_function(JSFunction::cast(*bindee)); |
- FloodWithOneShot(bindee_function); |
+ FloodWithOneShotGeneric(bindee_function); |
+ } |
+} |
+ |
+ |
+void Debug::FloodDefaultConstructorWithOneShot(Handle<JSFunction> function) { |
+ DCHECK(function->shared()->is_default_constructor()); |
+ // Instead of stepping into the function we directly step into the super class |
+ // constructor. |
+ Isolate* isolate = function->GetIsolate(); |
+ PrototypeIterator iter(isolate, function); |
+ Handle<Object> proto = PrototypeIterator::GetCurrent(iter); |
+ if (!proto->IsJSFunction()) return; // Object.prototype |
+ Handle<JSFunction> function_proto = Handle<JSFunction>::cast(proto); |
+ FloodWithOneShotGeneric(function_proto); |
+} |
+ |
+ |
+void Debug::FloodWithOneShotGeneric(Handle<JSFunction> function, |
+ Handle<Object> holder) { |
+ if (function->shared()->bound()) { |
+ FloodBoundFunctionWithOneShot(function); |
+ } else if (function->shared()->is_default_constructor()) { |
+ FloodDefaultConstructorWithOneShot(function); |
+ } else if (!function->IsFromNativeScript()) { |
+ Isolate* isolate = function->GetIsolate(); |
+ // Don't allow step into functions in the native context. |
+ if (function->shared()->code() == |
+ isolate->builtins()->builtin(Builtins::kFunctionApply) || |
+ function->shared()->code() == |
+ isolate->builtins()->builtin(Builtins::kFunctionCall)) { |
+ // Handle function.apply and function.call separately to flood the |
+ // function to be called and not the code for Builtins::FunctionApply or |
+ // Builtins::FunctionCall. The receiver of call/apply is the target |
+ // function. |
+ if (!holder.is_null() && holder->IsJSFunction()) { |
+ Handle<JSFunction> js_function = Handle<JSFunction>::cast(holder); |
+ FloodWithOneShotGeneric(js_function); |
+ } |
+ } else { |
+ FloodWithOneShot(function); |
+ } |
} |
} |
@@ -1464,13 +1505,7 @@ void Debug::PrepareStep(StepAction step_action, |
if (fun->IsJSFunction()) { |
Handle<JSFunction> js_function(JSFunction::cast(fun)); |
- if (js_function->shared()->bound()) { |
- FloodBoundFunctionWithOneShot(js_function); |
- } else if (!js_function->IsFromNativeScript()) { |
- // Don't step into builtins. |
- // It will also compile target function if it's not compiled yet. |
- FloodWithOneShot(js_function); |
- } |
+ FloodWithOneShotGeneric(js_function); |
} |
} |
@@ -1612,32 +1647,7 @@ void Debug::HandleStepIn(Handle<Object> function_obj, Handle<Object> holder, |
// Flood the function with one-shot break points if it is called from where |
// step into was requested, or when stepping into a new frame. |
if (fp == thread_local_.step_into_fp_ || step_frame) { |
- if (function->shared()->bound()) { |
- // Handle Function.prototype.bind |
- FloodBoundFunctionWithOneShot(function); |
- } else if (!function->IsFromNativeScript()) { |
- // Don't allow step into functions in the native context. |
- if (function->shared()->code() == |
- isolate->builtins()->builtin(Builtins::kFunctionApply) || |
- function->shared()->code() == |
- isolate->builtins()->builtin(Builtins::kFunctionCall)) { |
- // Handle function.apply and function.call separately to flood the |
- // function to be called and not the code for Builtins::FunctionApply or |
- // Builtins::FunctionCall. The receiver of call/apply is the target |
- // function. |
- if (!holder.is_null() && holder->IsJSFunction()) { |
- Handle<JSFunction> js_function = Handle<JSFunction>::cast(holder); |
- if (!js_function->IsFromNativeScript()) { |
- FloodWithOneShot(js_function); |
- } else if (js_function->shared()->bound()) { |
- // Handle Function.prototype.bind |
- FloodBoundFunctionWithOneShot(js_function); |
- } |
- } |
- } else { |
- FloodWithOneShot(function); |
- } |
- } |
+ FloodWithOneShotGeneric(function, holder); |
} |
} |