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