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.