Reviewers: kozyatinskiy, Yang,

Description:
Make debugger step into bound callbacks passed to Array.forEach.

BUG=chromium:450004
[email protected], [email protected]
LOG=N

Please review this at https://codereview.chromium.org/1030673002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+23, -24 lines):
  M src/array.js
  M src/collection.js
  M src/harmony-typedarray.js
  M src/macros.py
  M src/runtime/runtime.h
  M src/runtime/runtime-debug.cc
  M test/mjsunit/debug-stepin-foreach.js


Index: src/array.js
diff --git a/src/array.js b/src/array.js
index 12d2b4c22ae73127236c6e3c189a1e4eec7bf888..62f9073fb11da599746ba028c984434d08a9281e 100644
--- a/src/array.js
+++ b/src/array.js
@@ -1156,7 +1156,7 @@ function ArrayFilter(f, receiver) {
   var accumulator = new InternalArray();
   var accumulator_length = 0;
   var is_array = IS_ARRAY(array);
-  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
+  var stepping = DEBUG_IS_STEPPING();
   for (var i = 0; i < length; i++) {
     if (HAS_INDEX(array, i, is_array)) {
       var element = array[i];
@@ -1192,7 +1192,7 @@ function ArrayForEach(f, receiver) {
   }

   var is_array = IS_ARRAY(array);
-  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
+  var stepping = DEBUG_IS_STEPPING();
   for (var i = 0; i < length; i++) {
     if (HAS_INDEX(array, i, is_array)) {
       var element = array[i];
@@ -1226,7 +1226,7 @@ function ArraySome(f, receiver) {
   }

   var is_array = IS_ARRAY(array);
-  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
+  var stepping = DEBUG_IS_STEPPING();
   for (var i = 0; i < length; i++) {
     if (HAS_INDEX(array, i, is_array)) {
       var element = array[i];
@@ -1259,7 +1259,7 @@ function ArrayEvery(f, receiver) {
   }

   var is_array = IS_ARRAY(array);
-  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
+  var stepping = DEBUG_IS_STEPPING();
   for (var i = 0; i < length; i++) {
     if (HAS_INDEX(array, i, is_array)) {
       var element = array[i];
@@ -1293,7 +1293,7 @@ function ArrayMap(f, receiver) {
   var result = new $Array();
   var accumulator = new InternalArray(length);
   var is_array = IS_ARRAY(array);
-  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
+  var stepping = DEBUG_IS_STEPPING();
   for (var i = 0; i < length; i++) {
     if (HAS_INDEX(array, i, is_array)) {
       var element = array[i];
@@ -1443,7 +1443,7 @@ function ArrayReduce(callback, current) {
   }

   var receiver = %GetDefaultReceiver(callback);
- var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(callback);
+  var stepping = DEBUG_IS_STEPPING();
   for (; i < length; i++) {
     if (HAS_INDEX(array, i, is_array)) {
       var element = array[i];
@@ -1480,7 +1480,7 @@ function ArrayReduceRight(callback, current) {
   }

   var receiver = %GetDefaultReceiver(callback);
- var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(callback);
+  var stepping = DEBUG_IS_STEPPING();
   for (; i >= 0; i--) {
     if (HAS_INDEX(array, i, is_array)) {
       var element = array[i];
Index: src/collection.js
diff --git a/src/collection.js b/src/collection.js
index c8cf639f97d96c3396f463a97ad5181ac4ccc347..9868bded6b0bf2940145eb29c5d9a47f3222b4e4 100644
--- a/src/collection.js
+++ b/src/collection.js
@@ -105,7 +105,7 @@ function SetForEach(f, receiver) {

   var iterator = new SetIterator(this, ITERATOR_KIND_VALUES);
   var key;
-  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
+  var stepping = DEBUG_IS_STEPPING();
   var value_array = [UNDEFINED];
   while (%SetIteratorNext(iterator, value_array)) {
     if (stepping) %DebugPrepareStepInIfStepping(f);
@@ -247,7 +247,7 @@ function MapForEach(f, receiver) {
   }

   var iterator = new MapIterator(this, ITERATOR_KIND_ENTRIES);
-  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
+  var stepping = DEBUG_IS_STEPPING();
   var value_array = [UNDEFINED, UNDEFINED];
   while (%MapIteratorNext(iterator, value_array)) {
     if (stepping) %DebugPrepareStepInIfStepping(f);
Index: src/harmony-typedarray.js
diff --git a/src/harmony-typedarray.js b/src/harmony-typedarray.js
index c2eb452af378ca1b2b240653a2de04e06777df16..1759172ab674b931eafd5bcc87563295f5c154af 100644
--- a/src/harmony-typedarray.js
+++ b/src/harmony-typedarray.js
@@ -49,7 +49,7 @@ function NAMEForEach(f /* thisArg */) {  // length == 1
     needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
   }

-  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
+  var stepping = DEBUG_IS_STEPPING();
   for (var i = 0; i < length; i++) {
     var element = this[i];
     // Prepare break slots for debugger step in.
Index: src/macros.py
diff --git a/src/macros.py b/src/macros.py
index 324702bb3a178c7e14bbae5121e5c98554018ff7..9e809ea86fd866db1592ac5cfb49d00af74fb555 100644
--- a/src/macros.py
+++ b/src/macros.py
@@ -278,5 +278,5 @@ const ITERATOR_KIND_ENTRIES = 3;

 # Check whether debug is active.
 const DEBUG_IS_ACTIVE = (%_DebugIsActive() != 0);
-macro DEBUG_IS_STEPPING(function) = (%_DebugIsActive() != 0 && %DebugCallbackSupportsStepping(function)); -macro DEBUG_PREPARE_STEP_IN_IF_STEPPING(function) = if (DEBUG_IS_STEPPING(function)) %DebugPrepareStepInIfStepping(function);
+macro DEBUG_IS_STEPPING() = (%_DebugIsActive() != 0 && %DebugIsStepping());
+macro DEBUG_PREPARE_STEP_IN_IF_STEPPING(function) = if (DEBUG_IS_STEPPING()) %DebugPrepareStepInIfStepping(function);
Index: src/runtime/runtime-debug.cc
diff --git a/src/runtime/runtime-debug.cc b/src/runtime/runtime-debug.cc
index 553f45fa0dcafc77fd62454009b25cda828e620f..80a5078999d7c5aab7c92bd2e13aacd1dc96a713 100644
--- a/src/runtime/runtime-debug.cc
+++ b/src/runtime/runtime-debug.cc
@@ -2738,19 +2738,16 @@ RUNTIME_FUNCTION(Runtime_GetScript) {
 }


-// Check whether debugger and is about to step into the callback that is passed
+// Check whether debugger is about to step into the callback that is passed
 // to a built-in function such as Array.forEach.
-RUNTIME_FUNCTION(Runtime_DebugCallbackSupportsStepping) {
-  DCHECK(args.length() == 1);
+RUNTIME_FUNCTION(Runtime_DebugIsStepping) {
+  DCHECK(args.length() == 0);
   Debug* debug = isolate->debug();
   if (!debug->is_active() || !debug->IsStepping() ||
       debug->last_step_action() != StepIn) {
     return isolate->heap()->false_value();
   }
-  CONVERT_ARG_CHECKED(Object, callback, 0);
- // We do not step into the callback if it's a builtin or not even a function.
-  return isolate->heap()->ToBoolean(callback->IsJSFunction() &&
-                                    !JSFunction::cast(callback)->IsBuiltin());
+  return isolate->heap()->true_value();
 }


@@ -2775,7 +2772,7 @@ RUNTIME_FUNCTION(Runtime_DebugPrepareStepInIfStepping) {
   // if we do not leave the builtin.  To be able to step into the function
   // again, we need to clear the step out at this point.
   debug->ClearStepOut();
-  debug->FloodWithOneShot(fun);
+  debug->FloodWithOneShotGeneric(fun);
   return isolate->heap()->undefined_value();
 }

Index: src/runtime/runtime.h
diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h
index 9604a2a79ff6545b207de37ea6d24ba45ab3dfc4..c3c3305dfa3b239f212aa108059f7fc486037001 100644
--- a/src/runtime/runtime.h
+++ b/src/runtime/runtime.h
@@ -559,7 +559,7 @@ namespace internal {
   F(DebugConstructedBy, 2, 1)                       \
   F(DebugGetPrototype, 1, 1)                        \
   F(DebugSetScriptSource, 2, 1)                     \
-  F(DebugCallbackSupportsStepping, 1, 1)            \
+  F(DebugIsStepping, 0, 1)                          \
   F(SystemBreak, 0, 1)                              \
   F(DebugDisassembleFunction, 1, 1)                 \
   F(DebugDisassembleConstructor, 1, 1)              \
Index: test/mjsunit/debug-stepin-foreach.js
diff --git a/test/mjsunit/debug-stepin-foreach.js b/test/mjsunit/debug-stepin-foreach.js index fa728e019c11ed204a6a751e925598d3eab30ea4..c2702f794a989bc48a1099f3a1ea4d9291d6ea94 100644
--- a/test/mjsunit/debug-stepin-foreach.js
+++ b/test/mjsunit/debug-stepin-foreach.js
@@ -37,15 +37,17 @@ function listener(event, exec_state, event_data, data) {
 };

 Debug.setListener(listener);
+var bound_callback = callback.bind(null);

 debugger; // Break 0.
 [1,2].forEach(callback); // Break 1.
+[3,4].forEach(bound_callback); // Break 6.

 function callback(x) {
-  return x; // Break 2. // Break 4.
-} // Break 3. // Break 5.
+  return x; // Break 2. // Break 4. // Break 7. // Break 9.
+} // Break 3. // Break 5. // Break 8. // Break 10.

-assertNull(exception); // Break 6.
+assertNull(exception); // Break 11.
 assertEquals(expected_breaks, break_count);

 Debug.setListener(null);


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to